2015-11-08 52 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