2009-07-29 69 views

Trả lời

1

Xin xem HOW TO USE IMAGESOURCE (NO HANDLER) IN WINFORMS AS SYSTEM.DRAWING.BITMAP (HBITMAP):

Làm thế nào để dễ dàng chuyển đổi WinForms System.Drawing.Bitmap vào WPF ImageSource bạn đã học từ bài viết này. Hôm nay, tôi sẽ giải thích cách làm ngược lại. Trên thực tế, tất cả các ông phải làm là để trích xuất xử lý từ BitmapSource, tuy nhiên, cách tiếp cận như vậy không được hỗ trợ, do đó điều duy nhất chúng ta có thể làm là chỉ cần sao chép các điểm ảnh của BitmapSource (hoặc BitmapFrame) vào mảng byte và sau đó sao chép chúng vào con trỏ của HBitmap.

+0

Cả hai này và các bài viết trước đây là phương pháp tương tự: copy dòng quét bitmap vào một mảng byte và sau đó tạo một bitmap từ khối bộ nhớ. Bitmap giả định rằng khối bộ nhớ chứa các dòng quét trong suốt thời gian tồn tại bitmap. Tuy nhiên sau khi rời khỏi mã cố định (byte * pB = bits), bộ nhớ có thể bị ghi đè bởi trình quản lý bộ nhớ .net và bitmap bị hỏng. Giải pháp là sử dụng Marshal.AllocHGlobal, nhưng trong trường hợp này khối bộ nhớ phải được duy trì bởi mã người dùng (nghĩa là: phải được giải phóng sau khi sử dụng bởi Marshal.FreeHGlobal). –

9

OP cũ hơn, nhưng vẫn có thể thuận tiện cho một số người khác, vì phải mất một chút thời gian để tìm giải pháp sạch hơn mà không bị gián đoạn dồn hoặc tạm dừng.

này làm việc cho tôi, bạn có thể sử dụng pngencoder cắt giảm kích thước hình ảnh trước khi lưu thành file hoặc dòng rtf

private System.Drawing.Image ImageWpfToGDI(System.Windows.Media.ImageSource image) { 
    MemoryStream ms = new MemoryStream(); 
    var encoder = new System.Windows.Media.Imaging.BmpBitmapEncoder(); 
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(image as System.Windows.Media.Imaging.BitmapSource)); 
    encoder.Save(ms); 
    ms.Flush();  
    return System.Drawing.Image.FromStream(ms); 
} 
+0

Nếu bạn cần chuyển đổi hình ảnh với kênh alpha (có phần trong suốt), hãy sử dụng System.Windows.Media.Imaging.PngBitmapEncoder() thay cho System.Windows.Media.Imaging.BmpBitmapEncoder(). –

+0

@DariuszWasacz Tôi không thể nhận được câu trả lời này để làm việc. Nó phàn nàn rằng image.Source không hoạt động: ** 'System.Drawing.Image' không chứa định nghĩa cho 'Source' và không có phương thức mở rộng 'Source' chấp nhận đối số đầu tiên của kiểu 'System.Drawing.Image' có thể là tìm thấy. ** Tôi đã kiểm tra MSDN và Hình ảnh không có thuộc tính Nguồn. Bạn có bất cứ ý tưởng gì cần phải được sửa chữa? –

+1

@kayleeFrye_onDeck: Xin lưu ý rằng cả hai vùng tên System.Drawing và System.Windows.Media đều chứa lớp 'Image'. Dường như bạn đã bỏ qua không gian tên trong đối số 'System.Windows.Media.Image image' và 'System.Drawing.Image' được lấy từ việc sử dụng các câu lệnh. Vui lòng kiểm tra xem mã của bạn có giống chính xác không. –