なうびるどいんぐ

脳みそ常時-3dB

ImageMagickでICOからPNGを取り出す

      2024/01/24    HimaJyun

PNGからICOに変換する方法はたくさんヒットしますが、その逆のICOからPNGを取り出す方法はイマイチそれっぽい記事がないのでひとつ書きます。

スポンサーリンク

この記事ではお手元のパソコンでちょっと変換して使うくらいの目的でImageMagickを使用しているので、この機能をサーバーサイドに実装するのであれば相応のセキュリティ対策をしてください。

ICOからPNGを作る方法

まず最初に答えを書いておきます。

ICOからPNGを取り出したい時には次のようにします。

magick convert "favicon.ico" -alpha on -background none "favicon.png"

このようにするとICOに含まれていた解像度の分だけ個別にPNGが作成されます。それらの中から使いたい解像度の物を選んで利用(他は削除)してください。

magickコマンドはImageMagickの各種コマンドを呼び出すためのコマンドです。magick convertならconvertmagick identifyならidentifyが呼び出されます。Windows環境ではconvertが既にOS標準コマンドによって使われているため、magick convertでそれを回避している。(Linux環境の人は直接convertコマンドを使用したのでよい)

他の方法

identifyとの併用でICOの中に含まれる複数の画像から1つの画像だけを取り出せます。

magick identify "favicon.ico"

これを実行すると次のようにICOに含まれている解像度の一覧が得られる。

favicon.ico[0] ICO 16x16 16x16+0+0 8-bit sRGB 0.016u 0:00.000
favicon.ico[1] ICO 32x32 32x32+0+0 8-bit sRGB 0.016u 0:00.003
favicon.ico[2] ICO 64x64 64x64+0+0 8-bit sRGB 9070B 0.016u 0:00.004

ファイル名[数字]のような形式になっているので、同じ形式でconvertに渡す事でICOに含まれる複数の解像度の中から1つだけ選ぶことが出来る。

magick convert "favicon.ico[0]" -alpha on -background none "favicon.png"

もしかするとidentifyを使わずに解像度を指定して取り出す方法があるのかも知れないが、知らない。(ICOには同じ解像度の画像を複数入れる事もできるので、解像度だけでは一意的に画像を特定できない。故にそのような事は不可能な気もする)

上手く行かなかった方法

英語でググると次のようなコマンドが出てくるが、これでは上手く行かない。

magick convert "favicon.ico" -thumbnail 16x16 -alpha on -background none -flatten "favicon.png"

パット見では指定した解像度の画像が得られているようにみえるが、この方法だと他の画像をリサイズして目的の解像度を得ているだけ。

どの画像がリサイズ元に使われるのかの基準はよく分からないが、目的の解像度がICOの中に含まれているにも関わらず(他の解像度からリサイズされた)やけに汚い画像が作成される事がある。

余談

自分の場合、ここから更にpngquantでインデックスカラー化している。

その辺もImageMagickでやってしまう方法があると思うが、今のところは間に合っているので調べていない。

 - プログラミング