質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

Q&A

解決済

1回答

6982閲覧

EMF形式の画像を劣化させずに加工したい

morinokuma0621

総合スコア81

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

0グッド

0クリップ

投稿2017/03/03 10:08

EMF形式の画像ファイルの、下30ピクセルを白く塗って、文字を足して再びEMF形式で保存しなおす、というのをしたいと考えています。

いったんBitmap形式で取り込んで加工し保存するところまではできたのですが、それをすると画像が非常に荒くなってしまい使い物になりませんでした。

ファイルサイズを比較してみても、20kbほどあったものが2kb程度まで減っており、劣化しているものと考えられます。劣化なしに加工する方法はないでしょうか?

C#

1public Form1() 2{ 3 InitializeComponent(); 4 5 string fn = @"C:\test.emf"; 6 Bitmap bp = new Bitmap(fn); 7 8 using (Graphics g = Graphics.FromImage(bp)) 9 { 10 Rectangle rect1 = new Rectangle(0, 30, 114, 13); 11 g.FillRectangle(Brushes.White, rect1); 12 13 Font fnt = new Font("メイリオ", 8); 14 g.DrawString("0123456789", fnt, Brushes.Black, 10, 28); 15 } 16 bp.Save("new_" + fn, ImageFormat.Emf); 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでいけませんかね?

C#

1 2//using System.IO; 3//using System.Drawing; 4//using System.Drawing.Imaging; 5 6 using (Graphics gra = CreateGraphics()) 7 { 8 IntPtr ipHdc = gra.GetHdc(); 9 10 String FileName = @"C:\Test.emf"; 11 int width, height; 12 13 //元のメタファイルを読み込む 14 Metafile metafile; 15 using (Stream sr = new FileStream(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 16 { 17 metafile = new Metafile(sr); 18 } 19 width = metafile.Width; 20 height = metafile.Height; 21 22 //保存するメタファイル(上書き) 23 using (Metafile metafile2 = new Metafile(FileName, ipHdc, new Rectangle(0, 0, width, height), MetafileFrameUnit.Pixel)) 24 { 25 26 using (Graphics g = Graphics.FromImage(metafile2)) 27 { 28 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 29 30 //元のEMFファイルを描画 31 g.DrawImage(metafile, 0, 0); 32 33 //追加の描画 34 Rectangle rect1 = new Rectangle(0, 0, 114, 13); 35 g.FillRectangle(Brushes.Red, rect1); 36 37 Font fnt = new Font("メイリオ", 8); 38 g.DrawString("0123456789", fnt, Brushes.Black, 10, 30); 39 } 40 41 // Disposeを忘れずに 42 metafile.Dispose(); 43 } 44 gra.ReleaseHdc(ipHdc); 45 } 46

投稿2017/03/03 12:30

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morinokuma0621

2017/03/03 15:28

ご返答ありがとうございます。会社から帰ってしまったので、試してみるのが月曜日になってしまいますが、一番引っかかっていたところが、 Graphics g = Graphics.FromImage(metafile2) でGraphicsにメタファイルを読み込むと『メモリ不足』というエラーが出ていたところでした。サイズが問題っぽいところまではわかったのですが、そこから何をどうすればいいかが分からずそこで止まっていました。ご提示いただいた方法でなら読み込めそうな気がします。月曜日にさっそく試させていただきます。ありがとうございます。
YAmaGNZ

2017/03/03 22:08

私も詳しいことはわからないのですが、EMFファイルを読み込んだ時にGraphics.FromImageをコールするとエラーが発生しますが、新規に作成する場合はエラーが発生しません。 ですので、新規に作成したところに読み込んだEMFファイルを描画するという手順にしています。
morinokuma0621

2017/03/06 02:22

上記の方法で綺麗なemf形式のファイルを作ることができました。 大変助かりました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問