- - PR -
メタファイル生成方法(Metafileクラス)
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-04-12 08:22
C#のMetafileクラスを使ってEMFファイルやWMFファイルを生成したいのですが、
下記のコードでうまく動作せず、原因がわかりません。 プログラムの動作結果に出てくるファイルをWindowsビューアーなどで、 出てくる図を拡大すると、線がギザギザしてしまい、ベクタグラフィックとは 思えないファイルとなってしまいます。 どうにもわからないので、皆様のお知恵をお借りしたく宜しくお願いします。 using System; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; class Form1 : Form { Metafile mf; public static void Main() { Application.Run(new Form1()); } public Form1() { // Create metafile instance Graphics grfx = CreateGraphics(); IntPtr ipHdc = grfx.GetHdc(); mf = new Metafile(ipHdc, EmfType.EmfPlusDual); grfx.ReleaseHdc(ipHdc); grfx.Dispose(); // Drawing line in the metafile Graphics grfxMeta = Graphics.FromImage(mf); grfxMeta.DrawLine(new Pen(Color.Black), 10, 10, 100, 100); grfxMeta.Dispose(); } override protected void OnPaint(PaintEventArgs pea) { pea.Graphics.DrawImage(mf, 0, 0); } override protected void OnClick(EventArgs ea) { mf.Save("metafiletest.wmf"); MessageBox.Show("Metafile is saved as 'metafiletest.wmf'"); } } } |
|
投稿日時: 2004-04-12 16:03
メタファイルはあまり詳しくないのですが、mf.saveとしてしまっている時点でメタファイルがビットマップに変換されてファイルに保存されているのではないでしょうか?
ファイルにメタファイル形式として保存するのであれば、一番簡単なのはコンストラクタにメタファイル名の引数を追加することです。 mf = new Metafile("metafiletest.wmf", ipHdc, EmfType.EmfPlusDual); 最初のコードのように画面をクリックしたときなどのユーザー操作により保存したい場合は、コンストラクタにメモリーストリームを引数として渡してやり、クリック時にそのストリームをファイルに書き出してやります。 [メンバーに追加] MemoryStream ms = new MemoryStream(); [コンストラクタ] mf = new Metafile(ms, ipHdc, EmfType.EmfPlusDual); [クリックイベント] FileStream fsm = new FileStream("metafiletest.wmf", FileMode.Create, FileAccess.Write); fsm.Write(ms.GetBuffer(),0,(int)ms.Length); fsm.Close(); こんな感じでどうでしょうか? [ メッセージ編集済み 編集者: nodera 編集日時 2004-04-12 16:04 ] |
|
投稿日時: 2004-04-13 00:11
ご回答ありがとうございました。
教えていただいた二通りの方法とも、うまく動作しました。 |
|
投稿日時: 2005-03-11 17:22
メタファイルのアスペクト比に関する質問です
こちらの書き込みを参考にメタファイルを作成したのですが イラストレーターで開くとアスペクト比が変わってしまいます. アスペクト比が変わらないように指定できないでしょうか? なお,Windowsビューアーではもとのアスペクト比で表示されます. |
1