Насколько я могу сказать, что единственный способ преобразовать из BitmapSource для Побитового отображения через небезопасный код... Как это (из блога Lesters WPF):
myBitmapSource.CopyPixels(bits, stride, 0);
unsafe
{
fixed (byte* pBits = bits)
{
IntPtr ptr = new IntPtr(pBits);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
width,
height,
stride,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb,ptr);
return bitmap;
}
}
Сделать реверс:
System.Windows.Media.Imaging.BitmapSource bitmapSource =
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
В платформе существует ли более легкий путь? И какова причина, которая это не там (если это не)? Я думал бы, что это довольно применимо.
Причина мне нужен он, состоит в том, потому что я использую AForge, чтобы сделать определенные операции изображения в приложении WPF. WPF хочет показать BitmapSource/ImageSource, но работы AForge над Битовыми массивами.
Можно обойтись без небезопасного кода, используя Bitmap.LockBits
и скопировав пиксели из BitmapSource
прямо в Bitmap
Bitmap GetBitmap(BitmapSource source) {
Bitmap bmp = new Bitmap(
source.PixelWidth,
source.PixelHeight,
PixelFormat.Format32bppPArgb);
BitmapData data = bmp.LockBits(
new Rectangle(Point.Empty, bmp.Size),
ImageLockMode.WriteOnly,
PixelFormat.Format32bppPArgb);
source.CopyPixels(
Int32Rect.Empty,
data.Scan0,
data.Height * data.Stride,
data.Stride);
bmp.UnlockBits(data);
return bmp;
}
Это то, что вы ищете?
Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits);