Проблемы с изменением размера, центрированием и разреженной заливкой Imagick


Моя конечная цель здесь - изменить размер входного изображения до ширины 100 пикселей и высоты 125 пикселей. Некоторые из входных изображений имеют другое соотношение сторон, поэтому я хочу, чтобы они были в контейнере размером 100x125 с фоном, разреженным по цвету их краев.

Хорошо, значит, это работает для базового изменения размера:

$image = new Imagick($imgFile);
$image->resizeImage(100,0, Imagick::FILTER_LANCZOS, 1, false);
$image->writeImage("$Dir/$game.png");
header("Content-type: ".$image->getImageFormat());
echo $image;
$image->clear();
$image->destroy();

Однако я искал несколько часов, и я не могу найти простой бит "Вот как вы центрируете изображение на холсте" для библиотеки Imagick PHP. Все для фактического Приложение для преобразования изображений ImageMagick, которое на самом деле не то, что мне нужно. Я попытался скомпоновать изображение с измененным размером в пустое новое изображение с заданными шириной и высотой, но, похоже, оно просто перезаписывает размеры независимо от типа композита, устанавливая гравитацию в центр, а затем размер 100x125 не влияет (он всегда находится на уровне 0,0, и попытка установить смещение y на ((125-высота изображения)/2) привела к смещению, которое было намного больше, чем должно было быть )

Изменить:

    $imageOutput = new Imagick();
    $image = new Imagick($imgFile);
    $image->resizeImage(100,0, Imagick::FILTER_LANCZOS, 1, false);
    $imageOutput->newImage(100, 125, new ImagickPixel('black'));
    $imageOutput->compositeImage($image, Imagick::COMPOSITE_ADD, 0, ((125 - $image->getImageHeight()))/2 );
    $imageOutput->setImageFormat('png');
    $imageOutput->writeImage("$Dir/$game.png");
    header("Content-type: ".$imageOutput->getImageFormat());
    echo $imageOutput;
    $image->clear();
    $image->destroy();

Итак, у меня получилось центрирование, гравитация, по-видимому, не влияет на реальные изображения.

Я совершенно не представляю, где бы я даже начал пытаться воссоздать край командной строки - в разреженном заполнении PHP с помощью библиотеки.

Author: fire, 2012-09-08

1 answers

В итоге я использовал комбинацию вызовов Imagick и оболочки для преобразования, в конечном итоге я перепишу ее, чтобы использовать полностью вызовы оболочки. Я также изменил свои размеры, вот код:

    $imageOutput = new Imagick(); // This will hold the resized image
    $image = new Imagick($imgFile); // Open image file
    $image->resizeImage(120,0, Imagick::FILTER_LANCZOS, 1, false); // Resize it width-wise
    $imageOutput->newImage(120, 150, "none"); // Make the container with transparency
    $imageOutput->compositeImage($image, Imagick::COMPOSITE_ADD, 0, ((150 - $image->getImageHeight())/2) ); // Center the resized image inside of the container
    $imageOutput->setImageFormat('png'); // Set the format to maintain transparency
    $imageOutput->writeImage("$Dir/$game.temp.png"); // Write it to disk
    $image->clear(); //cleanup -v
    $image->destroy(); 
    $imageOutput->clear();
    $imageOutput->destroy();
    //Now the real fun
    $edge = shell_exec("convert $Dir/$game.temp.png -channel A -morphology EdgeIn Diamond $Dir/$game.temp.edge.png"); // Get the edges of the box, create an image from just that
    $shepards = shell_exec("convert $Dir/$game.temp.edge.png txt:- | sed '1d; / 0) /d; s/:.* /,/;'"); // get the pixel coordinates
    $final = shell_exec("convert $Dir/$game.temp.edge.png -alpha off -sparse-color shepards '$shepards' png:- | convert png:- $Dir/$game.temp.png -quality 90 -composite $Dir/$game.jpg"); // Sparse fill the entire container using the edge of the other image as shepards , then composite that on top of this new image
    unlink("$Dir/$game.temp.png"); // cleanup temp files
    unlink("$Dir/$game.temp.edge.png");
    set_header_and_serve("$Dir/$game.jpg"); // serve the newly created file
 2
Author: fire, 2012-09-08 16:32:53