sironekotoroの日記

Perl で楽をしたい

Perl を使って画像にマスクをかける

Perl を使って画像にマスクをかける

Perl で画像を扱うライブラリといえば代表的なのが以下の 3 つですが、どれも使ったことないです。

ということで、今回は Imager でやってみます。

metacpan.org

そして、わからないー!ってなっている時に見つけた Perl.org のチュートリアルです。

blogs.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' );

で、合成した画像がこちらです。

f:id:sironekotoro:20210606155125p:plain

craftman.pngmask.png を合成し、mask.png の黒枠のところは隠して白い部分だけ craftman.png の画像を出す、隠した部分は透過させる・・・という処理です。

こういうのをマスクをかける、というそうです。

言葉は知ってましたが、実際にやってみるのは初めてでした。

わからないなりになんとか

画像処理のプログラムですが、業務で利用している PHP の画像合成コードを Perl で書き直してみよう!ってことで着手しました。

PHP の方では GD という画像処理ライブラリを利用しており、それと 1 対 1 で翻訳していくような形で Perl に移植しました。

いったんなんとか動く、ってところまで持っていき Perl っぽく書きなおし、 Imager のメソッドをフル活用し、最終的には Perl のモジュールにすることができました。

いやー、大変だった。

何が大変だったかというと、画像を回転させると画像の縦横が少し増えることを意識できず遠回りしまくったことですね。

完成させられたのは Google 翻訳と運のおかげですわ。

以下のメソッドを使いました。

  • compose: マスクをかける

  • rubthrough: 合成(セル画を重ねるようなイメージ?)

  • scale: サイズ変更、サムネイル作るとか

  • crop: 画像の一部を抜き出す

  • rotate: 画像を回転させる。回転させて生じた余白は指定がなければ透過黒