我有一个带有图片的URL。我将图像保存在变量中。如果我用Imagick加载变量,则图像是在删除损坏的alpha之后的。
代码:
$image = new Imagick();
$image->readImageBlob($picture);
$image->writeImage ("test.png");
代码:
$image = new Imagick();
$image->readImageBlob($picture);
$image->setImageBackgroundColor('white');
$image->setImageAlphaChannel(11);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->writeImage ("test.png");
PHP版本7.3.11
imagick模块版本:3.4.4RC2
使用ImageMagick版本编译的Imagick:ImageMagick 7.0.7-11 Q16 x64 2017-11-23
ImageMagick发布日期:2017-11-23
“ setImageAlphaChannel”之后的图像被破坏。源文件是否引起了问题?如果是,是否有办法修复损坏的图像?
提前感谢!
编辑:
这是我的完整代码:
<?php
$url="https://i.imgur.com/jD5hRgO.png";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_REFERER, $url);
$picture = curl_exec ($ch);
curl_close($ch);
$image = new Imagick();
$image->readImageBlob($picture);
$image->writeImage ("before.png");
$image = new Imagick();
$image->readImageBlob($picture);
$image->setImageBackgroundColor('white');
$image->setImageAlphaChannel(11);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->writeImage ("after.png");
?>
您想使用Imagick::ALPHACHANNEL_REMOVE
。
$image = new Imagick();
$image->readImageBlob($picture);
$image->setImageBackgroundColor('white');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->writeImage ("after.png");
这将替换具有背景色的透明像素。
“ setImageAlphaChannel”之后的图像被破坏。源文件是否引起了问题?
并不是真的坏了,但是问题是由源文件引起的。将Alpha通道设置为11
(即C-API中的OpaqueAlphaChannel
)将强制“隐藏”颜色值不透明。在您的示例中,看不见的RGB数据是生成图像的作者遗留下来的伪像。
如果是,是否有办法修复损坏的图像?
不!您需要从源重做损坏的文件。将-alpha opaque
应用于alpha蒙版将具有破坏性。
["Masks"使用情况文章的引用...
此操作之后,由于原始的Alpha通道数据已被覆盖,因此无法再恢复图像的原始'形状'。