0

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

我的动机如下:我很快就展示了某些操作的结果,但是从数组到位图源到图像对象的转换太长了,所以我在想一个图像对象,它直接从大批。因此,我可以编写一个方法“update()”而不是进行多次转换。

1/ 这可能吗?

2/ 会更快吗?

3/ 我将如何去做?

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

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

谢谢!

4

1 回答 1

2

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

    // 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);
于 2013-01-12T06:11:57.437 回答