7

我有一个 php 脚本来创建 pdf 的 jpg 缩略图,如下所示;

<?php
$file ="test.pdf";
$im = new imagick(realpath($file).'[0]');
$im->setImageFormat("jpg");
$im->resizeImage(200,200,1,0);
// start buffering
ob_start();
$thumbnail = $im->getImageBlob();
$contents =  ob_get_contents();
ob_end_clean();
echo "<img src='data:image/jpg;base64,".base64_encode($thumbnail)."' />";
?>

但是生成的jpg有黑色背景而不是白色..我该如何解决这个问题?

4

8 回答 8

18

以前发布的答案都没有对我有用,但是下面的答案:

$image = new Imagick;

$image->setResolution(300, 300);

$image->readImage("{$originalPath}[0]");

$image->setImageFormat('jpg');

$image->scaleImage(500, 500, true);

$image->setImageAlphaChannel(Imagick::VIRTUALPIXELMETHOD_WHITE);

当我使用 Laravel 框架时,我会获取转换后的图像并使用 Laravel 文件系统存储它。

Storage::put($storePath, $image->getImageBlob());

更新:所以我最近更改了操作系统,而这以前在我的 Mac 上的 Ubuntu 机器上工作,但某些图像仍然是黑色的。

我不得不将脚本更改为以下内容:

$image = new Imagick;

$image->setResolution(300, 300);

$image->setBackgroundColor('white');

$image->readImage("{$originalPath}[0]");

$image->setImageFormat('jpg');

$image->scaleImage(500, 500, true);

$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);

在读取图像之前设置背景颜色似乎很重要。我还展平了所有可能的图层并删除了 Alpha 通道。我觉得我ALPHACHANNEL_REMOVE在我的 Ubuntu 机器上试过了,但它没有用,所以希望在这些答案之间,读者可以找到适合他们的东西。

于 2017-08-25T10:36:13.840 回答
1

如果您的 Imagick 版本不是最新的,则 setImageBackgroundColor 可能是错误的。

交换以下行

$im->setImageBackgroundColor("red");

对此(Imagick 版本 >= 2.1.0)

$im->setBackgroundColor(new ImagickPixel("red"));

或(Imagick 版本 < 2.1.0)

$im->setBackgroundColor("red");
于 2011-05-23T16:23:50.590 回答
1

我解决了它;

$im = new imagick(realpath($file).'[0]');
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->writeImage("imagename.jpg");
于 2012-04-09T16:46:14.013 回答
1

简单地添加它可以防止用黑色背景创建 JPG

-alpha off
于 2012-09-07T09:39:55.317 回答
1

如果您遇到背景颜色问题,请$im->setimageformat("jpg");将此代码 更改为此代码。$im->setimageformat("png");

于 2015-05-19T05:24:30.093 回答
0

在无数次尝试使用 jpeg 图像附加 pdf 文件而不出现黑色区域​​后,我找到了解决方案:函数transformImageColorspace

按此顺序使用非常有效:

$im = new Imagick();
$im->readImage("file.pdf");

$im->transformImageColorspace(Imagick::COLORSPACE_SRGB);

$im->setImageFormat('jpeg');
$im->writeImage('image.jpg');
于 2021-11-11T22:18:46.247 回答
0

只需在创建新的 imagick() 后立即使用 flattenImages():

$im = new Imagick('file.pdf[0]');
$im = $im->flattenImages();

编辑: flattenImages 方法已被弃用和删除。采用

$im = $im->mergeImageLayers( imagick::LAYERMETHOD_FLATTEN );
于 2021-12-02T22:48:46.793 回答
0

我想补充一下出色且有用的答案,如果您的 PDF 有多个页面,则需要稍微不同的方法。

我惊讶地发现Imagick该类实现了Iterable,这意味着您可以通过foreach循环运行它并依次在每个页面上操作(事实证明这是必要的,因为图层、颜色和 alpha 通道的更改似乎只会生效在最后一页),它将作为一个单独的Imagick对象呈现给您:

$im = new Imagick('path/to/file.pdf');
foreach ($im as $c => $page)
{
    // do what you need to do with each page and then...
    $im->writeImage('path/to/image-'.$c.'.jpg');
}
于 2022-02-24T22:54:03.383 回答