使用Imagick php扩展程序将多页PDF转换为JPG时,纠正黑色背景的最佳方法是什么?
以下是我的申请中使用的代码:
$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->writeImage("$file-$c.jpg");
}
我知道flattenImage方法可用于删除黑色背景,例如:
$imagick = $imagick->flattenImages();
但是当文件包含更多页面时,flattenImages方法会将所有页面放在同一图像上,因此结果是生成的所有JPG中最后一页的副本。
如果有人可以帮助我,我感激不尽。
答案 0 :(得分:6)
首先是工作代码 - 要遵循的解释:
此代码有效,但速度极慢:
$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,如果您真的需要额外的压缩。