С PHP / GD, как мне обрезать изображение?

Я хочу подражать управлению обрезкой Photoshop (обрезать область, покрытую одним и тем же цветом со всех сторон) с помощью GD и PHP, но мне не хватает идей о том, как это сделать.

Если кто-то знает, как это сделать, я бы очень хотел это услышать.

Заранее спасибо.

Solutions Collecting From Web of "С PHP / GD, как мне обрезать изображение?"

Самое легкое решение, о котором я могу думать, это:

  1. Узнайте цвет верхнего левого пикселя.
  2. Проецируйте изображение по строкам, по горизонтали и по вертикали, начиная сверху, снизу, левой рукой и правой стороной соответственно. Если строка состоит из ТОЛЬКО цвета, встречающегося в верхнем левом углу, это триммированное пустое пространство. Опустите эту линию из полученного изображения, увеличив координату x или y вашей функции imagecopy * ().

Непроверенный, но может работать.

BTW, ImageMagick может сделать это из коробки: http://www.imagemagick.org/Usage/crop/#trim

Вот примерная функция (которая также может добавлять дополнения):

// Trims an image then optionally adds padding around it. // $im = Image link resource // $bg = The background color to trim from the image // $pad = Amount of padding to add to the trimmed image // (acts simlar to the "padding" CSS property: "top [right [bottom [left]]]") function imagetrim(&$im, $bg, $pad=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); // To finish up, we replace the old image which is referenced. $im = $im2; }