2012-08-23 104 views
6

EMFファイルがあります。サイズを小さくしたい.NETでEMF(メタファイル)のサイズを変更(縮小)するにはどうすればよいですか?

ぼんやりした画像を表示せずに.net(または他のツール)でどうすれば

結果のサイズ変更されたイメージは、別のフォーマット(png/jpg /何でも)に変換されます。私はそれを扱うことができます。

EMF /メタファイルを扱う.Net(またはその問題の言語プラットフォーム)の明確な例は見つかりませんでした。

私はGDI +でグラフィックスプログラミングを調べましたが、メタファイルだけを紹介しています。

私はImage Magickを試しましたが、別のフォーマットに変換する必要があります(これはやり直す必要があります)、結果はぼやけています(たとえば、縮小してpngに変換した場合)。

私はInkscapeを試しましたが、EMFファイルのみをインポートすることができ、Inkscapeはを逆さまにしてと逆順にインポートします。

また、私はWindowのPaint(emfを開く数少ない画像編集ソフトウェアプログラムの1つ)を開いて図面をサイズ変更しましたが、やはりぼやけています。

更新: サイズ変更に使用しているコードは次のとおりです。

これは機能しますが、結果の画像はぼやけています。コードだけで、一般的な画像リサイズルーチンで、EMFのに固有のものではありません

private static Image resizeImage(Image imgToResize, Size size) 
{ 
    int sourceWidth = imgToResize.Width; 
    int sourceHeight = imgToResize.Height; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)size.Width/(float)sourceWidth); 
    nPercentH = ((float)size.Height/(float)sourceHeight); 

    if (nPercentH < nPercentW) 
     nPercent = nPercentH; 
    else 
     nPercent = nPercentW; 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap b = new Bitmap(destWidth, destHeight); 
    Graphics g = Graphics.FromImage((Image)b); 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
    g.Dispose(); 

    return (Image)b; 
} 

出典:リサイズのための(あなたが編集した後、持っているものに似ている)、次のコードを使用して http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing

+0

私はEMFをどこに描いているのか聞いてきました。しかし、ちょうど投稿したMagnusがあなたがしたいすべてをカバーするべきである。 –

答えて

5

イムemfイメージそれはぼやけて見えません。

var size = new Size(1000, 1000); 

using(var source = new Metafile("c:\\temp\\Month_Calendar.emf")) 
using(var target = new Bitmap(size.Width, size.Height)) 
using(var g = Graphics.FromImage(target)) 
{ 
    g.DrawImage(source, 0, 0, size.Width, size.Height); 
    target.Save("c:\\temp\\Month_Calendar.png", ImageFormat.Png); 
} 
+0

Magnusはい、これはサイズを大きくするために問題なく動作します。しかし、縮小すると(サイズを小さくすると)、ぼやけた画像が表示されます。これをWordまたはVisioでEMFを読み込むと比較してください。品質を大幅に損なうことなく画像を縮小することができます。あなたがあなたの方法(または上記の私の方法)で同じことをするとき、あなたは質を失います。 –

+0

@ChrisWeberあなたは[MFRasterizer Library](http://wmf.wholegroup.com/)を使用することを検討するかもしれません – Magnus

+1

この品質は、私の目的にとっては十分です。私の質問のコードは私のためにb/cそれは比例して画像を保持します。 –

1

.NETはロードし、EMFを描くことができます。

Metafile myMetafile = new Metafile("SampleMetafile.emf"); 
graphics.DrawImage(myMetafile, 100, 100); 

結果画像がぼやけている場合は、ロスレス圧縮を持っているPNG/GIFとして保存、またはより大きな画像にレンダリングすることを検討してください。

結果がまだ十分でない場合は、ロードしてレンダリングするためにGDI32を使用する必要があります。

+0

私はそれをうまく読み込むことができます。問題はサイズ変更されています。 –

+1

ファジーの原因は、1)画像サイズ、2)画像圧縮、3)レンダリングです。 GDI +はEMFをレンダリングするとき、反アリアティングレンダリングでレンダリングするため、ファジーが発生する可能性があります。 –

0

EMFサイズ変更は非常に難しい場合があります。より小さなビットマップで画像をラスタライズすることはできますが、結果は必ずしも予想通りのものではありません。私は最後の作戦を使用することを決めた私自身のプロジェクトのために

3 different strategies

:ここではビュー戦略の結果は、その後、EMFのサイズ4倍のビットマップにEMFを爆破PNGに保存し、小さなファイルにPNGを保存します。

私は件名にブログを書いています:Rasterizing EMF files with .Net/C#。 EMFのサイズを変更するのに役立つclass on GitHubを作成しましたが、これはやや複雑な方法です(バウンディングボックスを使用)。

関連する問題