从代码构造位图;什么步骤是必要的?

时间:2009-07-28 07:02:52

标签: c# .net image-processing

我正在使用字节数组在代码中构建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值的字节数组中读取并将它们转换为灰度像素)。还有什么办法可以使这个位图可以保存?

4 个答案:

答案 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