imagick:从PDF页面创建图像时,无法获取setImageBackgroundColor,setImageCompressionQuality和setImageResolution

时间:2015-09-28 10:57:56

标签: php pdf imagick

我在尝试使用imagick和PHP(5.5)将PDF转换为图像时遇到问题。一切正常我可以为PDF中的每个页面创建一个图像,但我遇到了以下问题。并且已经被困在这里好几天了。

  1. 当我从PDF文件创建图像时,即使您将setImageBackgroundColor设置为白色,其中一些图像也会获得黑色背景
  2. 我尝试设置setImageCompressionQuality以获得更高质量的图像(右边没有创建的图像变得像素化)。
  3. 我似乎无法将图像的DPI版本更改为72 dpi。
  4. 代码如下:

        $file_name = basename($file_name);
        $img = new imagick();
    
        $img->readImage($dir.'/'.$file_name);
        $img->setImageBackgroundColor('white');
    
        $img->setResolution(72,72);
        $img->resampleImage(72,72,imagick::FILTER_LANCZOS,0);
        $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
        $img->setImageCompression(imagick::COMPRESSION_JPEG);
        $img->setImageCompressionQuality(100);
        $img->stripImage();
    
        $num_pages = $img->getNumberImages();
        for($i = 0;$i < $num_pages; $i++) {
            $img->setIteratorIndex($i);
    
            $img->setImageBackgroundColor('white');
            $img->flattenImages();
            $img->setImageFormat("jpeg");
    
            $final_name     = str_replace(" ", "+", basename(str_replace(".".$file_ext,"", $file_name)));
            $final_name     = preg_replace("/[^a-zA-Z0-9-+]/", "", $final_name);
    
            $save_to        = $pdf_dir."/".str_replace(".".$file_ext,"", $final_name).'-'.$i.'.jpg';
    
            $img->writeImage($save_to);
    
            $file_image = str_replace(dirname(__FILE__)."/../../", "/", $save_to);
            $file_images[] = $file_image;
        }
        $img->destroy();
    

2 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误。

  • 需要在加载PDF

  • 之前调用setResolution
  • 您需要使用setBackgroundColor而不是setImageBackgroundColor。

  • 您可能想要设置单个页面压缩质量,但请参见下文。

所以代码:

$imagick = new Imagick();
$imagick->setResolution(72, 72);

$imagick->readImage($file_name);
$imagick->setBackgroundColor('white');
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(70);

foreach ($imagick as $c => $_page) {
    $_page->setBackgroundColor('white');
    $_page->setImageCompressionQuality(70);
    $_page->setImageFormat('jpg');
    $_page->writeImage($file."_background-$c.jpg");
}
不过,你使用100质量的JPEG这一事实令人不安。如果这是将要发送到浏览器的图像,则质量应低于100.如果您将其用作中间图片,则使用PNG作为中间格式更好,因为它是无损的并且它支持透明度。

答案 1 :(得分:0)

这似乎做了伎俩,改为回答了一点,因为我无法让你的foreach工作,因为它使它按预期工作: 谢谢你让我免于很多头疼。

$img = new imagick();
$img->setResolution(72, 72);

$img->readImage($dir.'/'.$file_name);
$img->setBackgroundColor('white');
$img->setImageCompression(imagick::COMPRESSION_JPEG);
$img->setImageCompressionQuality(70);

$num_pages = $img->getNumberImages();
for($i = 0;$i < $num_pages; $i++) {
    $final_name     = str_replace(" ", "+", basename(str_replace(".".$file_ext,"", $file_name)));
    $final_name     = preg_replace("/[^a-zA-Z0-9-+]/", "", $final_name);

    $save_to        = $pdf_dir."/".str_replace(".".$file_ext,"", $final_name).'-'.$i.'.jpg';

    $img->setIteratorIndex($i);

    $img->setBackgroundColor('white');
    $img->setImageCompressionQuality(70);
    $img->setImageFormat('jpg');

    $img->writeImage($save_to);

    $file_image = str_replace(dirname(__FILE__)."/../../", "/", $save_to);
    $file_images[] = $file_image;
}