1

目前我正在开发一个程序,让我以图像的形式处理数据。假设我有对应于图像的数据点(可能是 300 x 300),值范围从 0 到 10000,我想以灰度值显示图像。如果我只是将值范围(0-10000)分成 256 个部分并根据位图形式的灰度值分配它们(我通过将所有颜色设置为相等来使用 rgb),那一切都很好。

然而,用户必须能够改变对比度和亮度。我的意思是:假设对应于黑色的值是 3000(显然下面的所有值也是黑色),对应于白色的值是 5000+。两者之间的值应该与灰色具有线性相关性。用户将有两个滑块,一个用于更改可观察值的范围(在本例中为 2000),另一个用于将范围从 3000-5000 转移到 5000-7000。问题实际上是让滑块实时工作。我试图为每个像素使用一个矩形来模拟图像,但是循环遍历所有矩形并更改它们的颜色实在是太慢了。有谁知道,如何让它工作得又好又顺利?

4

1 回答 1

2

首先,您需要将值数组转换为double值数组byte。然后,您可以将此值数组写入bytea WriteableBitmap。如果您不需要重复更新 的内容WriteableBitmap,您还应该将其冻结以提高性能:

public static ImageSource GetImage(byte[] rawImageBytes, int width, int height)
{
    int channels = 1;
    int stride = width * channels;
    var image = new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray8, null);
    image.WritePixels(new Int32Rect(0, 0, width, height), rawImageBytes, stride, 0);
    image.Freeze();
    return image;
}

如果要更新 的内容WriteableBitmap,可以只调用WritePixels同一个实例而不冻结对象实例。

WriteableBitmap在 WPF 应用程序中显示,只需将其分配给控件的Source属性Image

于 2012-06-23T10:17:11.590 回答