読者です 読者をやめる 読者になる 読者になる

モノノフ日記

普通の日記です

PECL::Imagickを簡単に使えるライブラリを作った

php

Imagickを使いやすくするImagick_Thumbnailerというライブラリを作ってみました。
早速CodeReposに公開しています。初コミット!
http://coderepos.org/share/browser/lang/php/Imagick_Thumbnailer/trunk/Imagick_Thumbnailer.php

概要

画像をリサイズしたいだけ、トリミングしたいだけなのにやることが多くてメンドクサイ!という人向けです。

PECL::Imagickのラッパーとして動作するのでImagickは必須、もちろんImageMagickも。動作を確認しているバージョンは下記になります。public, privateなどのアクセス修飾子使ってるのでPHP5でしか動作しないと思います。

ImageMagick
6.4.2-1
Imagick
2.1.1
PHP
5.2.6

使い方

サンプル画像として下の画像をいろいろ変換させていきます。
f:id:Kiske:20080709185050j:image

リサイズ

普通にサイズしてしてやる方法。
アスペクト比は固定でリサイズするので、
変な数値の場合は小さい値(長辺じゃない方)に合わせてリサイズします。

<?php
$image = new ImagickThumbnailer('test.jpg');
$image->resize(160,120);
$image->show();

結果
f:id:Kiske:20080709185913j:image

パーセンテージで指定する方法。

<?php
$image = new ImagickThumbnailer('test.jpg');
$image->resizePercent(30);
$image->show();

結果
f:id:Kiske:20080709190411j:image

トリミング

自分で切り取る範囲を指定してやる方法。
下の例だと、100x100の画像を元画像の左端から70px, 上から90pxのところからトリミングします。よくある指定方法ですね。

<?php
$image = new ImagickThumbnailer('test.jpg');
$image->crop(100, 100, 70, 90);
$image->show();

結果
f:id:Kiske:20080709190412j:image

大きさだけ指定して真ん中を中心に範囲指定する方法。

<?php
$image = new ImagickThumbnailer('test.jpg');
$image->cropFromCenter(100, 100);
$image->show();

結果
f:id:Kiske:20080709190413j:image

セピア調

sepia()に数値を与えると階調が変わる(と思います)

<?php
$image = new ImagickThumbnailer('test.jpg');
$image->sepia();
$image->show();

結果
f:id:Kiske:20080709191330j:image

ポラロイド風

ImageMagick6.3.8以上が必須となります。

<?php
$image = new ImagickThumbnailer('test.jpg');
$image->polaroize();
$image->show();

結果
f:id:Kiske:20080709191331j:image

角丸画像
<?php
$image = new ImagickThumbnailer('test.jpg');
$image->roundCorner();
$image->show();

結果
f:id:Kiske:20080709191332p:image

リフレクション画像
<?php
$image = new ImagickThumbnailer('test.jpg');
$image->createReflection();
$image->show();

結果
f:id:Kiske:20080709191333j:image

課題

  • エラー処理をImagickのExceptionに丸投げ
    • 基本的に引数エラーとかはExceptionで返ってくるので任せてますが果たしてそれでよいのか
  • 複数ファイルの扱い
    • 今は1ファイルずつしか処理できないのですがマニュアルの例にあるようにディレクトリ下の全てのファイルを一括処理できるようにしたい