2014-11-07 290 views
6

使用Imagick php扩展将多页PDF转换为JPG时,更正黑色背景的最佳方法是什么?使用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

您是否能够发布示例PDF? – Danack 2014-11-07 03:30:36

+0

当然,这里是一个例子: http://www.faceo.com.br/temp/Manual%20Split%20hiwall%20YORK-1.pdf ,以及生成的jpgs之一: http://www.faceo .com.br/temp/Manual%20Split%20hiwall%20YO​​RK-1.pdf-10.jpg – fcaserio 2014-11-07 14:31:00

+1

呃,没有压力......但是如果它解决了你的问题,怎么回事点击接受按钮? ;-) – Danack 2014-11-07 23:56:37

回答

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
  • 将它们合并在一起。

对于每个具有透明度的图层,因为JPG不支持透明度,它会将透明度渲染为黑色,然后合并它。上面的代码使合成按照正确的顺序完成。

解决此问题的另一种方法是将输出作为PNG。由于它支持透明度,因此具有透明度的各个图层都可以正确合并,然后如果您真的想将最终图像转换为JPG格式。

使用PNG作为中间格式也可能产生稍高质量的输出,因为它可能会跳过“保存为JPG和解码”步骤。我建议尽可能在您的工作流程中使用PNG,然后在您将文件提供给最终用户时才转换为JPG,如果您确实需要额外的压缩位。

+0

Tks男人,很好的解决方案,把图像放在一个新的白色帆布上! – fcaserio 2014-11-07 15:56:22

+0

我仍然遇到了出现在页面上的黑色背景问题(对于我来说,这是一个带有文本+图像的最后一页)。用Imagick :: COMPOSITE_OVER替换'Imagick :: COMPOSITE_ATOP'似乎正在修复它 – MarcinWolny 2015-01-13 15:19:43