Существует ли хороший способ преобразовать между BitmapSource и Битовым массивом?

Насколько я могу сказать, что единственный способ преобразовать из 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 над Битовыми массивами.

40
задан JohannesH 17 February 2010 в 20:59
поделиться

2 ответа

Можно обойтись без небезопасного кода, используя 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;
}
63
ответ дан 27 November 2019 в 01:21
поделиться

Это то, что вы ищете?

Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits);
1
ответ дан 27 November 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: