2015-11-08 23 views
1

Distorted GIFGIF图像失真得到关于隔行

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

有没有什么办法可以从失真的版本恢复原始图像?

的命令所用的是:

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

由于

+0

添加图片例如,我们可以看看它是否真的是错误的(并且看看它是否包含它应该或不包含的内容)......也就是GIF87a或GIF89a ...您正在预览什么?你有没有尝试过不同的GIF查看器? – Spektre

+0

@Spektre感谢您的回复。我已经添加了图像。 – Nerve

+0

添加了repiared图片和一些链接+信息来回答。如果您还需要辅助扩展Feed,则需要自行处理。时间可能会从原来的一点点... – Spektre

回答

2

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

  1. 含有图像的每一第八行(大小的1/8)
  2. 包含每一个缺失的第四行图像(1/8的大小)
  3. 含有每丢失偶数行图像的(尺寸的1/4)
  4. 包含图像的每个奇数行(尺寸的1/2)

这是这样做的图像,同时装载可见通过缓慢的互联网连接...增加每个新块的细节...

因此,如果您的图像看起来像4个非常相似的图像, 。

如果你的文件不再包含动画帧,那么你运气不好,但如果他们在那里,并没有渲染,然后检查文件的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 

要做到这一点,你需要解码/流复制GIF,这听起来并不那么容易。

见:

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

repaired image

+0

非常感谢这一点。我已经开始编写脚本来完成这个任务,因为我拥有数百个这样的图像。所以,我必须从图像中读取数据的字节并尝试在每一帧上找到交错位并将其翻转。如果我错了,请纠正我。 – Nerve

+0

@Nerve是的确实...看看链接[如何找到Image Block在GIF图像中的起始位置?]从我的答案中,有用于处理GIF的C++源... – Spektre

+0

我已经能够找到隔行扫描位为第一帧。之后的第一帧变得完美。但是,我仍然无法找到他们的其他框架。我无法确定如何查找图像数据块中的帧。你能帮我吗? – Nerve