8

シネマグラフのサイズ変更に問題があります。わからない場合は、画像全体がアニメーション化される通常のgifと比較して、画像の一部のみがアニメーション化されるgifです。node.jsの例を次に示します。

// ![http://i.imgur.com/Qb1m0.gif][1]

var gm = require('gm')

var file = 'Qb1m0.gif',
    frags = file.split('.')

gm(file)
  //.noProfile()
  //.quality(80)
  .resize(200, 200)
  .write(frags[0] + '_200.' + frags[1], function(err) {
    if (err) console.error(err)
  })

// Result:
// ![http://i.imgur.com/eFqak.gif][2]

同等のcmdラインコードは次のとおりです。

gm convert Qb1m0.gif -resize 200x200 cinema_200.gif

何が起こっているのか知っていますか?

オリジナルのアニメーションGIF:

オリジナル

サイズ変更されたアニメーションGIF:

サイズ変更

4

3 に答える 3

20

私はGraphicsMagickよりもImageMagickをよく知っています。ImageMagick の場合、次のステートメントが適用されます。

  • GIFに透明度が含まれている場合、単純なコマンドライン(あなたが指定したものなど)でアニメーションGIFのサイズを直接変更することはほとんど不可能です.

  • アニメーション GIF に透明度が含まれていない場合は、これを行うことさえ困難です。

これは、GraphicsMagick でも同じだと思います。

背景説明

元の GIF をidentifyで見ると、各フレームの寸法が同じではないことがわかります。

Qb1m0.gif を識別します
 Qb1m0.gif[1] GIF 720x416 720x416+0+0 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[1] GIF 471x122 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[2] GIF 471x121 720x416+160+76 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[3] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[4] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[5] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[6] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[7] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[8] GIF 471x122 720x416+160+76 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[9] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.009
 Qb1m0.gif[10] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.000
 Qb1m0.gif[11] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.000
 Qb1m0.gif[12] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.000
 Qb1m0.gif[13] GIF 471x122 720x416+160+76 8 ビット PseudoClass 256c 920KB 0.000u 0:00.000
 Qb1m0.gif[14] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.000
 Qb1m0.gif[15] GIF 471x123 720x416+160+75 8 ビット PseudoClass 256c 920KB 0.000u 0:00.000

これらのサイズの違いは、ファイル サイズを縮小するためにアニメーション GIF に適用されたフレームの最適化の結果です。

他の最適化も行われており、使用する色の数を減らしています。これらのタイプの最適化は両方とも、-resize操作とうまく組み合わせられません。

-resize単一の画像用に設計されており、結果の単一の画像を可能な限り見栄えよくします。これにより、画像に新しい色の値が追加されることがよくあります。これは、厳密に制限されたカラー テーブル (最大 256 色) を使用するという GIF の設計と矛盾しています。アニメーション シーケンスでは、次の画像/フレーム-resizeは、生成された前のものとはまったく異なるカラー テーブルになる場合がありますが、アニメーションを適切に機能させるには、すべてのフレームで共通のカラー テーブルが必要です。

-resizeすべてのフレーム画像を他の画像とは完全に個別に処理し、「フレームの最適化」を考慮しません (共通のキャンバスに配置されたフレームごとに異なる幅と高さを独自のオフセットで作成する傾向があります)。

したがって、サイズ変更された画像は、アニメーション GIF の複数のフレームは言うまでもなく、単一の画像を制限された GIF ファイル形式に保存するには理想的とは言えません。その結果、サイズ変更された画像の色が大幅に減少します。

次に、透明性の問題があります。ほとんどのアニメーション GIF は、透明性を多用しています。透明度は、通常は画像の外観に透明度がまったく必要ない場合でも、圧縮の最適化を達成するためによく使用されます。

この場合何が起こるか:-resizeオーバーレイ画像に半透明のピクセルを作成します。画像が GIF ファイル形式に保存されると、これらのピクセルは完全な透明度または完全な不透明度に変換されます。どちらも、元の色から離れた結果​​のアニメーションに大きな色の歪みを生じさせます。

一般的な手順

一般的に、アニメーション GIF のサイズを変更する最良の手順は次のとおりです。

  1. アニメーションを合体 (最適化解除) します。これにより、アニメーションのすべてのフレームに対して同じサイズの個々の画像が作成されます。

  2. アニメーションの完全な GIF 最適化シーケンスを実行します。フレームの最適化だけでなく、色の最適化も行います。

「シンプル」コマンド

「単純な」サイズ変更コマンドを実行して運試しするには、次のようにします。

convert                        \
  http://i.imgur.com/Qb1m0.gif \
 -coalesce                     \
 -resize 200x200               \
  cinema_200.gif

結果:

 結果

このコマンドは、フレームの最適化の問題を回避します。これにより、ファイル サイズが大きくなるという犠牲を払って、これに起因する問題が修正されます。

ただし、サイズ変更されたフレームはひどくエイリアシングされるため、エッジに関しては「階段」アーティファクトが表示される場合があります。これは、アンチエイリアシングにはエッジの周りに半透明の色が必要ですが、GIF は-resizeオペレーターによって生成された半透明の色を保存できないためです。

于 2012-09-06T20:01:40.700 に答える
0

gifsicleツールを使用した ImageMagick ソリューションとは無関係の非常に優れたソリューションもあります。生成される gif ははるかに小さく、ちらつきの問題もありません。また、特別なコマンドライン引数がないため、非常にシンプルで、はるかに高速に動作します。次のように使用します。

gifsicle --scale 0.25 -i input.gif > output.gif 

また

gifsicle --resize 24x24 -i input.gif > output.gif
于 2020-09-25T12:24:01.013 に答える