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 中的每一页创建图像,但我 运行 遇到以下问题。现在已经被困在这里好几天了。
- 当我从 PDF 文件创建图像时,即使我已将 setImageBackgroundColor 设置为白色,其中一些图像也会变成黑色背景
- 我尝试设置 setImageCompressionQuality 以获得更好质量的图像(不是创建的图像像素化)。
- 我似乎也无法将图像的 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;
}
我在尝试使用 imagick 和 PHP (5.5) 将 PDF 转换为图像时遇到问题。一切正常,我可以为 PDF 中的每一页创建图像,但我 运行 遇到以下问题。现在已经被困在这里好几天了。
- 当我从 PDF 文件创建图像时,即使我已将 setImageBackgroundColor 设置为白色,其中一些图像也会变成黑色背景
- 我尝试设置 setImageCompressionQuality 以获得更好质量的图像(不是创建的图像像素化)。
- 我似乎也无法将图像的 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;
}