Я пытаюсь удалить альфа-канал (прозрачность) файла PNG и заменить его белым фоном в PHP.
Используя ImageMagick, я попробовал несколько функций безуспешно. Это функция, которая не работает:
$iMagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
Также setBackgroundColor('#FFFFFF')
вместо setImageBackgroundColor('#FFFFFF')
не помогло То же самое для замены '#FFFFFF'
с 'white'
в этих 2 функциях.
Использование ImageMagick 3.4.0RC6 (дата выпуска: 2016-11-29) скомпилировано с ImageMagick 6.8.9-9 Q16 x86_64 2016-03-14. Текущие версии (Ubuntu 16.04).
Есть идеи? заранее спасибо
ninsky
Просто пропустите первую строку кода, которая отключает прозрачность, и запустите:
$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
Вот функция, которую я использую. Это не основано на ImageMagick, все же. Взял его из другого ответа stackoverflow и настроил так, чтобы он раскрашивал только прозрачные пиксели.
function colorizeTransparent( $file, $targetR, $targetG, $targetB, $targetName ) {
$im_src = imagecreatefrompng( $file );
$width = imagesx($im_src);
$height = imagesy($im_src);
$im_dst = imagecreatefrompng( $file );
for( $x=0; $x<$width; $x++ ) {
for( $y=0; $y<$height; $y++ ) {
$rgba = imagecolorat( $im_src, $x, $y );
$alpha = ($rgba & 0x7F000000) >> 24;
if ($rgba == 0) {
$col = imagecolorallocatealpha( $im_dst,
$targetR - (int) ( 1.0 / 255.0 * $alpha * (double) $targetR ),
$targetG - (int) ( 1.0 / 255.0 * $alpha * (double) $targetG ),
$targetB - (int) ( 1.0 / 255.0 * $alpha * (double) $targetB ),
$alpha
);
} else $col = $rgba;
imagesetpixel( $im_dst, $x, $y, $col );
}
}
imagepng( $im_dst, $targetName);
}
Вызовите функцию следующим образом:
colorizeTransparent($sourceImage, 0xFF, 0xFF, 0xFF, $colorizedImage);
С $ sourceImage — имя файла источника, а $ colorizedImage — имя файла назначения.
Дайте мне знать, как это сработало для вас.