目前我正在开发一个程序,可以让我以图像的形式处理数据。 假设我有与图像对应的数据点(可能是300 x 300),值的范围是0到10000,我想以灰度值显示图像。如果我只是将值范围(0-10000)拆分为256个并根据位图形式的灰度值分配它们(我通过将所有颜色设置为相等来使用rgb),那就没关系了。
但是,用户必须能够改变对比度和亮度。我的意思是: 假设对应于黑色的值是3000(显然下面的所有值也都是黑色),对应于白色的值是5000+。中间的值应该与灰色颜色呈线性关系。用户将有两个滑块,一个用于更改可观察值的范围(在本例中为2000),另一个用于移动范围,例如从3000-5000到5000-7000。 问题实际上是让滑块实时工作。我试图用每个像素的一个矩形模拟图像,但循环遍历所有矩形并改变它们的颜色太慢了。 有没有人有任何想法,如何使它工作得很好和顺利?
答案 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
属性即可。