11

WPFを使用してWindowsメタファイル(EMF)を表示する必要がありますが、どうすればよいですか?

編集:

画像をベクターベースのままにしておきます。

4

2 に答える 2

15

サードパーティのライブラリAb2d.ReadWmfを見てください。

アップデート#1:概要

まず、この投稿では、MicrosoftがWPFでEMFファイルをサポートすることを意図していないと述べています。それができないという意味ではなく、彼らが彼らをサポートしないということだけです。

WMF / EMF形式に関するウィキペディアのページを見ると、EMFが次のように記述されていることがわかります。

基本的に、WMFファイルには、画面に画像を表示するためにWindowsグラフィックデバイスインターフェイス(GDI)レイヤーに発行する必要のある関数呼び出しのリストが格納されます。一部のGDI関数は、エラー処理のためにコールバック関数へのポインターを受け入れるため、WMFファイルに誤って実行可能コードが含まれている可能性があります。

WPFを使用したことがある場合は、WPFがGDIとは根本的に異なることをご存知でしょう。簡単な概要はこちらから入手できます。これは、EMFファイルを読み込み、GDI呼び出しをWPF呼び出しに変換する必要があることを意味します。これが彼らがプロセスについて議論するスレッドです。それは私には大変な作業のように思えます。

幸いなことに、MicrosoftはWindowsメタファイルを読み取るためのインターフェイスを提供しています。このスレッドで例とここで入手できるドキュメントを確認してください。ただし、WPF Visualではないため、途中までしかアクセスできません。この時点で、最も簡単な解決策は、WPFアプリでWinFormsコントロールを作成し、それをWindowsFormsHostコントロール内でホストすることだと思います。

アップデート#2:コードサンプル

WPFアプリケーションでEMFファイルを表示するには:

  1. WinFormsUserControlを作成する
  2. EMFファイルをMetaFileオブジェクトにロードし、OnPaintハンドラーで描画します。
  3. WindowsFormsIntegrationライブラリへの参照を追加します
  4. WinFormsコントロールをWindowsFormsHost要素内でホストします

UserControl:

public partial class UserControl1 : UserControl
{
     private Metafile metafile1;

     public UserControl1()
     {
         InitializeComponent();
         metafile1 = new Metafile(@"C:\logo2.emf");
     }

     protected override void OnPaint(PaintEventArgs e)
     {
         e.Graphics.DrawImage(metafile1, 0, 0);
     }
}

XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:app="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="200" Width="200">

     <Grid>
         <WindowsFormsHost>
             <app:UserControl1/>
         </WindowsFormsHost>
     </Grid>
 </Window>
于 2012-04-13T19:49:45.890 に答える
12

これは、EMFファイルをロードしてWPFBitmapSourceに変換するユーティリティ関数です。

public static class Emfutilities
{
        public static BitmapSource ToBitmapSource(string path)
        {
            using (System.Drawing.Imaging.Metafile emf = new System.Drawing.Imaging.Metafile(path))
            using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(emf.Width, emf.Height))
            {
                bmp.SetResolution(emf.HorizontalResolution, emf.VerticalResolution);
                using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp))
                {
                    g.DrawImage(emf, 0, 0);
                    return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                }
            }
        }
}

あなたは単にこのようにそれを使用します:

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // img is of Image type for example
            img.Source = Emfutilities.ToBitmapSource("SampleMetafile.emf");
        }
    }

}

欠点は、System.Drawing.dll(GDI +)をWPFアプリケーションに参照する必要があることですが、それは大きな問題ではないはずです。

于 2012-06-19T14:05:10.440 に答える