在WPF中创建自定义图像显示作为优化机制

本文关键字:优化 机制 显示 图像 WPF 创建 自定义 | 更新日期: 2023-09-27 17:51:17

我正在对表示16位灰度图像的自定义类进行一些图像处理。像素的强度存储在一个单维短数组中:ushort[] data我也有宽度,高度,dpi,步幅,如果需要的话。

我的动机如下:我显示某些操作的结果相当快,但是从数组到位图源到图像对象的转换太长了,所以我在考虑一个直接从数组绘制其"源"的图像对象。因此,我可以编写一个方法"update()",而不是进行多次转换。

1/这可能吗?

2/它会更快吗?

我该怎么做呢?

我目前绘制图像的方式是使用以下代码(还有更多,但本质上是它的核心)

BitmapSource bmps = BitmapSource.Create(Width, Height, Dpi, Dpi, PixelFormats.Gray16, null,
                                     data, stride); 
image.Source=bmps;

谢谢!

在WPF中创建自定义图像显示作为优化机制

而不是使用单独的数组来存储像素,然后创建BitmapSource来显示结果,我认为使用WriteableBitmap会更好,这样你可以直接在其BackBuffer中存储像素数据(16位灰度值)。因此,您可以编写如下代码:

    // You create "bmp" just once and then update its content when needed
    var bmp = new WriteableBitmap(640, 480, 96, 96, PixelFormats.Gray16, null);
    var imgRect = new Int32Rect(0, 0, bmp.PixelWidth, bmp.PixelHeight);

然后更新图像:

    bmp.Lock();
    ApplySomeFilter(bmp.BackBuffer, ImageFilter.Blur);   // this is just an example ;)
    bmp.AddDirtyRect(imgRect);
    bmp.Unlock();

ApplySomeFilter方法可以使用不安全的代码修改WriteableBitmap的像素数据。


例如,如果ApplySomeFilter是这样定义的:
    unsafe public void ApplySomeFilter(void* imgBuffer, ImageFilter filter)
    {
        // code that modifies pixels goes here
    }

那么你可以这样调用它:

    ApplySomeFilter(bmp.BackBuffer.ToPointer(), ImageFilter.Blur);