imagick:从 PDF 页面创建图像时无法使 setImageBackgroundColor、setImageCompressionQuality 和 setImageResolution 起作用

imagick: Cannot get setImageBackgroundColor, setImageCompressionQuality and setImageResolution to work when creating images from PDF pages

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

  1. 当我从 PDF 文件创建图像时,即使我已将 setImageBackgroundColor 设置为白色,其中一些图像也会变成黑色背景
  2. 我尝试设置 setImageCompressionQuality 以获得更好质量的图像(不是创建的图像像素化)。
  3. 我似乎也无法将图像的 DPI 版本更改为 72 dpi。

代码如下:

    $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();

你的代码有一些错误。

  • 加载 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 作为中间格式更好,因为它无损且支持透明。

这似乎可以解决问题,因为我无法让您的 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;
}