从非托管缓冲区创建图像

Creating an image from an unmanaged buffer

我需要在用 C# 编写的 WPF 应用程序中显示图像。图像内容由外部非托管库生成,它自己分配光栅缓冲区。

我正在尝试使用 Create 方法将该缓冲区包装在 BitmapSource 对象中(作为 Image 控件的 Source 附加),但是该方法需要一个字节数组,而我只有一个 IntPtr 到缓冲区。

有没有办法从非托管缓冲区创建字节数组?最好不要复制? (我知道我正在做的事情是不安全的,但缓冲区保证在应用程序的整个生命周期内持续存在)。

或者是否有其他方法可以将来自非托管缓冲区的光栅图像显示到 ImageCanvas 对象或类似对象中?


更新:

我只是错过了 BitmapSource.Create 的重载需要一个 IntPtr ! (虽然我不知道这是否复制了图像。)

为了从非托管原始像素缓冲区创建 BitmapSource,请使用 BitmapSource.Create 方法,例如像这样:

PixelFormat format = PixelFormats.Bgr24;
int width = 768;
int height = 576;
int stride = (width * format.BitsPerPixel + 7) / 8;
int size = stride * height;

IntPtr buffer = ...

BitmapSource bitmap = BitmapSource.Create(
    width, height, 96, 96, format, null, buffer, size, stride);

如果您想循环更新图像元素的源,覆盖单个 WriteableBitmap 的缓冲区可能比在每个循环中使用新的 BitmapSource 重新分配图像的源更有效。

我建议使用 WriteableBitmap。虽然这确实需要一个副本,但它应该不需要任何分配,我希望性能能够很好地满足实时取景的要求。

myWriteableBitmap.WritePixels(
    new Int32Rect(0, 0, width, height),
    bufferPointer,
    bufferSize,
    stride);