Perl を使って画像にマスクをかける
Perl を使って画像にマスクをかける
Perl で画像を扱うライブラリといえば代表的なのが以下の 3 つですが、どれも使ったことないです。
Imager
GD
PerlMagick(ImageMagick をPerlから使うライブラリ)
ということで、今回は Imager でやってみます。
そして、わからないー!ってなっている時に見つけた Perl.org のチュートリアルです。
このチュートリアルなんですが、記事中の画像が連結されてたりするので、こちらでバラしてついでに png にしてます。
画像保存して名前つけてプログラムを試すことができます。
コードはこちらです。
#!/usr/bin/env perl use strict; use warnings; use Imager; my $tile = Imager->new( xsize => 450, ysize => 450, channels => 4, ); my $mask = Imager->new( file => 'mask.png' ); my $craftsman = Imager->new( file => 'craftman.png' ); $tile->compose( src => $craftsman, mask => $mask ); $tile->write( file => 'tile.png' );
で、合成した画像がこちらです。
craftman.png
と mask.png
を合成し、mask.png
の黒枠のところは隠して白い部分だけ craftman.png
の画像を出す、隠した部分は透過させる・・・という処理です。
こういうのをマスクをかける、というそうです。
言葉は知ってましたが、実際にやってみるのは初めてでした。
わからないなりになんとか
画像処理のプログラムですが、業務で利用している PHP の画像合成コードを Perl で書き直してみよう!ってことで着手しました。
PHP の方では GD という画像処理ライブラリを利用しており、それと 1 対 1 で翻訳していくような形で Perl に移植しました。
いったんなんとか動く、ってところまで持っていき Perl っぽく書きなおし、 Imager のメソッドをフル活用し、最終的には Perl のモジュールにすることができました。
いやー、大変だった。
何が大変だったかというと、画像を回転させると画像の縦横が少し増えることを意識できず遠回りしまくったことですね。
完成させられたのは Google 翻訳と運のおかげですわ。
以下のメソッドを使いました。
compose: マスクをかける
rubthrough: 合成(セル画を重ねるようなイメージ?)
scale: サイズ変更、サムネイル作るとか
crop: 画像の一部を抜き出す
rotate: 画像を回転させる。回転させて生じた余白は指定がなければ透過黒
PHP(GD)の画像処理プログラムをPerl(Imager)に移植するってやつで悪戦苦闘してる。大壁にぶつかって進捗全くダメだったけど、なんとか迂回方法見つけて山を超えられたのではないかという実感。寝よう。
— sironekotoro (@sironekotoro) 2021年6月5日
つか、PHPの方はなんであれであの結果が出るのか本当に理解できない。透過PNGとは人生とは