在保存映像时发生通用的GDI+错误

本文关键字:GDI+ 错误 保存 映像 | 更新日期: 2023-09-27 18:17:01

我有以下代码:

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,就保留的字节而言,这并不是那么大。

在保存映像时发生通用的GDI+错误

我手头没有参考资料,但根据我的经验,基于gdi的图形,特别是位图处理,只有在16位符号坐标系统中才完全支持。即绘图坐标限制在-32768和32767之间,位图的最大宽度(或高度)将是65535(因为尺寸不能为负)。后者与JPEG的最大值一致。

PNG理论上可以处理更大的尺寸(32位尺寸),但如果两个编码器之间共享某些组件并假定JPEG限制,也就不足为奇了。对不起,我现在找不到参考资料,但我希望如果你足够努力的话,它就在那里。