2015/02/15(日) [n年前の日記]
#1 [cg_tools] ImageMagickで減色の実験
キャラクター仮画像のファイルサイズが大き過ぎるので、何かしら減色処理をして減らせないかなと試行錯誤中。
ひとまず、ImageMagick を使って実験。環境は、Windows7 x64 + ImageMagick 6.8.7-8 Q16 x86。
以下を参考にしながらテスト。
_Threshold Dithering Methods -- Quantization -- IM v6 Examples
_Ordered Dither using Uniform Color Levels -- Quantization -- IM v6 Examples
_Color Quantization and Transparency -- Quantization -- IM v6 Examples
以下の指定で、フルカラー画像をRGBA4444に ―― 4096色の範囲に収められないか実験。
-ordered-dither ○○○ で、ディザのかけ方を変えられる。
アルファチャンネルの2値化も試してみたけど、輪郭が凸凹した状態になってしまって悩んだり。DOS窓上で、コマンドを以下のように直接打つと、期待通りの結果になるのだけど。
原因が分かった。batファイルの中で「50%」と記述しただけでは「%」が無くなってしまう。batファイル中で「%」をコマンド等に渡したい場合は、「%%」と書かないといけない。コレ、前にもハマったような…。
とりあえず、以下のようなbatファイルを書いて、アルファチャンネルの2値化と4096色化をしてみたり。
_CPシステムII - Wikipedia によると、「最大同時発色数: 4096色」とあるので…。昔風の2Dゲームを作る場合は、4096色(RGB各チャンネルが4bit分)あれば間に合うんじゃないかなと。
ひとまず、ImageMagick を使って実験。環境は、Windows7 x64 + ImageMagick 6.8.7-8 Q16 x86。
以下を参考にしながらテスト。
_Threshold Dithering Methods -- Quantization -- IM v6 Examples
_Ordered Dither using Uniform Color Levels -- Quantization -- IM v6 Examples
_Color Quantization and Transparency -- Quantization -- IM v6 Examples
以下の指定で、フルカラー画像をRGBA4444に ―― 4096色の範囲に収められないか実験。
mogrify -ordered-dither threshold,16 *.png
- mogrify は、複数の画像に対して処理ができるコマンド。
- 1枚の画像に対して処理をする際は convert を使うけど、複数画像を一括して処理したいときは mogrify を使う。
- mogrify を使うと、元画像は処理後の画像で上書きされる。
- -ordered-dither threshold,16 の指定で、RGBの各チャンネルを16段階(= 4bit分)にしてる、のではないかと思う。たぶん。
- *.png の指定で、カレントディレクトリ内の *.png 全てに対して処理をする。
-ordered-dither ○○○ で、ディザのかけ方を変えられる。
- threshold 〜 で2値化。
- checks で市松模様。
- o2x2、o4x4、o8x8 等でディザ。
アルファチャンネルの2値化も試してみたけど、輪郭が凸凹した状態になってしまって悩んだり。DOS窓上で、コマンドを以下のように直接打つと、期待通りの結果になるのだけど。
mogrify -channel A -threshold 50% *.pngコレをbatファイルに書いても動作してくれない。
原因が分かった。batファイルの中で「50%」と記述しただけでは「%」が無くなってしまう。batファイル中で「%」をコマンド等に渡したい場合は、「%%」と書かないといけない。コレ、前にもハマったような…。
とりあえず、以下のようなbatファイルを書いて、アルファチャンネルの2値化と4096色化をしてみたり。
@echo off @rem アルファチャンネルを50%で2値化 @rem RGB444に変更 SET CVT=C:\Prog\ImageMagick-6.8.7-Q16\mogrify.exe for /d %%a in (.\*) do ( echo convert %%a\*.png cd %%a %CVT% -channel A -threshold 50%% *.png @rem %CVT% -channel A -ordered-dither checks *.png @rem %CVT% -ordered-dither threshold,16 *.png %CVT% -ordered-dither checks,16 *.png cd .. )for /d %%a in (.\*) do ( 〜 ) で、カレントディレクトリ内のサブフォルダ群に対して処理をする。この場合、%%a にサブフォルダ名が入る。
_CPシステムII - Wikipedia によると、「最大同時発色数: 4096色」とあるので…。昔風の2Dゲームを作る場合は、4096色(RGB各チャンネルが4bit分)あれば間に合うんじゃないかなと。
◎ ポスタライズの動作がよく分からず。 :
ポスタライズって、てっきり、RGBの上位何ビットだけを残すか、という処理かと思ってたけど、ImageMagick で試してみたらどうもそういう感じに見えなくて。
_Quantization -- IM v6 Examples を眺めてみたら、
手元で試してみたら、盛大に画像が壊れたというか、妙な場所に大きい四角形のグレー部分ができてしまった。このあたり、仕様なのかバグなのか、よく分からない。
_Quantization -- IM v6 Examples を眺めてみたら、
- 2 を指定すると 8色。
- 3 を指定すると 27色。
- 4 を指定すると 64色。
- 5 を指定すると 125色。
- 6 を指定すると 216色。
手元で試してみたら、盛大に画像が壊れたというか、妙な場所に大きい四角形のグレー部分ができてしまった。このあたり、仕様なのかバグなのか、よく分からない。
[ ツッコむ ]
以上、1 日分です。