PNG画像ファイルの描画

(別ブログからの移転)

 PhotoShopで作成した画像を「一般RGBプロファイル」でアルファチャンネル付きでPNGを作成すると、32ビットRGBになる。
これは、CGBitmapContextCreateがサポートするPNGフォーマットではあるのだが、組み込み系の画像としては馬鹿でかく、とてもじゃないが使えない。マンガアプリの場合、画像ファイル数も多くなるので、このフォーマットではユーザーに多大なDL時間を強いることになり、アプリがiPhone/iPadストレージを圧迫してしまう。
 マンガの場合、カラーページはごくわずかであり、ほとんどがモノクロだ。そのため、32ビットも必要なく、色数的には16色(4ビット)あれば十分表現できる(239色や256色と比較しても遜色ない(透過とは無縁のため、アルファチャンネルも必要ない))。そこで、CGBitmapContextCreateがサポートするPNGフォーマットのリストにある「8ビットグレースケール」への変換を通して、サイズ縮小を試みた。

結論:
 32ビットRGBA → アルファチャンネル削除 → 16色(4ビット)へ減色(インデックスカラー) → グレースケール
 (※この一連の作業を、スクリプトとシェルを組み合わせてバッチ実行)

(1)32ビットRGBA → グレースケールへの変換
 Photoshop、OPTPiX、GIMP2の3つで試してみた。
 まずカラー減色では秀逸のOPTPiXは、ツールの特性上、当然かもしれないがグレースケールへの変換はサポートしていない(RGBとインデックスカラーのみ(グレースケール風のRGBなどにはできる))。
 残るPhotoshopとGIMP2だが、個人的にはGIMP2をおすすめする。

   サイズ
32ビットRGBPNGをグレースケールに変換した際のサイズは、GIMP2の方が小さい

元画像 410KB (512 * 1024、239色)
   変換後画像 Photoshop 315KB
GIMP2 229KB

   ツールの値段
現在、Photoshopでマンガの画像に大して作業する人間は別におり、
Photoshopを持っていないプログラマーの私としては、画像変換だけのために高い金額を支払うのはあり得ない。
    GIMP2はオープンソースのため、無償で利用できる。iPhone開発者にとっては嬉しい。

   バッチ実行
画像変換は機械的に一括でバッチ実行できることが望ましい(人間作業では変換ミスもでるし、作業者は大量にページを処理する必要があるので、とてもじゃないがやってられない)。
GIMP2はスクリプトを組むことができるため、Photoshopで作成した画像を一括変換かけるにはもってこいだ。

(2)減色の有効性
 普通にマンガをスキャンして画像にした場合、239色程度のモノクロ画像になっている。ただ、先にも書いたが、マンガのモノクロ画像の場合、16色で十分だ。そこで、32ビットRGBAをグレースケールに変換する前に、一旦色数を落としてから変換すればサイズ減少に寄与できると考えた。

元画像 410KB (512 * 1024、239色)
   変換後画像 GIMP2(減色なし) 229KB
GIMP2(16色に減色)  131KB

 結果としては、大幅にサイズ縮小が実現できた。ちなみに減色で秀逸なOPTPiXで16色にしてからGIMP2でやってみるとどうか、と試してみたが、サイズ的にはGIMP2で減色する場合とほとんど変わらなかった。
 (GIMPでの減色方法:画像→モード→インデックス→「最適パレットを作成」で最大色数を16色)

CGImageリファレンス
CGBitmapContextリファレンス
CGBitmapContextCreate Supported Color Spacesjp
Quarts 2D Programming
 Graphics Contexts
 Bitmap Images and Image Masks

モノクロ(白黒)電子書籍(eBook)の容量を小さくする方法
Alphaチャネル合成グレースケールの作り方

GIMP Python Documentation