当前位置: 首页 > 编程语言 > C#

Windows-.NET的System.Drawing.Save(Stream,ImageFormat)错误,损坏的PNG在Windows-.NET的System.Drawing.Save(Stream,ImageFormat)中产生Share

时间:2023-04-10 16:02:33 C#

Error。生成损坏的PNG在某些非常特殊的情况下,System.Drawing.Save(Stream,Imageformat)会创建损坏的PNG图像。有没有办法避免它,例如:我不需要使用3rd方库,我不需要检查PNG字节来知道我是否需要“修复”某些东西?重现步骤创建System.Drawing.BitMap将内容添加到图像中,以便生成非常特定的PNG文件大小(“发生时”)调用Save(Stream,Imageformat)-选择PNG格式有什么问题?问题是最后一个图像数据之后的IDAT块不正确。它不包含数据,但长度字节为0000fff4。可以使用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”:这是通过加载第一个并再次保存创建的。我想我记得这是一个潜在的解决方法,但是当我现在运行它时,第二个文件包含相同的错误...使用系统;使用系统绘图;使用System.Drawing.Imaging;使用System.IO;namespaceCreateCorruptPng{classProgram{staticvoidMain(string[]args){//选择0x1001C+0x10000*n;n=0、1、2、3、4以获得损坏的PNGinttargetOutputSizeBytes=0x5001C;//你可能需要摆弄这些参数来//成功创建一个精确大小的图像。intwidthPixels=2000;int高度=1200;varcreator=newPngCreator(widthPixels,height);字符串输出路径=".";);creator.SaveCurrentImage(Path.Combine(outputPath,"constructed.png"));creator.SaveAfterSecondExport(Path.Combine(outputPath,"constructedReExport.png"));}}公共类PngCreator{位图_img;整数_宽度;诠释_高度;int_maxPixcount;publicPngCreator(intw,inth){_width=w;_height=h;_maxPixcount=w*h;}publicvoidTryCreateWithSize(intrequiredByteCount){Console.WriteLine($"正在尝试创建恰好{requiredByteCount}字节的png文件。");Console.WriteLine($"图像尺寸(wxh)={_width}x{_height}。");int下界=0;intupperBound=_maxPixcount;布尔成功=假;while(upperBound>lowerBound+1){InitImage();intpixelCount=(upperBound+lowerBound)/2;添加像素(像素计数);intcurrentSize=GetPngByteCount();如果(currentSize==requiredByteCount){success=true;休息;}if(currentSize