mieki256's diary



2021/08/30(月) [n年前の日記]

#2 [cg_tools] ImageMagick montage の覚書

ImageMagick 7.1.0-5 Q16 x64 を使ってスプライトシートを作ろうとしたけれど、montage に渡す -geometry の値がよく分からなくて少し調べた。

78x78ドットの画像群に対して、周囲に1ドットだけ隙間をつけて、80x80ドットの画像群が並んでる状態の画像を作りたい。この場合、以下のような指定になるのかな。たぶん。
magick montage -geometry +1+1 -background none resize_78x78/*.png spreetsheet.png

ということで、作業時の注意点としては…。 みたいな感じかなと…。

このあたり、以下のページで説明されてるけど、英語だからよく分からん…。

_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 を指定したほうがいいのかな。

アンシャープマスクを使ったほうが良さそう。 :

-unsharp をつけることでアンシャープマスクが使えるらしい。試してみたら縮小後の画像のクッキリ具合が上がった。

となると、以下のような指定がベストなのかな…。大きいドットサイズ(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 をつけてみた。
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

変換結果。 :

以下、変換結果。

アンシャープマスクをかけない版。

spritesheet_not_use_unsharp.png

アンシャープマスクをかけた版。-filter指定無し。(filter = Cubic)

spritesheet_cubic.png

アンシャープマスクをかけた版。-filte Lanczos (filter = SincFast) を指定。

spritesheet_sincfast(lanczos).png

アンシャープマスクを使うとクッキリ具合が全然違う…。また、Lanczos はギラギラ具合が僅かに増えてる気がする。

以上です。

過去ログ表示

Prev - 2021/08 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project