PHP:使用 ImageMagick 将 alpha 通道转换为白色背景
PHP: Convert alpha channel to white background with ImageMagick
我正在尝试删除 PNG 文件的 Alpha 通道(透明度)并将其替换为 PHP 中的白色背景。
使用 ImageMagick 到目前为止,我已经尝试了几个功能,但都没有成功。这些是不起作用的功能:
$iMagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
setBackgroundColor('#FFFFFF')
而不是 setImageBackgroundColor('#FFFFFF')
也没有帮助。与在这两个函数中用 'white'
替换 '#FFFFFF'
相同。
使用 ImageMagick 3.4.0RC6(发布日期:2016-11-29)与 ImageMagick 6.8.9-9 Q16 x86_64 2016-03-14 编译。当前版本 (Ubuntu 16.04).
有什么想法吗?提前致谢
宁斯基
这是我正在使用的一个函数。不过,它不是基于 ImageMagick。从另一个 Whosebug 答案中获取它并将其自定义为仅对透明像素着色。
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 是目标文件名。
让我知道你的结果如何。
只需省略您的第一行代码即可停用透明度和 运行:
$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
我正在尝试删除 PNG 文件的 Alpha 通道(透明度)并将其替换为 PHP 中的白色背景。
使用 ImageMagick 到目前为止,我已经尝试了几个功能,但都没有成功。这些是不起作用的功能:
$iMagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
setBackgroundColor('#FFFFFF')
而不是 setImageBackgroundColor('#FFFFFF')
也没有帮助。与在这两个函数中用 'white'
替换 '#FFFFFF'
相同。
使用 ImageMagick 3.4.0RC6(发布日期:2016-11-29)与 ImageMagick 6.8.9-9 Q16 x86_64 2016-03-14 编译。当前版本 (Ubuntu 16.04).
有什么想法吗?提前致谢
宁斯基
这是我正在使用的一个函数。不过,它不是基于 ImageMagick。从另一个 Whosebug 答案中获取它并将其自定义为仅对透明像素着色。
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 是目标文件名。
让我知道你的结果如何。
只需省略您的第一行代码即可停用透明度和 运行:
$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);