C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Metafileを変数に格納して使用したいが・・・


(過去ログ 104 を表示中)

[トピック内 22 記事 (1 - 20 表示)]  << 0 | 1 >>

■62089 / inTopicNo.1)  Metafileを変数に格納して使用したいが・・・
  
□投稿者/ やんまー (97回)-(2011/09/21(Wed) 02:00:55)

分類:[VB.NET/VB2005 以降] 


richtextboxから画像をクリップボードに格納して、
更にArraylistにaddしておいてあとから取り出す処理をしたいと思いました。

Richtextboxからクリップボードに入れるにはSystem.Drawing.Imaging.Metafileで取るしか無いので
http://dobon.net/vb/dotnet/graphics/getclipboardmetafile.html
の方法を使いArraylistにAddするシンプルなテストをしてみました。

こんな感じで追加
arraylist.Add(GetEnhMetafileOnClipboard(Me.Handle))


で、pictureboxに表示してみました。

pictureBox1.Image = arraylist(i)


しかし、この方法だと、一番最後に取得したものしかpictureboxにセットできませんでした。

Richtextboxの画像をArraylistに個別に格納するにはどうしたらよいでしょうか?

System.Drawing.Imaging.Metafileがど言うことなのかよくわからないのですが、
System.Drawing.Bitmapにキャスト出来れば??とも思うのですが、
CTYPE( meta , System.Drawing.Bitmap )
とやってもエラーとなりました。。。


または、ちょっと強引な方法でもいいので何かヒントをお願いいたします
引用返信 編集キー/
■62091 / inTopicNo.2)  Re[1]: Metafileを変数に格納して使用したいが・・・
□投稿者/ shu (998回)-(2011/09/21(Wed) 07:35:40)
2011/09/21(Wed) 07:51:34 編集(投稿者)

No62089 (やんまー さん) に返信

クリップボードへ入れる処理(操作)をどのように行っているかだと思います。


>
> richtextboxから画像をクリップボードに格納して、
> 更にArraylistにaddしておいてあとから取り出す処理をしたいと思いました。
今回の話題と関係ないですが、ArrayListよりList(Of Image)またはList(Of Metafile)を使用されたほうがよいと思います。
List(Of )がない環境であればしょうがないですが。


引用返信 編集キー/
■62092 / inTopicNo.3)  Re[2]: Metafileを変数に格納して使用したいが・・・
□投稿者/ Hongliang (806回)-(2011/09/21(Wed) 08:51:51)
> pictureBox1.Image = arraylist(i)
なんかのイベントハンドラ内でループさせてる、とか無いですよね?
一応この周辺のコード&やりたいこともあると問題点が明らかにできるかもしれません。

> System.Drawing.Imaging.Metafileがど言うことなのかよくわからないのですが、
> System.Drawing.Bitmapにキャスト出来れば??とも思うのですが、
Bitmap は、ピクセル毎の色情報を保持する形式です。
それに対し Metafile はベクタ画像と呼ばれる形式です。Graphics の DrawLine とか FillRectangle とかそういう命令そのものを保存しておいて、実際に描画されるときに命令を順番にこなしていきます。拡大縮小に対して強いというメリットがあります(まあ元がビットマップ画像なら意味はないんですが)。
Bitmap オブジェクトにしたいのなら、新しく Bitmap オブジェクトを作ってそれに対して Graphics.DrawImage することになります。が、特定フォーマットでファイルに保存するのでもない限りあんまり必然性はないような?
引用返信 編集キー/
■62095 / inTopicNo.4)  Re[3]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (98回)-(2011/09/21(Wed) 09:54:51)
shu さん
Hongliang さん

畏れ入ります!

このようになっています。

ArryListに5個追加すると、5個め(arl(4))のみ画像の表示ができます。
Button3Clickの内容確認を実行しても
(0) System.Drawing.Imaging.Metafile
(1) System.Drawing.Imaging.Metafile
(2) System.Drawing.Imaging.Metafile
(3) System.Drawing.Imaging.Metafile
(4) System.Drawing.Imaging.Metafile
となりますので、ちゃんと入っていると思うのですが・・・


	Dim arl As ArrayList = New ArrayList

	'追加
	Sub Button2Click(sender As Object, e As EventArgs)
		Dim data As IDataObject = Clipboard.GetDataObject()
		'クリップボードにデータがあるか調べる
		If data IsNot Nothing Then
			'MetaFilePict形式でデータをMemoryStreamとして取得する
			Dim ms As System.IO.MemoryStream = _
				DirectCast(data.GetData("MetaFilePict"), System.IO.MemoryStream)
			If Not ms Is Nothing Then
				'Imageオブジェクトに変換する
				Debug.Print("get image!")
				 arl.Add(GetEnhMetafileOnClipboard(Me.Handle))
			Else
				Debug.Print("not image.")
			End If
		End If
	End Sub


	Function GetEnhMetafileOnClipboard( _
		ByVal hWnd As IntPtr) As System.Drawing.Imaging.Metafile
		Dim meta As System.Drawing.Imaging.Metafile = Nothing
		If OpenClipboard(hWnd) Then
			Try
				If IsClipboardFormatAvailable(CF_ENHMETAFILE) <> 0 Then
					Dim hmeta As IntPtr = GetClipboardData(CF_ENHMETAFILE)
					meta = New System.Drawing.Imaging.Metafile(hmeta, True)
				End If
			Catch ex as Exception
				Debug.Print(ex.Message)
			Finally
				CloseClipboard()
			End Try
		End If
		
		Return meta
	End Function
	
	'内容確認
	Sub Button3Click(sender As Object, e As EventArgs)
		For i As Integer = 0 To arl.Count -1
			Debug.Print( "(" & i & ") " &  arl(i).GetType.tostring )
			
		Next
	End Sub
	
	'表示
	Sub Button4Click(sender As Object, e As EventArgs)
		pictureBox1.Image = arl(numericUpDown1.Value)
	End Sub	

引用返信 編集キー/
■62096 / inTopicNo.5)  Re[2]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (99回)-(2011/09/21(Wed) 10:01:19)
shu さん
> 今回の話題と関係ないですが、ArrayListよりList(Of Image)またはList(Of Metafile)を使用されたほうがよいと思います。
> List(Of )がない環境であればしょうがないですが。


実はテキストを入れたり画像を入れたりしたいんです。。

AllayList(0) ... text
AllayList(1) ... Bitmap
AllayList(2) ... Bitmap
AllayList(4) ... text

で引数をしていするとTypeOfを使ってPictureBoxに表示するかLabelに表示するかを場合分けして表示します。

If TypeOf( aa(numericUpDown1.Value) ) Is System.Drawing.Bitmap Then

・・・
Else If TypeOf( aa(numericUpDown1.Value) ) Is System.String Then

・・・
end if
引用返信 編集キー/
■62097 / inTopicNo.6)  Re[4]: Metafileを変数に格納して使用したいが・・・
□投稿者/ shu (1000回)-(2011/09/21(Wed) 10:01:25)
No62095 (やんまー さん) に返信

クリップボードからの取得だけでなく格納している部分が
ないとなんとも言えないです。提示された内容がすべてなら
クリップボードの内容が変わらないので同じ内容が入るのは当たり前です。
引用返信 編集キー/
■62099 / inTopicNo.7)  Re[5]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (100回)-(2011/09/21(Wed) 10:49:22)
No62097 (shu さん) に返信
> ■No62095 (やんまー さん) に返信
>
> クリップボードからの取得だけでなく格納している部分が
> ないとなんとも言えないです。提示された内容がすべてなら
> クリップボードの内容が変わらないので同じ内容が入るのは当たり前です。

テストですので、
クリップボードは
RichtextBoxの上で手動でctrl+Cでやっています。

そのままペイントに貼り付けるとちゃんと張り付くのでクリップボードには入っていると思います。。。
(ここがちがうのかな??)
引用返信 編集キー/
■62100 / inTopicNo.8)  Re[6]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (101回)-(2011/09/21(Wed) 12:01:33)
あと、もしできたら、RichTextBoxの完全な保存が出来れば・・・と思います。

以下のようにRTFから読み込むとDeviceIndependentBitmapが消えてしまいます。



Jtrim→RichTextBox貼付け→クリップボードクリア→RichTextBoxからコピー

DeviceIndependentBitmap
Embedded Object
Object Descriptor
MetaFilePict
Rich Text Format
Rich Text Format Without Objects


RichTextBoxにRTFで読み込み→画像部分を選択コピー

MetaFilePict
Embedded Object
Object Descriptor
Rich Text Format
Rich Text Format Without Objects



保存と読み込みはこのようにしています。

	Sub Button7Click(sender As Object, e As EventArgs)
		richTextBox1.SaveFile("tmp.rtf" , RichTextBoxStreamType.RichText)
	End Sub
	
	Sub Button8Click(sender As Object, e As EventArgs)
		richTextBox1.LoadFile("tmp.rtf" , RichTextBoxStreamType.RichText)
	End Sub

引用返信 編集キー/
■62101 / inTopicNo.9)  Re[7]: Metafileを変数に格納して使用したいが・・・
□投稿者/ 魔界の仮面弁士 (2358回)-(2011/09/21(Wed) 12:45:32)
No62100 (やんまー さん) に返信
> あと、もしできたら、RichTextBoxの完全な保存が出来れば・・・と思います。
RichTextBox に表示している内容そのものの永続化なら、
rtf プロパティまたは SaveFile メソッドということになります。


> DeviceIndependentBitmapが消えてしまいます。
消えてしまうと、何か問題があるのでしょうか?

デバイス依存ビットマップに限らず、RichTextBox を経由する時点で、
いくつかの画像情報が失われたり、あるいは変化する可能性があります。


たとえば「テキスト形式」「リッチテキスト形式」「HTML 形式」の 3 種類が
クリップボードにあったとして、それを『メモ帳』に貼り付けてから、
それをクリップボードにコピーしなおす場合を考えてみてください。
リッチテキストや HTML の情報は失われることになりますよね。

あるいは、「テキスト形式」「Unicode テキスト形式」「OEM テキスト形式」が
コピーされていて、それを Word に貼ってから再コピーした場合はどうでしょう。
新たに書式付テキストの情報が付与されることになるかと思います。

また、ペイントからコピーした画像にしても、画面の色数設定が 256 色になっている場合と、
フルカラー設定になっている場合とでは、コピー後の結果は変わってしまう可能性があります。


結局のところ、ペースト前の情報と再コピー後の情報の一致制というのは、
アプリケーションあるいはコントロールの仕様に依存しています。
コピー後のほうが情報量が増えることもあれば、減ることもあるでしょう。
(それでなくとも RichTextBox は、OS によって仕様が微妙に異なることがありますし)


何が目的なのかはっきりしないのですが、クリップボードの内容を RTF 内に永続化させることが
どうしても必要なら、クリップボードの中身を、すべてバイナリとして保存しておき、
それをRichTextBox 内に OLE 埋め込みするぐらいでしょうか。とはいえ、.NET 版の
RichTextBox には、OLE 埋め込みを操作するためのメソッドが実装されていないので、
これもあまり良い方法ではなさそうです。
引用返信 編集キー/
■62102 / inTopicNo.10)  Re[8]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (102回)-(2011/09/21(Wed) 13:14:03)
魔界の仮面弁士 さん

畏れ入ります。


>>DeviceIndependentBitmapが消えてしまいます。
> 消えてしまうと、何か問題があるのでしょうか?


まず、これって永続化できてない、ってことですよね・・・

DeviceIndependentBitmapがある状態ならば、
 Dim img As Image = Clipboard.GetImage()
であっさりとイメージ(System.Drawing.Bitmap)が取得できますので、
消えてしまうことに問題を感じています。



> 何が目的なのかはっきりしないのですが、クリップボードの内容を RTF 内に永続化させることが
> どうしても必要なら、クリップボードの中身を、すべてバイナリとして保存しておき、
> それをRichTextBox 内に OLE 埋め込みするぐらいでしょうか。とはいえ、.NET 版の
> RichTextBox には、OLE 埋め込みを操作するためのメソッドが実装されていないので、
> これもあまり良い方法ではなさそうです。


目的は
「RichTextBoxの要素(画像とテキスト)をArraylistに格納して、ArrayListの要素をLabelやPictureBoxに取り出す」
ということです。

RTF 内に永続化が目的ではなく、↑のような理由で、そもそも永続化できれば
Bitmapで取れるのに、、、という意味でした。
引用返信 編集キー/
■62103 / inTopicNo.11)  Re[3]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (103回)-(2011/09/21(Wed) 14:16:51)
Hongliang さん

> が、特定フォーマットでファイルに保存するのでもない限りあんまり必然性はないような?

ですよね・・・しかし現実的に上手くいかないのです・・・



> Bitmap オブジェクトにしたいのなら、新しく Bitmap オブジェクトを作ってそれに対して Graphics.DrawImage することになります。


恐れ入りますが、これってどうやるのでしょうか?

pictureboxをひとつ作って、paintメソッドでe.Graphics.DrawImage とやるのでしょうか?
(いろいろ検索したり、本を見たりしているのですが、そんなサンプルしか見つけられませんでした・・・)


ちなみに強引な方法として、一度ファイルに落とすという方法をやってみたところ、上手くいきました。

pictureboxをつくって・・・


pictureBox1.Image = GetEnhMetafileOnClipboard(Me.Handle)

pictureBox1.Image.Save( "tmp.bmp" )

Dim img as Image = Image.FromFile("tmp.bmp")

arl.Add( img )
引用返信 編集キー/
■62104 / inTopicNo.12)  Re[1]: Metafileを変数に格納して使用したいが・・・
□投稿者/ shu (1001回)-(2011/09/21(Wed) 14:18:51)
No62089 (やんまー さん) に返信

> で、pictureboxに表示してみました。
> ↓
> pictureBox1.Image = arraylist(i)
ひょっとして
For i = 0 to arraylist.count-1
pictureBox1.Image = arraylist(i)
next
とか書いてます?pictureBoxの中にならべて描画したいのなら
Paintイベントとかで座標ずらしながらDrawImageするといいですよ?

引用返信 編集キー/
■62105 / inTopicNo.13)  Re[2]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (104回)-(2011/09/21(Wed) 14:37:10)
No62104 (shu さん) に返信
> ■No62089 (やんまー さん) に返信
>
>>で、pictureboxに表示してみました。
>>↓
>>pictureBox1.Image = arraylist(i)
> ひょっとして
> For i = 0 to arraylist.count-1
> pictureBox1.Image = arraylist(i)
> next
> とか書いてます?pictureBoxの中にならべて描画したいのなら
> Paintイベントとかで座標ずらしながらDrawImageするといいですよ?
>

そうじゃないです。
表示確認はnumericUpDownをつかって、Arraylistの何番目に何が入っているかを確認しています。

そうすると最後に追加したものだけが表示されて
その前のものは何も表示されないのです。。。

あ、今、Bitmapに強引に変換して(一度ファイルに落として・・・)addしたやり方にしたら
ちゃんとそれぞれの画像が表示されました。

何が起こっているのか・・・気になります・・・

引用返信 編集キー/
■62106 / inTopicNo.14)  Re[3]: Metafileを変数に格納して使用したいが・・・
□投稿者/ shu (1002回)-(2011/09/21(Wed) 14:46:39)
No62105 (やんまー さん) に返信
> ■No62104 (shu さん) に返信
>>■No62089 (やんまー さん) に返信
>>
> >>で、pictureboxに表示してみました。
> >>↓
> >>pictureBox1.Image = arraylist(i)
>>ひょっとして
>>For i = 0 to arraylist.count-1
>> pictureBox1.Image = arraylist(i)
>>next
>>とか書いてます?pictureBoxの中にならべて描画したいのなら
>>Paintイベントとかで座標ずらしながらDrawImageするといいですよ?
>>
>
> そうじゃないです。
> 表示確認はnumericUpDownをつかって、Arraylistの何番目に何が入っているかを確認しています。
>
> そうすると最後に追加したものだけが表示されて
> その前のものは何も表示されないのです。。。
>
> あ、今、Bitmapに強引に変換して(一度ファイルに落として・・・)addしたやり方にしたら
> ちゃんとそれぞれの画像が表示されました。
>
> 何が起こっているのか・・・気になります・・・

Handleにくっついてオブジェクトが変わってしまうということですかね。GetEnhMetafileOnClipboard
で取得したオブジェクトをCloneしてみたらどうでしょう?

引用返信 編集キー/
■62107 / inTopicNo.15)  Re[9]: Metafileを変数に格納して使用したいが・・・
□投稿者/ 魔界の仮面弁士 (2359回)-(2011/09/21(Wed) 14:46:42)
No62102 (やんまー さん) に返信
> 「RichTextBoxの要素(画像とテキスト)をArraylistに格納して、ArrayListの要素をLabelやPictureBoxに取り出す」
> ということです。
PictureBox に画像を表示するなら、メタファイルのままでも良いのでは?
Metafile も Bitmap も、どちらも Image クラスですよね。


> まず、これって永続化できてない、ってことですよね・・・
クリップボードの内容をすべて永続化させたいなら、RichTextBox 等を介さず、
すべて自前で永続化すべきです。

RichTextBox にしろ他の多くのアプリケーションにしろ、クリップボード内の
すべての形式を貼り付け動作に使うわけではありません。一般的には、
それぞれの形式に優先順位をつけ、最初に見つかった形式のみが採用されます。

たとえば、リッチテキスト形式の"あいうえお"と、テキスト形式の "かきくけこ" が
同時にクリップボードに格納されていた場合、wordpad に貼りつくのは前者、
notepad に貼りつくのは後者となります。どちらか一方の情報は失われます。
(テキスト形式のみが格納されていた場合、wordpad はそれを採用します)


RichTextBox も同様で、複数の画像形式が格納されていたとしても、
そのすべてが貼り付くわけでは無いはずです。
(bmp, dib, wmf, emf 等々、どの形式が優先順位が高いのかは調べていませんが)


> DeviceIndependentBitmapがある状態ならば、
>  Dim img As Image = Clipboard.GetImage()
> であっさりとイメージ(System.Drawing.Bitmap)が取得できますので、
メタファイルではなく、ビットマップ形式での保存に拘るのは、
何か理由があるのでしょうか?

永続化が必要なら、メタファイルのまま Save することもできそうですし、
Bitmap 化が必要なら、DrawImage するという手もありそうですけれども。


> 消えてしまうことに問題を感じています。
手元に開発環境がないので、こちらでは試せませんが:

まず、DIB がペースト可能かどうかを調べてみてください。
クリップボード内のデータを DIB だけにしてから、リッチテキストボックスに
貼り付け動作を行えば、DIB を貼れるかどうかがわかると思います。

貼れないなら、そもそも DIB が非対応ということになるでしょう。
もし貼れるなら、今度はそれを再コピーした時に、クリップボードに渡される
画像形式の種類が何と何になるのかを調べてみてはいかがでしょう。
引用返信 編集キー/
■62108 / inTopicNo.16)  Re[4]: Metafileを変数に格納して使用したいが・・・
□投稿者/ 魔界の仮面弁士 (2360回)-(2011/09/21(Wed) 14:52:47)
No62103 (やんまー さん) に返信
> ちなみに強引な方法として、一度ファイルに落とすという方法をやってみたところ、上手くいきました。
> pictureBox1.Image = GetEnhMetafileOnClipboard(Me.Handle)
> pictureBox1.Image.Save( "tmp.bmp" )

EnhMetafile なら、拡張子は通常 .emf ですよ。

まぁ、ファイル名や拡張子が何であっても、画像のバイナリ形式さえ正しければ、
画像の読み込みは成功するでしょうけれども。
引用返信 編集キー/
■62109 / inTopicNo.17)  Re[10]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (105回)-(2011/09/21(Wed) 15:20:55)
魔界の仮面弁士 さん


畏れ入ります。


>>「RichTextBoxの要素(画像とテキスト)をArraylistに格納して、ArrayListの要素をLabelやPictureBoxに取り出す」
>>ということです。
> PictureBox に画像を表示するなら、メタファイルのままでも良いのでは?
> Metafile も Bitmap も、どちらも Image クラスですよね。


おっしゃるとおり、いいと思ったのです。
しかし、BitmapでAddしたものは全部残っているのに、MetafileでAddしたものは最後のものしか残っていませんでした。

ここで「残っている」、といっているのはpictureboxに画像として表示できるかどうか、ということです。

GetTypeでみればちゃんと全部にSystem.Drawing.Imaging.Metafileがセットされているように見えるのですが。

>
>
>>まず、これって永続化できてない、ってことですよね・・・
> クリップボードの内容をすべて永続化させたいなら、RichTextBox 等を介さず、
> すべて自前で永続化すべきです。
>
> RichTextBox にしろ他の多くのアプリケーションにしろ、クリップボード内の
> すべての形式を貼り付け動作に使うわけではありません。一般的には、
> それぞれの形式に優先順位をつけ、最初に見つかった形式のみが採用されます。
>
> たとえば、リッチテキスト形式の"あいうえお"と、テキスト形式の "かきくけこ" が
> 同時にクリップボードに格納されていた場合、wordpad に貼りつくのは前者、
> notepad に貼りつくのは後者となります。どちらか一方の情報は失われます。
> (テキスト形式のみが格納されていた場合、wordpad はそれを採用します)
>
>
> RichTextBox も同様で、複数の画像形式が格納されていたとしても、
> そのすべてが貼り付くわけでは無いはずです。
> (bmp, dib, wmf, emf 等々、どの形式が優先順位が高いのかは調べていませんが)



誤解を与えてしまっていたら申し訳ありません。
クリップボードを永続化したいわけではないです。
あくまでもRichTextBoxの内容です。

どこかからコピーしてきてRichTextBoxに貼りつけたあと、その画像をもう一度コピーした場合と
RTFからRichTextBoxに読み込んだ場合の画像のコピーと、
なぜ違うものになるのか、ということが不思議です。

これはどちらも操作方法は違いますが、
「RichTextBoxからのコピー」という意味では同じですよね。。。



>>DeviceIndependentBitmapがある状態ならば、
>> Dim img As Image = Clipboard.GetImage()
>>であっさりとイメージ(System.Drawing.Bitmap)が取得できますので、
> メタファイルではなく、ビットマップ形式での保存に拘るのは、
> 何か理由があるのでしょうか?
>



BitmapでAddしたものは全部残っているのに、MetafileでAddしたものは最後のものしか残ってい無いという現象が起きたからです。




> 永続化が必要なら、メタファイルのまま Save することもできそうですし、
> Bitmap 化が必要なら、DrawImage するという手もありそうですけれども。


すいません。
永続化はどちらでもよくて、画像がArrayListにセットできて、あとからpictureboxに表示できる形で渡せれば良いです。

DrawImageする方法はHongliang さんにも提案されましたが、
私の理解不足でよくわかりませんでした。手元の書籍でも調べたのですが・・・

で、こんな変なやり方であればなんとかなりました。一度ファイルに書くなんてすごくださいやり方ですが・・・

pictureBox1.Image = GetEnhMetafileOnClipboard(Me.Handle)
pictureBox1.Image.Save( "tmp.bmp" )
Dim img as Image = Image.FromFile("tmp.bmp")
arl.Add( img )



>>消えてしまうことに問題を感じています。
> 手元に開発環境がないので、こちらでは試せませんが:
>
> まず、DIB がペースト可能かどうかを調べてみてください。
> クリップボード内のデータを DIB だけにしてから、リッチテキストボックスに
> 貼り付け動作を行えば、DIB を貼れるかどうかがわかると思います。
>
> 貼れないなら、そもそも DIB が非対応ということになるでしょう。
> もし貼れるなら、今度はそれを再コピーした時に、クリップボードに渡される
> 画像形式の種類が何と何になるのかを調べてみてはいかがでしょう。


DeviceIndependentBitmapだけにする方法がわからないのですが、
おそらくあってもなくても張り付きます。

しかし、DeviceIndependentBitmapがある場合には
Dim img As Image = Clipboard.GetImage()で
System.Drawing.Bitmap が取得でき、問題はなくなります。

引用返信 編集キー/
■62110 / inTopicNo.18)  Re[11]: Metafileを変数に格納して使用したいが・・・
□投稿者/ Hongliang (807回)-(2011/09/21(Wed) 15:38:39)
No62108 (魔界の仮面弁士 さん) に返信
> EnhMetafile なら、拡張子は通常 .emf ですよ。
>
> まぁ、ファイル名や拡張子が何であっても、画像のバイナリ形式さえ正しければ、
> 画像の読み込みは成功するでしょうけれども。
そもそも、Image.Save でメタファイル形式で保存することはできないはずです。
// ImageFormat 省略したら png だし。
Metafile のコンストラクタで保存先の Stream なりパスなり渡して、DrawImage 後に Dispose してやるしかないはず。


No62109 (やんまー さん) に返信
No62106 で shu さんが提案されている、Clone を使うのはどうでしたか?
引用返信 編集キー/
■62111 / inTopicNo.19)  Re[4]: Metafileを変数に格納して使用したいが・・・
□投稿者/ やんまー (106回)-(2011/09/21(Wed) 15:56:31)
shu さん


> Handleにくっついてオブジェクトが変わってしまうということですかね。GetEnhMetafileOnClipboard
> で取得したオブジェクトをCloneしてみたらどうでしょう?
>

おおお!
うまくいきました

こうしただけです↓

Dim clon As Image = GetEnhMetafileOnClipboard(Me.Handle).Clone
arl.Add(clon)



今これ書いてたら、停電しました 汗



引用返信 編集キー/
■62112 / inTopicNo.20)  Re[12]: Metafileを変数に格納して使用したいが・・・
 
□投稿者/ やんまー (107回)-(2011/09/21(Wed) 16:15:37)
Hongliang さん

> No62106 で shu さんが提案されている、Clone を使うのはどうでしたか?



うまくいきましたよ!


ところで
DrawImageする方法が私の理解不足でよくわかりませんでした。
手元の書籍でも調べたのですが・・・

一度ファイルに書くなんてすごくださいやり方ですが、こんなやり方なら出来ました。

pictureBox1.Image = GetEnhMetafileOnClipboard(Me.Handle)
pictureBox1.Image.Save( "tmp.bmp" )
Dim img as Image = Image.FromFile("tmp.bmp")
arl.Add( img )
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -