web-dev-qa-db-ja.com

半透明のピクセルを保持することにより、ImageMagickで32ビットpngを8ビットpngに変換します

ImageMagickで32ビットpngを8ビットpngに変換したいのですが、半透明のピクセルが失われます。この問題を解決する方法は?私が使用しているコマンドは次のとおりです

convert original.png PNG8:output.png
12
Karmar

どうやら、PNG形式では実際には8ビットインデックスカラーPNGのすべての色を完全にまたは部分的に透明にすることができますが、ImageMagickの「PNG8」 形式指定子 はGIFスタイル1-のみをサポートしますビットの透明度。

PNG8:指定子を使用してnotでImageMagickを使用してインデックス付き8ビットPNGを生成することは可能ですが、単に-colors 256または-colors 255 *を使用して色の数を減らします画像。残念ながら、少なくともImageMagick 6.8.9を使用した私のテストに基づくと、結果の画像には、かなり奇妙で、非常に不必要に醜い色の量子化アーティファクトが含まれています。

幸いなことに、この特定のジョブにははるかに優れたツールがあります: pngquant 。これを使用すると、32ビットRGBA PNGを8ビットカラーマップPNGに変換し、品質の低下を最小限に抑えることができます。

pngquant 256 < original.png > output.png

簡単なデモンストレーションとして、さまざまな方法を使用して8ビットPNGに変換された簡単なテスト画像(半透明のドロップシャドウのある星)を次に示します。

Originalpngquant 256ImageMagick convert (-colors 255)ImageMagick convert (PNG8)ImageMagick convert (-colors 255, PNG8)

左から右へ:

  1. オリジナルの32ビットRGBAPNG
  2. pngquant 256 < input.png > output.pngで量子化
  3. convert input.png -colors 255 output.png *で量子化
  4. convert input.png PNG8:output.pngで量子化
  5. convert input.png -colors 255 PNG8:output.png *で量子化

*)以下のコメントでは、「「背景」色用に1つのエントリを予約する」ために-colors 255が必要であることが示唆されています。私のテストに基づいて、私はこれが実際に当てはまるとは観察していません。 -colors 256を使用しても 8ビットのカラーマップPNGを生成 、量子化アーティファクトは-colors 255の出力と質的に類似していますが、詳細が異なります。それでも、安全にプレイするために、上記の例では-colors 255を使用しました。 pngquant 255を使用したテストでは デモンストレーション になるため、カラーマップのサイズを1色小さくしても、それ自体で結果の品質に大きな影響を与えることはありません。

15
Ilmari Karonen