Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

imagemagickで斜めの枠にあわせて画像を回転させる

imagemagickのmagickコマンドであれば、斜めの枠線にあわせて画像を回転させることができます。
ここで使うconvex-fullは日本語では凸包(とつほう)といい、要素をカバーする最小の多角形……という意味らしいです。
今回は単純な四角形で考えます。

実際のところ

magick rotate.png -fuzz 15% -set option:angle "%[minimum-bounding-box:unrotate]" -background gray -rotate "%[angle]" -trim result.png

これが

こうなる

実用上はconnected objectを活用してゴミを消して使うもののようです。
上手に使うと、切り抜いたものを更に加工して余白を消したりする事もできるのだとか。

Imagemagickで出力形式を明示する

特に標準出力に出す際、データ形式が指定できてないと後の処理でエラーを吐く事があります。
幸い出力形式を明示するオプションがあるので、これを使います。

実際のところ

convert rose: JPEG:- | identify -
-=>/tmp/magick-2117PiGxgXKBtM8 JPEG 70x46 70x46+0+0 8-bit sRGB 2664B 0.000u 0:00.000

$ convert rose: PNG:- | identify -
-=>/tmp/magick-2153RfMtTAJ1fpt PNG 70x46 70x46+0+0 8-bit sRGB 6975B 0.000u 0:00.000

$ convert rose: BMP:- | identify -
-=>/tmp/magick-217XW9zL3NzmJ9z BMP 70x46 70x46+0+0 8-bit sRGB 9890B 0.000u 0:00.000

imagemagickでbase64

テキストしか送れない対象や、あるいは画像をテキスト化してリクエスト数を減らす等々の用途でbase64が使われるわけですが……imagemagickでも、そのbase64を使用する事が可能

実際のところ

組み込み画像roseをrose.base64というファイルで保存

$ convert rose: inline:rose.base64

中のファイルはこんな風になっています

data:image/x-portable-pixmap;base64,UDYKNzAgNDYKMjU1CjAvLTIwLjYyLzgzLjozLTkyLTgwLTkxLjgwLTgw ... U9NjZEL0dgNUdiPDpNOEBSOkhcQTRCMQ==

通常の画像様式ではないので、fehで出力でみてもエラーがでるのみ

$ convert rose: inline:- | feh -
feh WARNING: /tmp/feh_stdin_VRm5s2 - No Imlib2 loader for that file format
feh: No loadable images specified.
See 'man feh' for detailed usage information

2022/09/16追記:インラインイメージ(Data URI)として使いたいならPNGである事を明記する

上記の例はJPEGで出力されています。
これを埋込にすると面倒なので、インラインで明示的にPNGであることを書いておきましょう
ついでに

$ convert rose: inline:png:-
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA ... daa:/

imagemagickでマスク処理し色抽出

mask.pngという名前で白黒二階調の画像を用意
それでマスクするケース

$ convert goal.jpg mask.png -alpha off -compose darken -composite -trim foobar.jpg

更に閾値で色数減らして

$ convert foobar.jpg -separate -threshold 50% -combine -format %c histogram:info:
       885: (  0,  0,  0) #000000 black
        13: (  0,  0,255) #0000FF blue
        10: (  0,255,  0) #00FF00 lime
        11: (  0,255,255) #00FFFF cyan
       104: (255,255,255) #FFFFFF white

globalメソッドとlocalメソッド

前回はevalメソッドをつかって文字列をメソッドとして解釈する方法をやりましたが
今回は組み込みメソッドのglobalメソッドやlocalメソッドをつかって実行する方法について

実際のところ

argsdict = {'name': 'Joe', 'family': 'Brand'}
globals()['fullName'](**argsdict)