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

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

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

Re[7]: 拡張メタファイルの取得


(過去ログ 107 を表示中)

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

■63910 / inTopicNo.1)  拡張メタファイルの取得
  
□投稿者/ NYON (1回)-(2012/10/26(Fri) 19:39:31)

分類:[C#] 

はじめまして。

Visual stadio 2008 C#を使って開発をしております。

Office Excel 2003のSheetに貼り付けられている画像を
開発exeのPictureBoxにドラッグすることで画像を表示したいと考えているのですが、
引数のe.Dataをどう使うことで画像表示できるのかがわかりません。

お手数ですが、
皆様のお知恵を拝借させていただきたく思っています。
よろしくお願い致します。


-----サンプル-----
private void PictureBox_DragDrop(object sender, DragEventArgs e)
{
 if (e.Data.GetDataPresent(DataFormats.EnhancedMetafile))
 {
  //ここでPictureBoxに画像を表示したい。
  // (例)PictureBox.Load();
  // (例)PictureBox.Image = ;

  //以下、試した事。
  //e.Data.GetData("Office Drawing Shape Format");--->取得したバイナリデータが全て0。
  //e.Data.GetData("MetaFilePict");--->戻り値がnullとなる。
  //e.Data.GetData("EnhancedMetafile");--->戻り値がnullとなる。
  //e.Data.GetData("PNG");--->戻り値がnullとなる。
  //e.Data.GetData("System.Drawing.Bitmap");--->戻り値がnullとなる。
  //e.Data.GetData("Bitmap");--->戻り値がnullとなる。
 }
}
引用返信 編集キー/
■63913 / inTopicNo.2)  Re[1]: 拡張メタファイルの取得
□投稿者/ 藤野 (2回)-(2012/10/27(Sat) 23:45:51)
2012/10/27(Sat) 23:48:39 編集(投稿者)

http://dobon.net/vb/dotnet/graphics/getclipboardmetafile.html

こちらのサイトにとり方が紹介されています。
引用返信 編集キー/
■63914 / inTopicNo.3)  Re[2]: 拡張メタファイルの取得
□投稿者/ NYON (3回)-(2012/10/29(Mon) 09:11:42)
藤野様、返信が遅くなり大変申し訳ありません。

この度はご回答ありがとうございます。

紹介されたサイトを参考に、以下サンプルのようにしてみましたが、
格納再先のImageがnullとなってしまい、画像を抽出できませんでした。

原因、または他の取得方法などがありましたらよろしくお願い致します。

-----サンプル-----
private void PictureBox_DragDrop(object sender, DragEventArgs e)
{
 if (e.Data.GetDataPresent(DataFormats.EnhancedMetafile))
 {
  Image ImageTest = e.Data.GetData("DataFormats.EnhancedMetafile");
 }
}
引用返信 編集キー/
■63915 / inTopicNo.4)  Re[3]: 拡張メタファイルの取得
□投稿者/ Hongliang (8回)-(2012/10/29(Mon) 09:16:10)
いやそれ記事冒頭で否定とともに書かれてるコードですよね……。
もうちょっと記事をよくお読みください。
引用返信 編集キー/
■63916 / inTopicNo.5)  Re[4]: 拡張メタファイルの取得
□投稿者/ NYON (4回)-(2012/10/29(Mon) 09:26:39)
申し訳ありません。

両方試したのですが、間違った方を記載してしましました。

以下も試しております。
記載足らずで申し訳ありませんでした。

(1)
//msがnullとなる。
System.IO.MemoryStream ms = (System.IO.MemoryStream)e.Data.GetData(DataFormats.EnhancedMetafile);
if (ms != null)
{
 Image ImageTest = Image.FromStream(ms);
}

(2)
//msがnullとなる。
System.IO.MemoryStream ms = (System.IO.MemoryStream)e.Data.GetData("PNG");
if (ms != null)
{
 Image ImageTest = Image.FromStream(ms);
}

(3)
//msがnullではないが、ImageTestへの格納catch(※)される。
//※使用されたパラメータが有効ではありません。」
System.IO.MemoryStream ms = (System.IO.MemoryStream)e.Data.GetData("Office Drawing Shape Format");
if (ms != null)
{
 Image ImageTest = Image.FromStream(ms);
}
引用返信 編集キー/
■63917 / inTopicNo.6)  Re[5]: 拡張メタファイルの取得
□投稿者/ NYON (5回)-(2012/10/29(Mon) 09:33:29)
追加でe.Data.GetDataの引数について以下も確認してみましたが、
戻り値のmsがnullとなってしまいました。

・"PNG+Office Art"
・"JFIF+Office Art"
・"GIF+Office Art"
・"JFIF"
・"GIF"

引用返信 編集キー/
■63920 / inTopicNo.7)  Re[6]: 拡張メタファイルの取得
□投稿者/ Hongliang (9回)-(2012/10/29(Mon) 13:02:01)
2012/10/29(Mon) 13:02:15 編集(投稿者)
確認しました。確かにD&Dの場合、その辺が全部空になるようです。

System.Runtime.InteropServices.ComTypes.IDataObjectを使ってCOMオブジェクトに直接アクセスすれば、いずれも問題なく取れるようです。
Metafileの場合はこんな感じ。PNGなどの場合はSystem.Runtime.InteropServices.ComTypes.IStreamを使うことになるのでちょっとだけ面倒ですが。

static Metafile GetMetafile(System.Windows.Forms.IDataObject obj)
{
	var iobj = (System.Runtime.InteropServices.ComTypes.IDataObject)obj;
	var etc = iobj.EnumFormatEtc(System.Runtime.InteropServices.ComTypes.DATADIR.DATADIR_GET);
	var pceltFetched = new int[1];
	var fmtetc = new System.Runtime.InteropServices.ComTypes.FORMATETC[1];
	while (0 == etc.Next(1, fmtetc, pceltFetched) && pceltFetched[0] == 1)
	{
		var et = fmtetc[0];
		var fmt = DataFormats.GetFormat(et.cfFormat);
		if (fmt.Name != "EnhancedMetafile")
		{
			continue;
		}
		System.Runtime.InteropServices.ComTypes.STGMEDIUM medium;
		iobj.GetData(ref et, out medium);
		return new Metafile(medium.unionmember, true);
	}
	return null;
}

引用返信 編集キー/
■63922 / inTopicNo.8)  Re[7]: 拡張メタファイルの取得
□投稿者/ NYON (6回)-(2012/10/29(Mon) 13:40:12)
Hongliang様、ご回答ありがとうございます。

提示して頂いた関数「GetMetafile()」を使用することで、
無事画像読み込みまで行うことができました。

これから処理内容を理解するつもりです。

また何かありましたら、どうぞよろしくお願い致します。
本当にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -