none
Pictureboxのグラフをメタファイル形式でクリップボードにコピーしたい RRS feed

  • 質問

  • お世話になっております。 arubi_momoと申します。

    Windows7 64bit 、Visual Studio2010 C#で開発しております。

    表題の件で、Pitureboxに表示しているグラフを、クリップボードに拡張メタファイル形式で転送したいのですが、Clipboadのメソッドだけでは実現できないということがわかり、色々調べましたところ、このフォーラムでEMF形式の画像をクリップボードに転送する方法、という質問があり、それを参考にすることで、EMF形式のファイルを、クリップボードに転送することはできるようになりました。

    あとは、Pictureboxのグラフを、EMF形式で保存できれば、①グラフをEMF形式で保存、②そのファイルをクリップボード転送する、という形にすれば、実現できると思い、その方法を探していたのですが、Picturebox.Image.SaveではEMF形式をサポートしていないのか、拡張子はEMFでも中身がPNGファイルになってしまうようです。

    Pictureboxのイメージを、EMF形式で保存するやり方について、ご存知の方がいらっしゃいましたら、ご教示いただければと思います。

    何卒、よろしくお願いいたします。

    

    2015年4月24日 3:39

回答

  • まずImageクラスの派生クラスとしてはBitmapとMetafileがありますが、後者を使われていますでしょうか?

    次にImage.Save(string)メソッドはファイル名に依らずPNG形式が使われると解説にあります。だからといってImageFormat.Emfを指定すればよいわけでもなく、

     Save メソッドを使用してグラフィック イメージを Windows メタファイル形式 (WMF) または拡張メタファイル形式 (EMF) のファイルとして保存する場合、そのファイルは PNG (Portable Network Graphics) ファイルとして保存されます。 この動作は、.wmf ファイルまたは .emf ファイルとしてファイルを保存するために使用できるエンコーダーを .NET Framework の GDI+ コンポーネントが備えていないために起こります。

    とも書かれています。結局のところGDI+ / C#: How to save an image as EMF?が参考になりますが、Metafileクラスに書き込ませることになるでしょうか。

    • 回答としてマーク arubi_momo 2015年4月27日 2:14
    2015年4月24日 7:50
  • 外池と申します。

    恐らく既にご存知のこととは思いますが、以下、ごくごく概念的に・・・。小生の理解の及ぶ範囲ですが。

    メタファイルは、要するに、「筆順」を記録したもの。PictureBoxのImageのSaveで保存されるものは、「筆順」に従って描画した結果としてのビットマップ画像。

    「筆順」を記録する操作として、仰る通りで、GraphicsにPictureboxに描画しているものと同じものを書き込む操作が必要なんだと思います。小生も同じ考え方でEMFファイル生成を実装したことがあります。

    • 回答としてマーク arubi_momo 2015年4月27日 2:13
    2015年4月24日 11:20

すべての返信

  • まずImageクラスの派生クラスとしてはBitmapとMetafileがありますが、後者を使われていますでしょうか?

    次にImage.Save(string)メソッドはファイル名に依らずPNG形式が使われると解説にあります。だからといってImageFormat.Emfを指定すればよいわけでもなく、

     Save メソッドを使用してグラフィック イメージを Windows メタファイル形式 (WMF) または拡張メタファイル形式 (EMF) のファイルとして保存する場合、そのファイルは PNG (Portable Network Graphics) ファイルとして保存されます。 この動作は、.wmf ファイルまたは .emf ファイルとしてファイルを保存するために使用できるエンコーダーを .NET Framework の GDI+ コンポーネントが備えていないために起こります。

    とも書かれています。結局のところGDI+ / C#: How to save an image as EMF?が参考になりますが、Metafileクラスに書き込ませることになるでしょうか。

    • 回答としてマーク arubi_momo 2015年4月27日 2:14
    2015年4月24日 7:50
  • 佐祐理さま

    ご回答いただき、ありがとうございます。

    クリップボードへの保存の時は、Metafileを使用しています。

    PictureboxのイメージをEMFファイルとして保存しようとした時は、以下のようなコードにしていましたが、それだと佐祐理さまご指摘の通りPNG保存されてしまうのですね。

    Picturebox.Image.Save("C:\temp\test.emf", System.Drawing.Imaging.ImageFormat.Emf);

    勉強不足であまり理解できていないのですが、Metafileクラスに書き込ませるということになりますと、

    GraphicsクラスにPictureboxに描画しているのと同じものを書き込むということで解釈は合っていますでしょうか。

    勉強不足で大変申し訳ありません。

    2015年4月24日 11:03
  • 外池と申します。

    恐らく既にご存知のこととは思いますが、以下、ごくごく概念的に・・・。小生の理解の及ぶ範囲ですが。

    メタファイルは、要するに、「筆順」を記録したもの。PictureBoxのImageのSaveで保存されるものは、「筆順」に従って描画した結果としてのビットマップ画像。

    「筆順」を記録する操作として、仰る通りで、GraphicsにPictureboxに描画しているものと同じものを書き込む操作が必要なんだと思います。小生も同じ考え方でEMFファイル生成を実装したことがあります。

    • 回答としてマーク arubi_momo 2015年4月27日 2:13
    2015年4月24日 11:20
  • 外池さま、佐祐理さま

    お世話になっております。ご回答ありがとうございました。

    佐祐理さまにご教示いただいたサイトと、外池さまに明示いただいた回答のおかげで、実装することが出来ました!

    概念も明示いただいたので、整理して理解することができ、本当に勉強になりました。

    ありがとうございました。今後とも何卒よろしくお願い申し上げます。

    2015年4月27日 2:13