Animation GIF图像在隔行扫描时失真

Animation GIF图像在隔行扫描时失真,animation,imagemagick,gif,imagemagick-convert,interlacing,Animation,Imagemagick,Gif,Imagemagick Convert,Interlacing,我有一些图像是使用Imagemagick及其隔行操作转换的。这些是动画的GIF图像。问题是,在转换过程中,图像发生了扭曲,我没有原始图像,因为前一个开发人员做了这件美妙的事情。GIF不再设置动画,并且每一帧都有4个相同帧的副本,且大小逐渐减小。我以前没有在Imagemagick上做过很多工作 有没有办法从失真的版本中恢复原始图像 使用的命令是: 转换-隔行扫描平面 谢谢图像存储为4个单独的图像 包含每8行图像(大小的1/8) 包含图像中每个缺失的第四行(大小的1/8) 包含图像中丢失的每一条偶数

我有一些图像是使用Imagemagick及其隔行操作转换的。这些是动画的GIF图像。问题是,在转换过程中,图像发生了扭曲,我没有原始图像,因为前一个开发人员做了这件美妙的事情。GIF不再设置动画,并且每一帧都有4个相同帧的副本,且大小逐渐减小。我以前没有在Imagemagick上做过很多工作

有没有办法从失真的版本中恢复原始图像

使用的命令是:

转换-隔行扫描平面

谢谢

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

  • 包含每8行图像(大小的1/8)
  • 包含图像中每个缺失的第四行(大小的1/8)
  • 包含图像中丢失的每一条偶数线(大小的1/4)
  • 包含图像的每一奇数行(大小的1/2)
  • 这样做是为了在通过慢速互联网连接加载时可以看到图像。。。每一个新区块都在增加细节

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

    如果你的文件不再包含动画帧,那么你就倒霉了,但是如果它们存在并且没有渲染,那么请检查文件的GIF结尾是否放错了位置,或者检查它们可能会出错的标志。。。您是否尝试过不同的GIF查看器(有些有bug)

    [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
    
    要做到这一点,您需要解码/流式复制GIF,这并不像听起来那么容易

    见:

    这里是帧复制+解交错+隔行编码的结果(跳过控制/信息/辅助馈送…)


    添加图像示例,这样我们就可以查看它是否真的错了(并查看它是否包含应该包含的内容)。。。这也是GIF87a或GIF89a。。。你在预演什么?您尝试过不同的GIF查看器吗?@Spektre感谢您的回复。我已经添加了图片。添加了重复图片和一些链接+信息来回答。如果您也需要辅助扩展提要,那么您需要自己处理它。另外,时间可能会有点偏离原来的…非常感谢这一点。我已经开始编写一个脚本来完成这项工作,因为我有数百个这样的图像。所以,我必须从图像中读取数据的字节,并尝试在每一帧上找到隔行扫描位并翻转它。如果我错了,请纠正我。@是的,没错。。。看看链接(如何找到图像块在GIF图像中的位置?)从我的答案中有C++源用于处理GIFS…我已经能够找到第一帧的交错位。在这之后,第一帧变得完美。但是,对于其他帧,我仍然找不到它们。我无法确定如何在图像数据块中查找帧。您能帮忙吗?@Nerve您需要处理/skp帧LZW数据,类似于跳过扩展块,当检测到帧的ecnd时,以与第一帧相同的方式搜索下一帧(除了不再有全局调色板)。所有的块都有第一个字节,即块的长度,然后是数据,所以跳过它。。。如果找到终止符块(大小=0),则位于图像帧的末尾。如果我没记错的话,在第一块图像数据之前,有一个字节告诉我有多少位是从开始的。顺便说一句,你的图像有一半以上是辅助控制源,我在回答中修复的没有它们(略小于你原来gif大小的一半)。。。