从double []创建位图

时间:2012-06-23 09:44:51

标签: c# wpf bitmap brightness contrast

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

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

1 个答案:

答案 0 :(得分:2)

首先,您需要将double值数组转换为byte值数组。然后,您可以将此byte值数组写入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,而不冻结对象实例。

要在WPF应用中显示WriteableBitmap,只需将其分配到Source控件的Image属性即可。