php Imagemagick jpg 黑色背景

Posted

技术标签:

【中文标题】php Imagemagick jpg 黑色背景【英文标题】:php Imagemagick jpg black background 【发布时间】:2011-08-31 06:36:32 【问题描述】:

我有一个 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 有黑色背景而不是白色。我该如何解决这个问题??

【问题讨论】:

有问题的 jpg 文件的副本或链接会有所帮助,同时也是结果输出的屏幕截图。 Laurence Burke:这是生成的图像i.imgur.com/jyQC6.jpg 你的css样式是什么样的,你能链接原始的jpg吗??? @Laurence Burke,以上是原jpg文件。我根本没有造型.. 【参考方案1】:

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

换行

$im->setImageBackgroundColor("red");

至此(Imagick 版本 >= 2.1.0)

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

或(Imagick 版本

$im->setBackgroundColor("red");

【讨论】:

我对我的问题进行了一些更改.. 看看.. 你的建议不起作用.. @blasteralfred 您能否提供对 PDF 副本的访问权限,因为我认为问题可能与此有关,而不是您现在在上面提供的代码。更新后的代码适用于我拥有的 PDF 没有问题。【参考方案2】:

我解决了;

$im = new imagick(realpath($file).'[0]');
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->writeImage("imagename.jpg");

【讨论】:

setCompressionQuality 实际上并没有在这种情况下工作。对于更改质量,请使用setImageCompressionQuality【参考方案3】:

只需添加此项即可防止创建带有黑色背景的 JPG

-alpha off

【讨论】:

在哪里?请按照问题的格式给出答案。所以在这种情况下有效的php。 $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);【参考方案4】:

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

【讨论】:

【参考方案5】:

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

$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 通道。我觉得我在我的 Ubuntu 机器上尝试了ALPHACHANNEL_REMOVE,但它没有用,所以希望读者能在这些答案之间找到适合他们的东西。

【讨论】:

【参考方案6】:

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

按此顺序使用效果很好:

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

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

$im->setImageFormat('jpeg');
$im->writeImage('image.jpg');

【讨论】:

【参考方案7】:

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

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

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

$im = $im->mergeImageLayers( imagick::LAYERMETHOD_FLATTEN );

【讨论】:

以上是关于php Imagemagick jpg 黑色背景的主要内容,如果未能解决你的问题,请参考以下文章

imagemagick - 具有静态黑色背景的动画?

Imagemagick 旋转透明图像上不需要的黑色背景

php怎么输出背景透明的图片?

使用 PHP 和 ImageMagick 将 PDF 转换为高质量的 JPG

PHP PDF2JPG - 使用ImageMagick将PDF转换为JPG图像

ImageMagick/Imagick 使用原生 PHP API 将 PDF 转换为 JPG