モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

ImageMagickでモノクロpngをリサイズしてさらにrgb化するには

まったくもってごくごく一部の需要しかないと思われる話ですが、 実はワタクシpotraceのフロントエンドとしてmypotraceというモノをpythonで作り、活用しているのであります。

potraceはビットマップの線画をsvgファイルにしてくれるというスグレモノのコマンドで、これに鉛筆原画を食わせてやるとあらびっくり、しゃっきりしたペン画風の絵を吐いてくれるのです。しかし受け付けるファイル形式に偏りがあるというか…

このpotraceを使いこなすことで、鉛筆だけでペン入れしたような絵を描けないか?というのがオイラの野望なわけですが、なかなかそうも行きませんね。とりあえず、鉛筆原画をクリンナップするとかなり違うということまでは分かりました。現状、このpotraceの吐く絵をAzDrawingで修正するというのがオイラのお絵かきワークフローになっております。

まぁ、それはともかく。

このmypotrace、当初は単にbmp/ppm以外のファイルをImageMagickを使って自動変換してpotraceに食わせてsvgを吐かせるというだけのものだったのですが、その後さらに機能拡張しinkscapeの-eオプションでpngに変換するということをさせるようになりました。

ところがどうもこの吐くpngがグレースケールで、しかもAzDrawing 1.4のレイヤとしてに読ませると読み込まないという…rgbに変換してからならOKなのですが、ならばmypotrace側を変えてしまうのが手っ取り早いというわけで、ImageMagickのconvertでrgb変換をさせるにはどうするのか?と言うところでつまづきました。

以下、こんな感じにすれば可能です。なお、-type truecolorではアルファ値が削除されてしまい真っ黒になるので注意。

convert input.png -resize 2000x -colorspace rgb -type truecolormatte output.png

これでok。convertではジオメトリ指定は片方だけ書けばアスペクト比に従い自動調整というのも知らなかったので、勉強になりました。

おまけ:subprocessについて

そういうわけで、potrace/inkscape/convertを縦横無尽にsubprocessモジュールで呼び出すという実に単純なモノがmypotrace.pyなわけであります。

ところで今の今まで知らなかったのですが、

            subprocess.check_call( 
                                     ('convert' ,
                                     tfname,
                                     '-adaptive-resize %s' % geometry,
                                     '-colorspace','rgb','-type','truecolormatte',
                                     postprocess_output
                                     )
            )

こう書くと通りませんね。shell=Trueにしないんなら、ちゃんと全部タプルの要素にして、

            subprocess.check_call( 
                                     ('convert' ,
                                     tfname,
                                     '-adaptive-resize',geometry,
                                     '-colorspace','rgb','-type','truecolormatte',
                                     postprocess_output
                                     )
            )

としないといけませんね。エラーメッセージを見ても一見ではよくわからない感じなので少し悩んでしまいました。

結構subprocessは使ってるのですが、なんか毎度同じヘマをやっているような…(苦笑)