在某些非常特殊的情况下,System.Drawing.Save(Stream,Imageformat)会创建损坏的PNG图像.
有没有办法避免它,这样:
重现步骤
问题是什么?
问题是最后一个图像数据后的IDAT块不正确.它包含NO数据,但长度字节为00 00 ff f4.可以使用https://github.com/jsummers/tweakpng检测它.我们注意到Linux上的图像库(不确定哪些)无法处理这样的错误.据我们所见,在Windows中这个错误被忽略了,你不会发现任何问题.
什么时候发生?
这取决于PNG文件的大小.如果生成的PNG文件大小(以字节为单位)为0x1001C + n*0x10000且n 0,1,2,3,4且可能更大,则只会出现此问题.
它是可重复的
可以调整步骤2以产生特定的PNG文件大小(例如,在其他空的BitMap中为不同数量的像素着色).当尺寸如上所述时,错误一直发生.
代码重现
在干净的控制台应用程序中替换Program.cs的内容.运行程序时,它将尝试创建具有指定大小的PNG并将其另存为"construct.png".
另外:第二个PNG保存为"constructReExport.png":这是通过加载第一个并再次保存来创建的.我想我记得这是一个潜在的解决方法,但是当我现在运行时,第二个文件包含相同的错误...
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace CreateCorruptPng
{
class Program
{
static void Main(string[] args)
{
// Choose 0x1001C + 0x10000 * n; with n = 0, 1, 2, 3, 4 to get corrupt PNG
int targetOutputSizeBytes = 0x5001C;
// You may need to fiddle with these parameters to
// …
Run Code Online (Sandbox Code Playgroud)