If you are like me, you probably keep bitmaps (png files) of your WPF project in Resources. Since Resources uses System.Drawing.Bitmap for storing bitmaps, I wrote (some code modifications were done by Bojan) this little extension that will convert bitmap resource to BitmapSource.
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Foo
{
public static class BitmapExtension
{
public static BitmapSource GetBitmapSource(this Bitmap image)
{
var rect = new Rectangle(0, 0, image.Width, image.Height);
var bitmap_data = image.LockBits(rect, ImageLockMode.ReadOnly, image.PixelFormat);
try
{
BitmapPalette palette = null;
if (image.Palette.Entries.Length > 0)
{
var palette_colors = image.Palette.Entries.Select(entry => System.Windows.Media.Color.FromArgb(entry.A, entry.R, entry.G, entry.B)).ToList();
palette = new BitmapPalette(palette_colors);
}
return BitmapSource.Create(
image.Width,
image.Height,
image.HorizontalResolution,
image.VerticalResolution,
ConvertPixelFormat(image.PixelFormat),
palette,
bitmap_data.Scan0,
bitmap_data.Stride * image.Height,
bitmap_data.Stride
);
}
finally
{
image.UnlockBits(bitmap_data);
}
}
private static System.Windows.Media.PixelFormat ConvertPixelFormat(System.Drawing.Imaging.PixelFormat sourceFormat)
{
switch (sourceFormat)
{
case System.Drawing.Imaging.PixelFormat.Format24bppRgb:
return PixelFormats.Bgr24;
case System.Drawing.Imaging.PixelFormat.Format32bppArgb:
return PixelFormats.Bgra32;
case System.Drawing.Imaging.PixelFormat.Format32bppRgb:
return PixelFormats.Bgr32;
}
return new System.Windows.Media.PixelFormat();
}
}
}
Advertisement