2

歪んだGIF

Imagemagickとそのインターレース操作を使用して変換された画像がいくつかあります。これらはアニメーションGIF画像でした。問題は、変換中に画像が歪んでしまい、素晴らしいことをしたのは前の開発者だったので、元の画像が手元にないことです。GIFはもはやアニメーション化されておらず、各フレームには同じフレームの 4 つのコピーがあり、サイズが小さくなっています。私はこれまでImagemagickにあまり取り組んだことがありません。

歪んだバージョンから元のイメージを復元する方法はありますか?

使用したコマンドは次のとおりです。

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

ありがとう

4

1 に答える 1

3

インターレース GIF画像は 4 つの画像として保存されます

  1. 画像の 8 行ごとに含まれる (サイズの 1/8)
  2. 欠落している画像の 4 行目 (サイズの 1/8) をすべて含む
  3. 画像の欠けている偶数行をすべて含む (サイズの 1/4)
  4. 画像のすべての奇数行を含む (サイズの 1/2)

これは、低速のインターネット接続を介して読み込み中に画像を表示できるようにするためです...新しいチャンクごとに詳細が増加します...

したがって、画像が 4 つの非常によく似た画像のように見える場合、結果は問題ありません。誤ってデコードするか、GIF に Interlaced フラグが設定されていません。

ファイルにアニメーション フレームが含まれていない場合は運が悪いですが、それらが存在し、レンダリングされていない場合は、ファイルの GIF の終わりが間違って配置されていないことを確認するか、フラグが台無しになっている可能性があることを確認してください...別の方法を試しましたか? GIF ビューア (バグのあるものもあります)

[編集1] 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 をデコード/ストリーム コピーする必要がありますが、これは思ったほど簡単ではありません。

見る:

ここでは、フレーム コピー + デインターレース + インターレース エンコードの結果 (制御/情報/補助フィードのスキップ ...)

修復画像

于 2015-11-09T08:08:24.303 に答える