【问题标题】:PHP removing alpha in Imagick results in corrupted picturePHP 在 Imagick 中删除 alpha 导致图片损坏
【发布时间】:2020-03-14 08:16:29
【问题描述】:

我有一个带有图片的 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");


?>

【问题讨论】:

  • 图片链接:i.imgur.com/jD5hRgO.png
  • 您使用11 值来设置Alpha 通道——它映射到OpaqueAlphaChannel。您应该使用预定义的常量Imagick::ALPHACHANNEL_REMOVE,它将用背景颜色替换 Alpha 通道。
  • 这解决了我的问题!如果您将其发布为答案,我会将其标记为正确。感谢您的帮助!

标签: php imagemagick png imagick alpha-transparency


【解决方案1】:

你想使用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 通道数据已被覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2018-06-29
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多