ImageMagick:画像の周りにパディングをつけてセンタリングする

シェルを叩く場合

convert original.jpg -gravity center -background white -extent 1024x768 padded.jpg

なお、-gravity centerの場所をこのようにするとうまくいきません:

convert original.jpg -background white -extent 1024x768 -gravity center padded.jpg

なぜだろう…

PHPから行う場合

ここでは、最終的な画像サイズを1024x768にしてセンタリングするとします:

<?php

$newWidth = 1024;
$newHeight = 768;

// 変換前の画像を読み込む
$image = new Imagick('/tmp/original.jpg');

// サイズを取得
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// 新しい画像の中にセンタリングする際の位置を計算
$x = (int) ($newWidth / 2) - (int) ($width  / 2);
$y = (int) ($newHeight / 2) - (int) ($height / 2);

// 新しいjpg画像を作成
$canvas = new Imagick();
$canvas->newImage($newWidth, $newHeight, 'white', 'jpg');

// 新しい画像の上に元画像を合成
$canvas->compositeImage($image, imagick::COMPOSITE_OVER, $x, $y);

// 画像を書き出す
$canvas->writeImage("/tmp/new.jpg");

なお、setImageExtentも使えますがsetGravityで画像をセンタリングできなかったので、上記方法を採用しました。