GIF图像在隔行扫描时变形

时间:2015-11-08 13:10:02

标签: animation imagemagick gif imagemagick-convert interlacing

Distorted GIF

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

有什么办法可以从扭曲的版本中恢复原始图像吗?

使用的命令是:

Arrays.sort(files, new CustomFileNameOrderingComparator());

由于

1 个答案:

答案 0 :(得分:2)

interlaced GIF图像存储为4个分离的图像

  1. 包含每8行图像(1/8大小)
  2. 包含每个缺失的第4行图像(1/8大小)
  3. 包含每个缺失的偶数行图像(1/4大小)
  4. 包含每个奇数行的图像(1/2的大小)
  5. 这样做可以在通过缓慢的互联网连接加载时看​​到图像...增加每个新块的细节...

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

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

    解码GIF后

    [Edit1]

    你有 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,这听起来并不那么容易。

    请参阅:

    这里帧复制+去隔行+隔行编码的结果(跳过控制/信息/辅助馈送......)

    repaired image