保存图像时发生通用GDI +错误

时间:2015-10-10 22:17:15

标签: c# bitmap png gdi+

我有以下代码:

static void Main(string[] args)
{
    const int SAMPLE_SIZE = 256 * 256;
    float[] samples = new float[SAMPLE_SIZE];
    using (Bitmap bmp = new Bitmap(SAMPLE_SIZE, 1))
    {
        for (int i = 0; i < samples.Length; ++i)
        {
            int c = (int)(samples[i] * 127 + 128);
            bmp.SetPixel(i, 0, Color.FromArgb(c, c, c));
        }
        bmp.Save("result.png"); //A generic error occurred in GDI+.
    }
}

保存位图时程序崩溃。当我将SAMPLE_SIZE设置为较低值时,不会抛出任何异常。在x64和x86上发生相同的错误。

我尝试保存到中间流,但发生了同样的错误。

using (MemoryStream stream = new MemoryStream())
{
    bmp.Save(stream, ImageFormat.Png);
    stream.WriteTo(fs);
}

为什么会这样? x64上发生错误。它仍然是一个记忆问题吗?图像尺寸为65536x1,就保留的字节数而言并不大。

1 个答案:

答案 0 :(得分:1)

我没有参考方便,但根据我的经验,基于GDI的图形,尤其是位图处理,仅在16位有符号坐标系统中得到完全支持。即绘图坐标限制在-32768和32767之间,位图的最大宽度(或高度)为65535(因为尺寸不能为负)。后者与JPEG的最大值一致。

理论上,PNG可以处理更大的(32位维度),但如果在两个编码器之间共享一些假设JPEG限制的组件,则不会令人惊讶。对不起,我现在无法挖掘参考资料,但如果你看起来足够努力,我希望它能在那里找到。