WPFでベクタ画像(EMF)を表示

.emfのベクタ画像をきれいに拡大して表示できるビューアを探してたけど
良いのが見つからなかったので作った。

WPFでemf画像を表示するのは案外簡単だった。

System.Drawing.Image.FromFileで読み込めるので、
あとはBitmapに変換したりとかいい感じに扱える。

WPFのImageコントロールを使って表示するには
System.Drawing.BitmapをSystem.Windows.Media.BitmapSourceにWin32無しで変換する。 - 亀岡的プログラマ日記
を参考というか丸パクリさせて頂きつつ。

最終的にこんなん。

using System.Drawing;
using System.Windows.Media.Imaging;

namespace EmfView
{
    class MetaImage
    {
        public static BitmapSource LoadFromFile(string path, double rate)
        {
            using (var image = Image.FromFile(path))
            using (var canvas = new Bitmap((int)(image.Size.Width * rate), (int)(image.Size.Height * rate)))
            using (var graphics = Graphics.FromImage(canvas))
            {
                graphics.DrawImage(image, 0, 0, (int)(image.Size.Width * rate), (int)(image.Size.Height * rate));
                return canvas.ToWPFBitmap();
            }
        }
    }
}

pathにファイルパス、rateに拡大率を設定する感じで。
Image.FromFileが対応してるファイルなら
ベクタ画像(*.emf, *.wmf)に限らずラスタ画像(*.bmp, *.png, ...)も読める。
SVG(*.svg)は残念ながら…

表示側は

<Image Name="image1" Stretch="None"/>

からの

var path = @"D:\pic\pic1.emf";
var rate = 1.0;
this.image1.Source = MetaImage.LoadFromFile(path, rate);

みたいに。



作ったアプリ。
github.com