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->setimageformat("jpg");
更改为此代码
$im->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 黑色背景的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 和 ImageMagick 将 PDF 转换为高质量的 JPG