保存图像时出现一般 GDI+ 错误

A generic GDI+ error occurs when saving an image

我有以下代码:

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 的图形,尤其是位图处理,仅在 16 位带符号坐标系中得到完全支持。 IE。绘图坐标限制在 -32768 和 32767 之间,位图的最大宽度(或高度)为 65535(因为尺寸不能为负)。后者与 JPEG 的最大值一致。

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