GIF 图像在隔行扫描时失真

GIF Image getting distorted on interlacing

我有一些图像是使用 Imagemagick 及其隔行扫描操作转换的。这些是 GIF 动画图像。问题是,在转换时,图像扭曲了,我没有原始图像,因为是以前的开发人员做了很棒的事情。 GIF 不再具有动画效果,每个帧都有 4 个相同帧的副本,尺寸逐渐减小。我之前没有在 Imagemagick 上做太多工作。

有什么办法可以把变形后的图片恢复原图吗?

使用的命令是:

convert <old-file.gif> -interlace plane <new-file.gif>

谢谢

interlaced GIF 图像存储为 4 个单独的图像

  1. 每第 8 行包含图像(大小的 1/8)
  2. 包含所有缺失的第 4 行图像(大小的 1/8)
  3. 包含图像中所有缺失的偶数行(大小的 1/4)
  4. 包含图像的每个奇数行(大小的 1/2)

这样做是为了在通过慢速 Internet 连接加载时可以看到图像...增加每个新块的细节...

因此,如果您的图像看起来像 4 张非常相似的图像,那么结果是可以的,您只是错误地解码了它,或者 GIF 没有设置隔行扫描标志。

如果您的文件不再包含动画帧,那么您就不走运了,但是如果它们在那里并且没有渲染,那么请检查文件的 GIF 结尾是否错位或检查标志,它们可能被搞砸了.. . 你有没有试过不同的 GIF 查看器(有些有问题)

[Edit1] 解码 GIF 之后

你得到了 GIF89a 并且你在每一帧中都缺少隔行扫描标志。所以图像是正确交错的,但观众认为它根本不是交错的......你需要在每个帧头中标记交错标志。

struct _img // this is image frame header
    {
    // Logical Image Descriptor
    BYTE Separator;         /* Image Descriptor identifier 0x2C */
    WORD x0;                /* X position of image on the display */
    WORD y0;                /* Y position of image on the display */
    WORD xs;                /* Width of the image in pixels */
    WORD ys;                /* Height of the image in pixels */
    BYTE Packed;            /* Image and Color Table Data Information */
    } img;

img.Packed|=64; // this will set the interlaced flag

为此,您需要 decode/stream 复制 GIF,这并不像听起来那么容易。

见:

  • Decode data bytes of GIF87a raster data stream

这里是帧复制+去隔行+隔行编码的结果(跳过control/info/auxiliary feeds ...)