首先是工作代码 - 解释如下:
这段代码可以工作,但是速度非常慢:
$file = "./YORK.pdf";
$maxsize = 500;
$imagick = new Imagick($file);
$imagick->setResolution(150,150);
$imagick->setImageFormat("jpg");
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(70);
foreach ($imagick as $c => $_page) {
$_page->setImageBackgroundColor('white');
$_page->adaptiveResizeImage($maxsize,$maxsize,true);
$_page->setImageCompose(\Imagick::COMPOSITE_ATOP);
$_page->flattenImages();
$_page->writeImage("$file-$c-compose.jpg");
}
这段代码可以工作并且速度很快:
foreach ($imagick as $c => $_page) {
$_page->setImageBackgroundColor('white');
$_page->adaptiveResizeImage($maxsize,$maxsize,true);
$blankPage = new \Imagick();
$blankPage->newPseudoImage($_page->getImageWidth(), $_page->getImageHeight(), "canvas:white");
$blankPage->compositeImage($_page, \Imagick::COMPOSITE_ATOP, 0, 0);
$blankPage->writeImage("$file-$c.jpg");
}
我认为正在发生的事情是,当涉及到写入 ImageMagick 正在做的图像时:
对于每个具有透明度的图层,因为 JPG 不支持透明度,它将透明度渲染为黑色,然后将其合并。上面的代码使合成按正确的顺序完成。
解决该问题的另一种方法是将输出设置为 PNG。由于它支持透明度,具有透明度的各个图层会正确合并,然后如果您确实愿意,您可以将最终图像转换为 JPG。
使用 PNG 作为中间格式还可以产生稍高质量的输出,因为它可以跳过“保存到 JPG 并解码”步骤。我确实建议尽可能在工作流程中使用 PNG,然后仅在向最终用户提供文件时(如果您确实需要额外的压缩)才转换为 JPG。