2012-04-09 10 views
19

私はSystem.Drawing.Imageのインスタンスを持っています。Drawing.Image in WPF

これを私のWPFアプリケーションでどのように表示できますか?

私はimg.Sourceで試しましたが、うまくいきません。

+0

おそらく関連:[WPFのhttp://stackoverflow.com/questions/1118496/using-image-control-in-wpf-to-display-system-drawing-bitmap – Alain

+3

可能性の重複 - 私が使用できますSystem.Drawing in wpf?](http://stackoverflow.com/questions/10663056/wpf-can-i-use-system-drawing-in-wpf) –

答えて

14

イメージをWPFイメージコントロールに読み込むには、System.Windows.Media.ImageSourceが必要です。

あなたのDrawing.ImageオブジェクトがImageSourceはオブジェクトに変換する必要があります。DeleteObjectの方法の

public static BitmapSource GetImageStream(Image myImage) 
    { 
     var bitmap = new Bitmap(myImage); 
     IntPtr bmpPt = bitmap.GetHbitmap(); 
     BitmapSource bitmapSource = 
     System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       bmpPt, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 

     //freeze bitmapSource and clear memory to avoid memory leaks 
     bitmapSource.Freeze(); 
     DeleteObject(bmpPt); 

     return bitmapSource; 
    } 

宣言。

[DllImport("gdi32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal static extern bool DeleteObject(IntPtr value); 
+0

私はこのソリューションが好きです!ありがとう、男! –

19

私は同じ問題を抱え、いくつかの答えを組み合わせて解決します。 this question and answers

+2

+1素敵できちんとした – GETah

+0

'bmp'を処分するのを忘れないでください。 – Peter

+0

この例では** bmp **は何ですか? – juagicre

9

から

System.Drawing.Bitmap bmp; 
Image image; 
... 
using (var ms = new MemoryStream()) 
{ 
    bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    ms.Position = 0; 

    var bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.CacheOption = BitmapCacheOption.OnLoad; 
    bi.StreamSource = ms; 
    bi.EndInit(); 
} 

image.Source = bi; 
//bmp.Dispose(); //if bmp is not used further. Thanks @Peter 

あなたがコンバータを使用する場合は、あなたが実際にImageオブジェクトにバインドすることができます。 を作成すると、ImageBitmapSourceに変換されます。

実際の作業を行うために、コンバータの内部にAlexDreneaのサンプルコードを使用しました。

[ValueConversion(typeof(Image), typeof(BitmapSource))] 
public class ImageToBitmapSourceConverter : IValueConverter 
{ 
    [DllImport("gdi32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool DeleteObject(IntPtr value); 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Image myImage = (Image)value; 

     var bitmap = new Bitmap(myImage); 
     IntPtr bmpPt = bitmap.GetHbitmap(); 
     BitmapSource bitmapSource = 
     System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       bmpPt, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 

     //freeze bitmapSource and clear memory to avoid memory leaks 
     bitmapSource.Freeze(); 
     DeleteObject(bmpPt); 

     return bitmapSource; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

あなたのXAMLにコンバータを追加する必要があります。

<utils:ImageToBitmapSourceConverter x:Key="ImageConverter"/> 

<Image Source="{Binding ThumbSmall, Converter={StaticResource ImageConverter}}" 
        Stretch="None"/> 
+0

自己完結型。私はそれが好きです – Basic

関連する問題