2021/08/30(月) [n年前の日記]
#2 [cg_tools] ImageMagick montage の覚書
ImageMagick 7.1.0-5 Q16 x64 を使ってスプライトシートを作ろうとしたけれど、montage に渡す -geometry の値がよく分からなくて少し調べた。
78x78ドットの画像群に対して、周囲に1ドットだけ隙間をつけて、80x80ドットの画像群が並んでる状態の画像を作りたい。この場合、以下のような指定になるのかな。たぶん。
ということで、作業時の注意点としては…。
このあたり、以下のページで説明されてるけど、英語だからよく分からん…。
_Montage -- IM v6 Examples
以下も参考になりそう。
_画像リサイズ処理のうんちく - Qiita
_画像リサイズのうんちく (補間フィルタ) - Qiita
_ImageMagick リサイズ補間アルゴリズム - Qiita
_ImageMagick の geometry 仕様 - Qiita
_ImageMagickでリサイズする方法 - 箱の中の自由粒子
78x78ドットの画像群に対して、周囲に1ドットだけ隙間をつけて、80x80ドットの画像群が並んでる状態の画像を作りたい。この場合、以下のような指定になるのかな。たぶん。
magick montage -geometry +1+1 -background none resize_78x78/*.png spreetsheet.png
- -geometry +1+1 : 上下左右に1ドットの隙間をつける指定。
- -background none : 背景を透明にする。
- -tile NxN は、フツーは指定しなくてもいい。元画像のファイル数に応じて、縦横に並べる個数を ImageMagick がイイ感じに調整してくれる。
- -geometry 80x80+1+1 と指定すると、元画像を 80x80ドットにリサイズしちゃってから周囲に1ドットの隙間を用意してしまうので、82x82ドットの画像が並んでる状態になってしまう。
ということで、作業時の注意点としては…。
- 元画像を、本来欲しい画像サイズから2ドット分小さくした画像サイズにリサイズしておく。
このあたり、以下のページで説明されてるけど、英語だからよく分からん…。
_Montage -- IM v6 Examples
以下も参考になりそう。
_画像リサイズ処理のうんちく - Qiita
_画像リサイズのうんちく (補間フィルタ) - Qiita
_ImageMagick リサイズ補間アルゴリズム - Qiita
_ImageMagick の geometry 仕様 - Qiita
_ImageMagickでリサイズする方法 - 箱の中の自由粒子
◎ 事前にリサイズしなくても良さそう。 :
もしかして、-geometry 78x78+1+1 と指定しておけば、事前にリサイズしなくても済むのではと気が付いた。例えば元画像が 512x512ドットのサイズでも、自動で78x78ドットに縮小して、かつ、上下左右に1ドット追加して、結果、80x80ドットの画像群を並べてくれるのでは…?
試してみたら、たしかにそんな感じになった。
ただ、-geometry でリサイズするのはやめてね、という話もあるっぽい。-resize を指定しておけば、状況に応じて mitchell か lanczoc のどちらかのアルゴリズムを使ってくれる、とのことで…。であれば、-resize を指定したほうがいいのかな。
試してみたら、たしかにそんな感じになった。
ただ、-geometry でリサイズするのはやめてね、という話もあるっぽい。-resize を指定しておけば、状況に応じて mitchell か lanczoc のどちらかのアルゴリズムを使ってくれる、とのことで…。であれば、-resize を指定したほうがいいのかな。
◎ アンシャープマスクを使ったほうが良さそう。 :
-unsharp をつけることでアンシャープマスクが使えるらしい。試してみたら縮小後の画像のクッキリ具合が上がった。
となると、以下のような指定がベストなのかな…。大きいドットサイズ(512x512)の画像群からいきなりスプライトシート(1つ80x80)を作る例。
となると、以下のような指定がベストなのかな…。大きいドットサイズ(512x512)の画像群からいきなりスプライトシート(1つ80x80)を作る例。
magick montage -resize 78x78 -unsharp 10x5+0.7+0 -geometry +1+1 -background none rgba/*.png PNG32:spritesheet.png
- rgba/*.png は 512x512ドットの画像群。
- 出力画像ファイル名の前に PNG32: をつけて、RGBA各8bitの画像を出力させる。ImageMagick Q16 を使ったせいか、何もつけないとRGBA各16bitの画像が出力されてしまった。
◎ フィルタも選べる。 :
-resize 指定時に -filter を指定することもできるらしい。試しに、-filter Lanczos をつけてみた。
-define filter:verbose=1 をつけると利用してる filter を表示してくれるそうで。
確認してみたところ、-filter Lanczos をつけたら filter = SincFast になった。
ちなみに、filter指定をしないと filter = Cubic になった。
magick montage -filter Lanczos -resize 78x78 -unsharp 10x5+0.7+0 -geometry +1+1 -background none rgba/*.png PNG32:spritesheet.png
-define filter:verbose=1 をつけると利用してる filter を表示してくれるそうで。
magick montage -define filter:verbose=1 -filter Lanczos -resize 78x78 -unsharp 10x5+0.7+0 -geometry +1+1 -background none rgba/*.png PNG32:spritesheet.png
確認してみたところ、-filter Lanczos をつけたら filter = SincFast になった。
# Resampling Filter (for graphing) # # filter = SincFast # window = SincFast # support = 3 # window-support = 3 # scale-blur = 1 # practical-support = 3
ちなみに、filter指定をしないと filter = Cubic になった。
# Resampling Filter (for graphing) # # filter = Cubic # window = Box # support = 2 # window-support = 2 # scale-blur = 1 # practical-support = 2 # B,C = 0.333333,0.333333
◎ 変換結果。 :
以下、変換結果。
アンシャープマスクをかけない版。
アンシャープマスクをかけた版。-filter指定無し。(filter = Cubic)
アンシャープマスクをかけた版。-filte Lanczos (filter = SincFast) を指定。
アンシャープマスクを使うとクッキリ具合が全然違う…。また、Lanczos はギラギラ具合が僅かに増えてる気がする。
アンシャープマスクをかけない版。
アンシャープマスクをかけた版。-filter指定無し。(filter = Cubic)
アンシャープマスクをかけた版。-filte Lanczos (filter = SincFast) を指定。
アンシャープマスクを使うとクッキリ具合が全然違う…。また、Lanczos はギラギラ具合が僅かに増えてる気がする。
[ ツッコむ ]
以上です。