我正在使用字节数组在代码中构建System.Drawing.Bitmap,我不确定需要设置哪些属性等,以便将其正确保存为.BMP文件。我有Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb);
作为我的构造函数和
for (int i = 1; i < data.Length; i += 2;)
{
Color c = new Color();
c.A = data[i];
c.R = data[i];
c.G = data[i];
c.B = data[i];
int x = (i + 1) / 2;
int y = x / width;
x %= width;
b.SetPixel(x, y, c);
}
作为设置位图数据的代码(它从包含16位little'endian值的字节数组中读取并将它们转换为灰度像素)。还有什么办法可以使这个位图可以保存?
答案 0 :(得分:1)
无需其他任何操作,您可以在设置图像数据后立即保存位图。
另请注意,循环中使用的SetPixel
方法速度非常慢,see this link for more information.
答案 1 :(得分:1)
只需调用Bitmap
方法即可将Save(string filename)
类的实例保存为.bmp文件。
如其他答案中所述,在循环中一次设置一个像素有点慢。
此外,您无法设置Color
结构的属性,您需要按如下方式创建它:
Color c = Color.FromArgb(data[i], data[i + 1], data[i + 2], data[i + 3]);
(不确定数据[]数组中的内容)
答案 2 :(得分:0)
(从i=1
开始看起来很糟糕,顺便说一下 - 应该是0
?)
尝试保存时会发生什么(b.Save("foo.bmp");
)?
也;如果这是一张大图片,您可能需要查看LockBits
;相关帖子是here(虽然它使用的是矩形数组,而不是1维数组)。
答案 3 :(得分:0)
您计算灰度的公式通常不是使用的公式。当然,它会很好地工作,但你很可能想要保持标准。 眼睛更容易接受某些颜色(绿色),因此您通常使用另一种颜色。我会设置这样的颜色;
c.R = 0.3 * data[i];
c.G = 0.59 * data[i];
c.B = 0.11 * data[i];
c.A = 1;
有关详细信息,请参阅Wikipedia article on Grayscale