使用ImageMagick和PHP将PNG转换为JPG并将透明背景设置为白色

38

我该如何使用带有PHP扩展的ImageMagick将PNG图像转换为JPEG时设置透明背景为白色?


1
哪个 PHP 扩展名,有三个选项。MagickWand、IMagick 或 phMagick? - Orbling
2个回答

53

在撰写本文时,您尚未指定使用的扩展名,但如果您正在使用命令行,则命令将是:

convert image.png -background white -flatten -alpha off image.jpg

更多信息可以在Masking Usage documentation中找到。

例如,使用IMagick,您可以按照以下方式操作:

(从未经过测试,从未使用过IMagick并且没有安装进行测试)

$image = new IMagick('image.png');

$flattened = new IMagick();
$flattened->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel("white"));

$flattened->compositeImage($image, imagick::COMPOSITE_OVER, 0, 0);

$flattened->setImageFormat("jpg");
$flattened->writeImage('image.jpg');

$image->clear();
$image->destroy();
$flattened->clear();
$flattened->destroy();

1
@CappY:那也可以,除了可能会提高几微秒的性能之外,您选择使用该函数的原因是什么? - Orbling
@Orbling: 致命错误:调用未定义的方法Imagick :: getWidth()。不知道它是否适用于您。 - CappY
@CappY:多么奇怪...它在文档中:http://www.php.net/manual/zh/function.imagick-getimagewidth.php - Orbling
1
@Orbling,你使用两个步骤来转换格式。首先设置新格式(jpg),然后写入图像('image.jpg')。我发现没有必要设置格式。只需在保存图像时写入所需的图像扩展名 - writeImage('image.jpg')或writeImage('image.gif')。它会自动转换格式。当您使用identify -verbose在控制台中检查保存的图像时,它们确实具有新格式。但是,没有任何官方文档说明这种行为。我应该先使用setImageFormat()还是真的不需要? - Green
1
也适用于GIF!谢谢 - skywind
显示剩余3条评论

5
如果您正在使用Imagick扩展:
<?php
// load the source transparent png
$i = new IMagick('image.png');

// set the background to white
// you can also use 'rgb(255,255,255)' in place of 'white'
$i->setImageBackgroundColor(new ImagickPixel('white'));

// flattens multiple layers
$i = $i->flattenImages();

// the output format
$i->setImageFormat('jpg');

// save to disk
$i->writeImage('image.jpg');

// and/or output directly
// header('Content-Type: '.$i->getFormat());
// echo $i->getImageBlob();

// cleanup
$i->clear();
$i->destroy();

1
虽然旧答案是使用 __flattenImages__,但现在已经被弃用,推荐的方法是 mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) http://php.net/manual/en/imagick.mergeimagelayers.php - tbleckert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接