从非托管缓冲区创建图像
Creating an image from an unmanaged buffer
我需要在用 C# 编写的 WPF 应用程序中显示图像。图像内容由外部非托管库生成,它自己分配光栅缓冲区。
我正在尝试使用 Create
方法将该缓冲区包装在 BitmapSource
对象中(作为 Image
控件的 Source
附加),但是该方法需要一个字节数组,而我只有一个 IntPtr
到缓冲区。
有没有办法从非托管缓冲区创建字节数组?最好不要复制? (我知道我正在做的事情是不安全的,但缓冲区保证在应用程序的整个生命周期内持续存在)。
或者是否有其他方法可以将来自非托管缓冲区的光栅图像显示到 Image
或 Canvas
对象或类似对象中?
更新:
我只是错过了 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);
我需要在用 C# 编写的 WPF 应用程序中显示图像。图像内容由外部非托管库生成,它自己分配光栅缓冲区。
我正在尝试使用 Create
方法将该缓冲区包装在 BitmapSource
对象中(作为 Image
控件的 Source
附加),但是该方法需要一个字节数组,而我只有一个 IntPtr
到缓冲区。
有没有办法从非托管缓冲区创建字节数组?最好不要复制? (我知道我正在做的事情是不安全的,但缓冲区保证在应用程序的整个生命周期内持续存在)。
或者是否有其他方法可以将来自非托管缓冲区的光栅图像显示到 Image
或 Canvas
对象或类似对象中?
更新:
我只是错过了 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);