Imagick, черный фон...

VHS
На сайте с 28.09.2007
Offline
142
VHS
1124

Всем привет. Проблема стара, готового решения не нашел.

Если фотки, из них делаем превьюшки.

Формат фотографии может быть неверным (png сохранено как jpg)

Делаю следующее:

if (file_exists($source) && !file_exists($dest)) {
$image = new Imagick($source);
$image->setImageColorspace(Imagick::COLORSPACE_RGB);
} else {
return false;
}
$image->thumbnailImage($w, $h, true);

$canvas = new Imagick();

$canvas->newImage($w, $h, "white");
$canvas->setImageColorspace(Imagick::COLORSPACE_RGB);

/* Наложение оригинального изображения на холст */
$canvas->compositeImage($image, Imagick::COMPOSITE_DEFAULT, ($w-$image->getImageWidth()) / 2, ($h-$image->getImageHeight()) / 2);
$canvas->setImageFormat("jpeg");
$canvas->setImageCompression(imagick::COMPRESSION_JPEG);
$canvas->setImageCompressionQuality(75);
$canvas->stripImage();
return $canvas->writeImage($dest); // TRUE OR FALSE

На выходе получаю изображение на белом фоне, но фон исходной картинки может быть как исходным, так и черным (прозрачность меняется на черный), по всей видимости это как раз неправильно сохраненные картинки. Как можно получить готовое изображение именно в jpeg, и без артефактов (прозрачность сделать белым цветом например)?

LovelAss
На сайте с 05.06.2009
Offline
96
#1

Возможно, это вам поможет http://www.php.su/forum/topic.php?forum=29&topic=741

Вот ещё информация http://www.asf.ru/docs/php/imagick.setimagealphachannel.html

VHS
На сайте с 28.09.2007
Offline
142
VHS
#2

Спасибо, уже читал. Или лыжи не едут, или одно из двух.

В коде я выполняю именно то, что там советуют. Результат тот же...

Оригинал фото https://yadi.sk/i/Agg3lrXDqERE5

Результат https://yadi.sk/i/VN2RVvBPqEREb

LovelAss
На сайте с 05.06.2009
Offline
96
#3

Поиграйтесь с Imagick::getImageAlphaChannel() и Imagick::setImageAlphaChannel(), может что и получится.

VHS
На сайте с 28.09.2007
Offline
142
VHS
#4

Поиграться то получается, результат не впечатляет. Один из вариантов привел к появлению нормальной миниатюры на черном фоне ). К сожалению, совершенно не разбираюсь в альфа-каналах и прочей графической терминологии.

Я так понял, что есть какие-то проблемы с ImageColorspace, так как следующая конструкция дает интересный, но нелогичный с моего ламерского взгляда, результат https://yadi.sk/i/uH3yUplhqEbgt

$canvas->newImage($w, $h, new ImagickPixel("black"));
$canvas->setImageColorspace( $image->getImageColorspace() );
W
На сайте с 09.04.2013
Offline
46
#5

Возможно, этот код подойдет


if (file_exists($source) && !file_exists($dest)) {
$image = new Imagick($source);
if ($image->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
$image->transformimagecolorspace(Imagick::COLORSPACE_SRGB);
}
} else {
return false;
}
$image->thumbnailImage($w, $h, true);

$canvas = new Imagick();

$canvas->newImage($w, $h, "white");
$canvas->setImageColorspace(Imagick::COLORSPACE_SRGB);

/* Наложение оригинального изображения на холст */
$canvas->compositeImage($image, Imagick::COMPOSITE_DEFAULT, ($w-$image->getImageWidth()) / 2, ($h-$image->getImageHeight()) / 2);
$canvas->setImageFormat("jpeg");
$canvas->setImageCompression(imagick::COMPRESSION_JPEG);
$canvas->setImageCompressionQuality(75);
$canvas->stripImage();
return $canvas->writeImage($dest);
VHS
На сайте с 28.09.2007
Offline
142
VHS
#6

Спасибо, вариант отличный, на больших картинках все отлично. Однако, в миниатюре 150*150 опять артефакты...

https://yadi.sk/i/-5Yt_PpSqHuWe

Артефакты вылезали по всей видимости из-за дробных значений в формуле размера:

$canvas->compositeImage($image, Imagick::COMPOSITE_DEFAULT, ($w-$image->getImageWidth()) / 2, ($h-$image->getImageHeight()) / 2);

Приведя к int картинка получается абсолютно нормальной. Еще раз спасибо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий