Làm cách nào để chuyển đổi System.Windows.Media.ImageSource thành System.Drawing.Bitmap trong C#?Chuyển đổi System.Windows.Media.ImageSource sang System.Drawing.Bitmap
Trả lời
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.
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);
}
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(). –
@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? –
@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. –
- 1. thể không mặc nhiên chuyển đổi loại 'System.Drawing.Image' thành 'System.Drawing.Bitmap'`
- 2. Chuyển đổi sang Enum
- 3. Chuyển đổi sang UCS2
- 4. Vẽ một System.Drawing.Bitmap mới
- 5. Chuyển đổi phao sang char *
- 6. Chuyển đổi lptstr sang char *
- 7. chuyển đổi html sang javascript
- 8. Chuyển đổi PDF sang PS
- 9. Chuyển đổi Python sang R
- 10. Chuyển đổi Html sang RTF
- 11. Chuyển đổi HTML sang PDF
- 12. Chuyển đổi hex sang float
- 13. Chuyển đổi Hiragana sang Kanji
- 14. Chuyển đổi PartialView sang HTML
- 15. Chuyển đổi VBScript sang Javascript
- 16. Chuyển đổi EBNF sang BNF
- 17. Bash chuyển đổi sang pdf
- 18. Chuyển đổi TeX sang html
- 19. Chuyển đổi JavaScript sang Java
- 20. Chuyển đổi PDF sang HTML
- 21. Chuyển đổi JSON sang XML
- 22. Chuyển đổi PHP4 sang PHP5
- 23. Chuyển đổi HTML sang XAML
- 24. Chuyển đổi JSON sang CSV
- 25. Chuyển đổi EPS sang Xaml
- 26. Chuyển đổi NSData sang NSDictionary
- 27. Chuyển đổi Java sang iOS
- 28. Chuyển đổi HTML sang XML
- 29. Chuyển đổi phao sang bit
- 30. Chuyển đổi IEnumerable sang DataTable
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). –