Статьи / PHP


php trim transparent png with Imagick

Не найдя в интернете нужную мне функцию trim transparency png, обрезающую прозрачные края изображения я огорчился, но затем нашел необычное решение(рабочий "костыль").

To crop transparency (trim transparent pixels) we'll be use Imagick, and my function. Imagick not trim transparent png, but do it with jpg. Get size of needed area and crop png. :)

Для того, чтобы обрезать прозрачные пикселы по краям изображение используем библиотеку Imagick. Она не понимает где прозрачные пикселы в png, зато прекрасно понимает где белые в jpg. Скопируем наше изображение из png в > jpg и получим x, y, width, height данные непрозрачного(no transparent), необходимые для crop(обрезки краев). А затем по полученным данным обрежем оригинальное png изображение с прозрачностью.

Вот такой вот трюк(trick).

function trim_png($filename) {

if (preg_match("/\.png$/", $filename) == 0) {
return;
}

$img = new Imagick($filename);
$img->borderImage("#FFFFFF", 1, 1);
$img->writeImages('tmp.jpg', true);

$img = new Imagick('tmp.jpg');
$img->trimImage(0);

$ip = $img->getImagePage();
list($x, $y) = array($ip['x'], $ip['y']);
$img->setImagePage(0, 0, 0, 0);
list($width, $height) = array($img->width, $img->height);

$img = new Imagick($filename);
$img->cropImage($width, $height, $x, $y);

echo $filename.'<br>';
@unlink($filename);
$img->writeImages($filename, true);

$img->destroy();
@unlink("tmp.jpg");
}


Функция создает временный файл tmp.jpg, который затем удаляет.