C#将2D双精度数组转换为灰度图像
问题描述:
第一次使用C#在这里工作。我正在读几个图像文件,做一些计算,并输出和双数组。我需要能够保存这个双数组(或这些,因为我将有多个数组),以灰度图像。我在互联网上四处寻找,我找不到太多东西。我已经在Python和Mathlab上完成了它,但是C#似乎并不像我那么友好。这是我迄今为止所做的(用于双重图像创作)。C#将2D双精度数组转换为灰度图像
static Image MakeImage(double[,] data)
{
Image img = new Bitmap(data.GetUpperBound(1), data.GetUpperBound(0));
//Bitmap bitmap = new Bitmap(data.GetUpperBound(1), data.GetUpperBound(0));
for (int i = 0; i < data.GetUpperBound(1); i++)
{
for (int k = 0; k < data.GetUpperBound(0); k++)
{
//bitmap.SetPixel(k, i, Color.FromArgb((int)data[i, k],(int) data[i, k],(int) data[i, k]));
}
}
return img;
}
}
}
这段代码实际上没有做多少。它创建我的空白图像模板。颜色不需要双重作为输入。我不知道如何从数据创建图像...我卡住=)
谢谢你提前。
答
如果你能接受使用不安全块,这是相当快的:
private Image CreateImage(double[,] data)
{
double min = data.Min();
double max = data.Max();
double range = max - min;
byte v;
Bitmap bm = new Bitmap(data.GetLength(0), data.GetLength(1));
BitmapData bd = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
// This is much faster than calling Bitmap.SetPixel() for each pixel.
unsafe
{
byte* ptr = (byte*)bd.Scan0;
for (int j = 0; j < bd.Height; j++)
{
for (int i = 0; i < bd.Width; i++)
{
v = (byte)(255 * (data[i, bd.Height - 1 - j] - min)/range);
ptr[0] = v;
ptr[1] = v;
ptr[2] = v;
ptr[3] = (byte)255;
ptr += 4;
}
ptr += (bd.Stride - (bd.Width * 4));
}
}
bm.UnlockBits(bd);
return bm;
}
[转换图像灰度(可能重复http://stackoverflow.com/questions/2265910/convert-an-图像到灰度) – 2014-09-26 20:37:48
您的代码没问题,数据的内容是什么? – brz 2014-09-26 20:58:13
嗨,代码目前只创建一个新的位图图像。我的问题是,我希望能够获取某个DOUBLE [,]数据并将其制作为图像。例如:[[1.1,2.5],[4.2,3.3]] - >里面有这些数据的图片(位图图像)。 (现在,它创建一个空白图像,并且注释部分创建一个INTEGER图像)。 – IHaveSumQuestions 2014-09-27 20:50:28