2007年12月19日水曜日

imagick(pecl)で任意の画像を正方形に

スズキです。

今日、最後のImagickネタです。
任意の画像を縦横比を変えずに正方形にしたい、
というニーズはよくあると思います。
また、正方形にするやり方も下記のように2パターンあります。

一つ目のパターンは、対象画像の内側いっぱいに、
正方形を作るものです。

これは、imagickでは下記のように
cropThumbnailImageで簡単に実現できます。
http://php.mirror.camelnetwork.com/manual/ja/function.imagick-cropthumbnailimage.php

$thumb = new Imagick();
$thumb->readImage($originalDir . $orgFile);
$thumb->cropThumbnailImage(80, 80);
$thumb->writeImage($baseDir . $uploadFile);
$thumb->destroy();

※画像の中心から内側いっぱいに正方形になるように切り取り、
それを、80x80にリサイズしています。

もう一つは、一辺の長さを画像の縦または横の、
大きい方にあわせた正方形です。(余白ができます)

こちらは少し面倒でscaleImageや、
http://php.mirror.camelnetwork.com/manual/ja/function.imagick-scaleimage.php
spliceImageを使います。
http://php.mirror.camelnetwork.com/manual/ja/function.imagick-spliceimage.php
※spliceImageは任意の場所に無地の画像を配置します。

$large = new Imagick();
$large->readImage($originalDir . $orgFile);
$large->setImageBackgroundColor(new ImagickPixel("white"));

if($large->getImageWidth() > $large->getImageHeight()) {
  $large->scaleImage(300, 0);
  $height = (300 - $large->getImageHeight()) / 2;
  $large->spliceImage(0, $height, 0, 0);
  $large->spliceImage(
    0,
    300 - $large->getImageHeight(),
    0,
    $large->getImageHeight()
  );
} else {
  $large->scaleImage(0, 300);
  $width = (300 - $large->getImageWidth()) / 2;
  $large->spliceImage($width, 0, 0, 0);
  $large->spliceImage(
    300 - $large->getImageWidth(),
    0,
    $large->getImageWidth(),
    0
  );
}

$large->writeImage($largeDir . $uploadFile);
$large->destroy();

※縦または横の大きい方の長さを300にリサイズして
正方形になるように、左右または上下に
無地の画像を配置しています。

また、無地の画像の色をsetImageBackgroundColorで
指定しています。
http://php.mirror.camelnetwork.com/manual/ja/function.imagick-setimagebackgroundcolor.php

ImagickPixelのコンストラクタ引数で色を指定するのですが、
指定の仕方はこちらが参考になります。
http://php.mirror.camelnetwork.com/manual/ja/function.imagickpixel-setcolor.php

長文になってしまった...

--

http://suz-lab.blogspot.com/

0 コメント: