Bitmap.Save创建空文件

时间:2019-08-15 05:51:57

标签: c# bitmap xna drawing

它始于此:Application runs out of memory while saving textures to PNG files

由于没有解决方案,并且SaveAsPng方法只会消耗内存,因此我继续制作自己的Png保护程序算法。现在,如果可能的话,我将很乐意避免学习PNG格式的确切规范,而只是使用现有算法对我的颜色数据进行正确编码,因此我研究并找到了System.Drawing库和Bitmap.Save()方法。

我写下了png保存代码,使其运行,正在创建文件。都是空的。它为我提供了格式正确的格式(至少Photoshop并没有抱怨要打开它们)带有肥大0-es的png文件,应该是彩色数据。

我已经测试了从XNA纹理提取的数据是否正确。它是。我测试了一下Bitmap对象中的数据是否正确。它是。因此,我回到了开始的地方:我进行了所有设置,然后使用一种用于实际保存数据的方法将我弄糟了。

void savePng(Texture2D tex, string path)
{
    Color[] colorData = new Color[tex.Width * tex.Height];
    tex.GetData(colorData);

    //Console.WriteLine(colorData[12810].ToString());

    byte[] rawData = new byte[4 * colorData.Length];

    for (int i=0; i<rawData.Length; i++)
        {
        switch (i%4)
            {
            case 0:
                rawData[i] = colorData[i/4].A;
            break;

            case 1:
                rawData[i] = colorData[i/4].R;
            break;

            case 2:
                rawData[i] = colorData[i/4].G;
            break;

            case 3:
                rawData[i] = colorData[i/4].B;
            break;
            }
        }

    IntPtr pointer = Marshal.AllocHGlobal(rawData.Length);
    Marshal.Copy(rawData, 0, pointer, rawData.Length);

    using (System.Drawing.Bitmap b = new System.Drawing.Bitmap(tex.Width, tex.Height, tex.Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppPArgb, pointer))
        {
        //Console.WriteLine(b.GetPixel(10, 10).ToString());
        b.Save(path, System.Drawing.Imaging.ImageFormat.Png);
        }

    Marshal.FreeHGlobal(pointer);
}

至少它不会像泰坦尼克号那样泄漏内存。有人可以解释空白文件吗?好吗?

0 个答案:

没有答案