相关疑难解决方法(0)

Windows /.NET的System.Drawing.Save(Stream,ImageFormat)中的错误.腐败的PNG产生了

在某些非常特殊的情况下,System.Drawing.Save(Stream,Imageformat)会创建损坏的PNG图像.

有没有办法避免它,这样:

  1. 我不需要使用第三方库,而且
  2. 我不需要检查PNG字节来知道我是否需要"修复"某些东西?

重现步骤

  1. 创建一个System.Drawing.BitMap
  2. 向图像添加内容,以便产生非常特定的PNG文件大小("何时发生")
  3. 调用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)

.net c# windows gdi+

5
推荐指数
1
解决办法
203
查看次数

标签 统计

.net ×1

c# ×1

gdi+ ×1

windows ×1