在 Imagick for PHP 中透明到白色

2022-08-30 19:45:53

我有一个透明背景的png图像,我想将其转换为白色背景的jpg图像。

代码基本上是这样的:

$image = new Imagick('transparent.png');
$image->writeImage('opaque.jpg');

但这会产生一个黑色背景jpg。我一直在努力处理有史以来最糟糕的文档,试图找到一种将透明转换为白色的方法,但无济于事。

编辑:嗯,我尝试了Marc B的想法,并让它工作。

$image = new Imagick('transparent.png');
$white = new Imagick();

$white->newImage($image->getImageWidth(), $image->getImageHeight(), "white");
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);
$white->writeImage('opaque.jpg');

$image->destroy();
$white->destroy();

现在的问题是,它总是导致脚本发生故障。


答案 1

flattenImages()实际上有效。

但请记住,它不会修改给定的对象,但会返回一个新对象\Imagick()

$image = new \Imagick('transparent.png');

// Need to use the result of $image->flattenImages() here!
$image = $image->flattenImages();
$image->writeImage('opaque.jpg');

flattenImages()默认为背景色 。如果要使用其他背景颜色,则必须在加载图像之前进行设置:white

$image = new \Imagick();

// Needs to be called before the image is loaded!
$image->setbackgroundcolor('green');
$image->readimage('transparent.png');

$image = $image->flattenImages();
$image->writeImage('opaque.jpg');

一般来说,Imagick API在函数调用的顺序方面是非常明智的(就像它在命令行上的参数一样),所以总是检查你的订单是否正确。convert

祝你好运!

编辑2016年4月:

$image->flattenImages() 已弃用,应替换为:

$image->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN)

很难找到有关此的确切信息,但似乎这适用于PHP > = 5.6。

感谢vee的提示!


答案 2

尝试:

$image = new Imagick('transparent.png');
$image->setImageMatte(true);
$image->setImageMatteColor('white');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);
$image->writeImage('opaque.jpg');

推荐