2014-10-08 15 views
12

Tôi cần chuyển đổi System.Drawing.Bitmap thành lớp System.Windows.Media.ImageSource để liên kết nó với một điều khiển HeaderImage của một WizardPage (Bộ công cụ WPF mở rộng). Bitmap được đặt làm tài nguyên của assembly tôi viết. Nó đang được tham chiếu như thế:WPF - chuyển đổi Bitmap sang ImageSource

 public Bitmap GetBitmap 
    { 
     get 
     { 
      Bitmap bitmap = new Bitmap(Resources.my_banner); 
      return bitmap; 
     } 
    } 

    public ImageSource HeaderBitmap 
    { 
     get 
     { 
      ImageSourceConverter c = new ImageSourceConverter(); 
      return (ImageSource) c.ConvertFrom(GetBitmap); 
     } 
    } 

Bộ chuyển đổi đã được tìm thấy bởi tôi ở đây: http://www.codeproject.com/Questions/621920/How-to-convert-Bitmap-to-ImageSource tôi nhận được một NullReferenceException tại

return (ImageSource) c.ConvertFrom(Resources.my_banner); Làm thế nào tôi có thể khởi tạo ImageSource để tránh ngoại lệ này? Hoặc là có một cách khác? Tôi muốn sử dụng nó sau đó như sau:

 <xctk:WizardPage x:Name="StartPage" Height="500" Width="700" 
        HeaderImage="{Binding HeaderBitmap}" Enter="StartPage_OnEnter" 

Cảm ơn trước cho bất kỳ câu trả lời nào.

+0

Xem ở đây: [a NullReferenceException là gì và làm thế nào để sửa chữa nó] (http : //stackoverflow.com/q/4660142/1136211) – Clemens

Trả lời

6

Tôi không tin rằng ImageSourceConverter sẽ chuyển đổi từ một System.Drawing.Bitmap. Tuy nhiên, bạn có thể sử dụng các mục sau:

public static BitmapSource CreateBitmapSourceFromGdiBitmap(Bitmap bitmap) 
{ 
    if (bitmap == null) 
     throw new ArgumentNullException("bitmap"); 

    var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 

    var bitmapData = bitmap.LockBits(
     rect, 
     ImageLockMode.ReadWrite, 
     PixelFormat.Format32bppArgb); 

    try 
    { 
     var size = (rect.Width * rect.Height) * 4; 

     return BitmapSource.Create(
      bitmap.Width, 
      bitmap.Height, 
      bitmap.HorizontalResolution, 
      bitmap.VerticalResolution, 
      PixelFormats.Bgra32, 
      null, 
      bitmapData.Scan0, 
      size, 
      bitmapData.Stride); 
    } 
    finally 
    { 
     bitmap.UnlockBits(bitmapData); 
    } 
} 

Giải pháp này yêu cầu hình ảnh nguồn ở định dạng Bgra32; nếu bạn đang xử lý các định dạng khác, bạn có thể cần phải thêm chuyển đổi.

9

Vì lợi ích của người tìm kiếm, tôi đã tạo một công cụ chuyển đổi nhanh dựa trên điều này thêm detailed solution.

Không có vấn đề gì cho đến thời điểm này.

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

namespace XYZ.Helpers 
{ 
    public class ConvertBitmapToBitmapImage 
    { 
     /// <summary> 
     /// Takes a bitmap and converts it to an image that can be handled by WPF ImageBrush 
     /// </summary> 
     /// <param name="src">A bitmap image</param> 
     /// <returns>The image as a BitmapImage for WPF</returns> 
     public BitmapImage Convert(Bitmap src) 
     { 
      MemoryStream ms = new MemoryStream(); 
      ((System.Drawing.Bitmap)src).Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
      BitmapImage image = new BitmapImage(); 
      image.BeginInit(); 
      ms.Seek(0, SeekOrigin.Begin); 
      image.StreamSource = ms; 
      image.EndInit(); 
      return image; 
     } 
    } 
} 
14

Đối với những người khác, công trình này:

//If you get 'dllimport unknown'-, then add 'using System.Runtime.InteropServices;' 
    [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool DeleteObject([In] IntPtr hObject); 

    public ImageSource ImageSourceForBitmap(Bitmap bmp) 
    { 
     var handle = bmp.GetHbitmap(); 
     try 
     { 
      return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
     } 
     finally { DeleteObject(handle); }    
    } 
+3

Bạn là anh hùng của tôi. Sử dụng điều này để làm cho một phần mở rộng cho lớp Bitmap và nó làm việc tuyệt vời. Công việc tốt đẹp. – ARidder101

+1

@ ARidder101 Tôi chắc chắn tôi đã nhận được điều này từ một người khác fwiw. – dethSwatch

0

Giải pháp đơn giản nhất đối với tôi:

ImageBrush myBrush = new ImageBrush(); 
var bitmap = System.Drawing.Image.FromFile("pic1.bmp"); 
Bitmap bitmap = new System.Drawing.Bitmap(image);//it is in the memory now 
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(),IntPtr.Zero,Int32Rect.Empty,BitmapSizeOptions.FromEmptyOptions()); 
myBrush.ImageSource = bitmapSource; 
cover.MainGrid.Background = myBrush; 
cover.Show(); 
bitmap.Dispose(); 
Các vấn đề liên quan