これが PHP スクリプト (理想的には Codeigniter ですが、どれでもかまいません) を介して行われるか、Photoshop アクションを介して行われるかは気にしません。
基本的に、次のことができる画像を取得したい:
- 画像の周りの「退屈な」空白をすべてトリムします
- 最大 380 ピクセル (高さと幅) にサイズ変更します
- 最後に、画像を 400px x 400px にパディングします (たとえば、変更した画像の周りに独自の「白い」パディングを置きます)。
GD/ImageMagick または適切な PHP スクリプト/ライブラリを使用してこれを行う方法に関するヒントを教えてもらえますか?
これまでに次のことを試しました...
$gd = imagecreatefromjpeg('./assets/temp/whitespace-img.jpg');
imagetrim($gd, '#ffffff', null);
function imagetrim($im, $bg, $pad=null, $output=null){
// Calculate padding for each side.
if (isset($pad)){
$pp = explode(' ', $pad);
if (isset($pp[3])){
$p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[3]);
}else if (isset($pp[2])){
$p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[1]);
}else if (isset($pp[1])){
$p = array((int) $pp[0], (int) $pp[1], (int) $pp[0], (int) $pp[1]);
}else{
$p = array_fill(0, 4, (int) $pp[0]);
}
}else{
$p = array_fill(0, 4, 0);
}
// Get the image width and height.
$imw = imagesx($im);
$imh = imagesy($im);
// Set the X variables.
$xmin = $imw;
$xmax = 0;
// Start scanning for the edges.
for ($iy=0; $iy<$imh; $iy++){
$first = true;
for ($ix=0; $ix<$imw; $ix++){
$ndx = imagecolorat($im, $ix, $iy);
if ($ndx != $bg){
if ($xmin > $ix){ $xmin = $ix; }
if ($xmax < $ix){ $xmax = $ix; }
if (!isset($ymin)){ $ymin = $iy; }
$ymax = $iy;
if ($first){ $ix = $xmax; $first = false; }
}
}
}
// The new width and height of the image. (not including padding)
$imw = 1+$xmax-$xmin; // Image width in pixels
$imh = 1+$ymax-$ymin; // Image height in pixels
// Make another image to place the trimmed version in.
$im2 = imagecreatetruecolor($imw+$p[1]+$p[3], $imh+$p[0]+$p[2]);
// Make the background of the new image the same as the background of the old one.
$bg2 = imagecolorallocate($im2, ($bg >> 16) & 0xFF, ($bg >> 8) & 0xFF, $bg & 0xFF);
imagefill($im2, 0, 0, $bg2);
// Copy it over to the new image.
imagecopy($im2, $im, $p[3], $p[0], $xmin, $ymin, $imw, $imh);
if ($output)
{
imagejpeg($im2, $output);
}
// To finish up, we replace the old image which is referenced.
$im = $im2;
}