ImagerとImage::Magickのよく使うメソッドをまとめてみた

簡単に違いを書くと

  • Imagerはインターフェースがかっけえ
  • Image::Magickはなんか枯れてる
  • 速度はあんまかわんない

ファイル読み込み、書き出し、エラー出力

Imager
my $img = Imager->new;
$img->read(file => $filename) or warn $img->errstr;
$img->write(file => $filename) or warn $img->errstr;
Image::Magick
my $img = Image::Magick->new;
$err = $img->Read($filename);
$err = $img->Write($filename);

$err = $img->Read('-'); # 標準入力から読み込み
$err = $img->Write('png:-'); # 標準出力へ書き出し

変形全般

  • Imagerはメソッドの返値が変形後の新しいインスタンス
    • メソッドチェーンが使える。
  • Image::Magickはインスタンス自身に変更を加える。
# Imager
$newimg = $img->copy();
$newimg = $img->scale(xpixels => 100, ypixels => 100);
$img->scale(xpixels => 100, ypixels => 100)->rotate(right => 90)->write(file => $filename);

# Image::Magick
$img->Resize(geometry => "100x100");
$img->Rotate(90);
$img->Write($filename);

リサイズ

Imager
# 短辺指定(縦横比を維持)
$newimg = $img->scale(
    xpixels => 400,
    ypixels => 400,
    type    => 'max',
);

# 長辺指定(縦横比を維持)
$newimg = $img->scale(
    xpixels => 400,
    ypixels => 400,
    type    => 'min',
);

# 強制リサイズ(縦横比を無視)
$newimg = $img->scale(
    xpixels => 400,
    ypixels => 400,
    type    => 'nonprop',
);

maxがデフォルトなので、typeを指定しないと短辺指定になるよ

Image::Magick
# 長辺指定(縦横比を維持)
$img->Resize(
    geometry => "400x400",
);

# 強制リサイズ(縦横比を無視)
$img->Resize(
    width => 400,
    height => 400,
);

サイズ取得

Imager
my $x = $img->getwidth();
my $y = $img->getheight();
Image::Magick
my $x = $img->Get('width');
my $y = $img->Get('height');

回転

Imager
$rotated = $img->rotate(right => 90);
$rotated = $img->rotate(right => 270);
$rotated = $img->rotate(degrees => 90);
$rotated = $img->rotate(degrees => -90);
$rotated = $img->rotate(radians => 3.14159265/2);
$rotated = $img->rotate(radians => -3.14159265/2);

degrees, radiansは浮動小数点演算で誤差が出る可能性があるため、90度単位で正確に回転する場合はrightを使うこと。

Image::Magick
$img->Rotate(90);
$img->Rotate(-90);

jpeg画質設定

どちらもJPEG画質のデフォルトは75%

Imager
$img->write(
    file        => $filename,
    jpegquality => $quality,
);
Image::Magick
    $img->Set(quality => $quality);

JPEG/MIFF/PNG共通のパラメータ

色空間変換(グレースケールにする、など)

Imager
$newimg = $img->convert(preset => 'gray'); # グレースケール
$newimg = $img->convert(preset => 'noalpha'); # アルファチャンネルを消す
# preset => {gray, grey, noalpha, red, channel0, green, channel1, blue, channel2, alpha, rgb, addalpha}
Image::Magick
$img->Quantize(colorspace => 'Gray'); # グレースケール
# colorspace => {RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YIQ, YPbPr, YUV, CMYK, sRGB, HSL, HSB}

あるピクセルの色情報を得る

Imager
my $color = $img->getpixel(x => $x, y => $y);
# Imager::Color オブジェクトが返る
my ($red, $green, $blue, $alpha) = $color->rgba();
# 8bitの値(0〜255) が返る 
Image::Magick
my ($red, $green, $blue, $ugh) = split ',', $img->Get("pixel[$x, $y]");
# 16bitの値(0〜65535) が返る

JPEGコメント削除

JPEGコメントは悪用されると一部ブラウザで脆弱性となるらしいよ。

Imager
$img->deltag(name => 'jpeg_comment');

deltagは$img自身に作用するよ。

Image::Magick
$img->Comment('');