Bitmap
using System; using System.Drawing; using System.Windows.Media.Imaging; using System.IO; using System.Drawing.Imaging; using System.Windows.Interop; namespace Runaurufu.Extension { public static class ExtensionBitmap { public static BitmapImage ToBitmapImage(this Bitmap A) { using (MemoryStream ms = new MemoryStream()) { A.Save(ms, ImageFormat.Bmp); ms.Position = 0; BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.StreamSource = ms; bi.CacheOption = BitmapCacheOption.OnLoad; bi.EndInit(); return bi; } } [System.Runtime.InteropServices.DllImport("gdi32.dll")] private static extern bool DeleteObject(IntPtr hObject); public static BitmapSource ToBitmapSource(this Bitmap A) { IntPtr hBitmap = A.GetHbitmap(); BitmapSource result; try { result = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); } finally { DeleteObject(hBitmap); } return result; } public static Byte[] ToByteArray(this Bitmap A) { using (MemoryStream ms = new MemoryStream()) { A.Save(ms, ImageFormat.Bmp); ms.Position = 0; return ms.ToArray(); } } } }
BitmapSource
using System; using System.Drawing; using System.IO; using System.Windows.Media.Imaging; namespace Runaurufu.Extension { public static class ExtensionBitmapSource { public static BitmapImage ToBitmapImage(this BitmapSource A) { return A.ToBitmapImage(new BmpBitmapEncoder()); } public static BitmapImage ToBitmapImage(this BitmapSource A, BitmapEncoder encoder) { BitmapImage bi = new BitmapImage(); using (MemoryStream ms = new MemoryStream()) { encoder.Frames.Add(BitmapFrame.Create(A)); encoder.Save(ms); ms.Position = 0; bi.BeginInit(); bi.StreamSource = ms; bi.CacheOption = BitmapCacheOption.OnLoad; bi.EndInit(); } return bi; } public static Bitmap ToBitmap(this BitmapSource A) { return A.ToBitmap(new BmpBitmapEncoder()); } public static Bitmap ToBitmap(this BitmapSource A, BitmapEncoder encoder) { System.Drawing.Bitmap bitmap; using (MemoryStream outStream = new MemoryStream()) { encoder.Frames.Add(BitmapFrame.Create(A)); encoder.Save(outStream); bitmap = new System.Drawing.Bitmap(outStream); } return bitmap; } public static Byte[] ToByteArray(this BitmapSource A) { return A.ToByteArray(new BmpBitmapEncoder()); } public static Byte[] ToByteArray(this BitmapSource A, BitmapEncoder encoder) { using (MemoryStream memoryStream = new MemoryStream()) { encoder.Frames.Add(BitmapFrame.Create(A)); encoder.Save(memoryStream); return memoryStream.GetBuffer(); } } } }
BitmapImage
using System; using System.Drawing; using System.IO; using System.Windows.Media.Imaging; namespace Runaurufu.Extension { public static class ExtensionBitmapImage { public static Bitmap ToBitmap(this BitmapImage A) { return A.ToBitmap(new BmpBitmapEncoder()); } public static Bitmap ToBitmap(this BitmapImage A, BitmapEncoder encoder) { Bitmap bitmap; using (MemoryStream outStream = new MemoryStream()) { encoder.Frames.Add(BitmapFrame.Create(A)); encoder.Save(outStream); bitmap = new System.Drawing.Bitmap(outStream); } return bitmap; } public static Byte[] ToByteArray(this BitmapImage A) { return A.ToByteArray(new BmpBitmapEncoder()); } public static Byte[] ToByteArray(this BitmapImage A, BitmapEncoder encoder) { Byte[] byteArr; using (MemoryStream ms = new MemoryStream()) { encoder.Frames.Add(BitmapFrame.Create(A)); encoder.Save(ms); ms.Position = 0; byteArr = ms.GetBuffer(); } return byteArr; } } }
Byte[]
using System; using System.Drawing; using System.IO; using System.Windows.Media.Imaging; namespace Runaurufu.Extension { public static class ExtensionByte { public static Bitmap ToBitmap(this Byte[] A) { using (MemoryStream ms = new MemoryStream(A)) { return new Bitmap(ms); } } public static BitmapImage ToBitmapImage(this Byte[] A) { using (MemoryStream ms = new MemoryStream(A)) { ms.Position = 0; BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.StreamSource = ms; bi.CacheOption = BitmapCacheOption.OnLoad; bi.EndInit(); return bi; } } } }
Warto zwrócić uwagę, że w przypadku BitmapSource czyli obrazach rodem z WPF/Silverlighta konieczne jest podanie odpowiedniego enkodera - wybór np. JpegEncoder na obrazie z kanałem alfa (przeźroczystość) sprawi, że ów kanał alfa trafi szlag... :) Dodatkowo z oczywistych przyczyn nie ma metody do konwersji BitmapImage -> BitmapSource - a jeśli ktoś szuka bo z jakiś powodów potrzebuje to może wykorzystać ten fragment:
public static BitmapSource ToBitmapSource (this BitmapImage A) { return (BitmapSource)A; }
A wszystkim, którzy choć od czasu do czasu zaglądają w me skromne progi życzę Wesołych Świąt :)
Keywords: C#, . NET, Bitmap, BitmapImage, BitmapSource, Bitmap conversions, Silverlight, WPF, WinForm, Image, Picture, Transparent BitmapImage.