In a couple of our systems at work we store file attachments. The data gets put in a database table as a varbinary column. When we pull this down into our .NET apps, it’s represented as a byte[]. This is convenient to do image processing on it, as well as writing it to a file to be viewed, etc., but what about previewing straight in the application?
Below is a simple IValueConverter for your WPF/Silverlight apps to take a byte[] (that you know is image data) and convert it into something useful. This lets you bind the binary data directly to, say, an Image control or something.
While I did put the class together, I’m fairly certain the code is modified and piecemealed from elsewhere on the internets, though I can’t for the moment remember where so I apologize for not having proper attribution.
/// <summary> /// Converts binary data into a usable image. /// </summary> public class BinaryImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null || value.GetType() != typeof(Byte[])) return null; byte[] binaryData = (byte[])value; var bmp = new System.Windows.Media.Imaging.BitmapImage(); using (System.IO.MemoryStream stream = new System.IO.MemoryStream(binaryData)) { bmp.BeginInit(); bmp.StreamSource = stream; bmp.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad; bmp.EndInit(); } if (bmp.CanFreeze) bmp.Freeze(); return bmp; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return null; var bmp = (System.Windows.Media.Imaging.BitmapSource)value; int stride = bmp.PixelWidth * ((bmp.Format.BitsPerPixel + 7) / 8); byte[] binaryData = new byte[bmp.PixelHeight * stride]; bmp.CopyPixels(binaryData, stride, 0); return binaryData; } }
This comment has been removed by the author.
ReplyDelete