【问题标题】:PHP Imagick PSD thumbs getting strange artifactsPHP Imagick PSD 大拇指得到奇怪的伪影
【发布时间】:2015-02-13 22:52:34
【问题描述】:

我们有一个接受 PSD 文件的服务器。它会将其加载到一个新的 Imagick 对象中并为其创建 4 个 jpg 拇指。

奇怪的是第一个拇指,最大的那个看起来很棒。之后的每个拇指都会在图层使用描边效果时出现一些图像失真。

代码:

$image = new Imagick($fileName);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

foreach ($thumbSizes as $key => $size) { //largest to smallest
     if($size>$longestSide){
          $size = $longestSide;
     }
     $this->image->thumbnailImage($size,$size,true);
     $this->image->writeImage($nameBase . '-' . $key . ".$extension");
}
$image->destroy();

我不确定 Imagick 内部是如何工作的,但我的直觉告诉我,如果最大的拇指是准确的,那么之后的每个拇指都应该是准确的。

注意:我预计在调整图像大小时会出现一些图像失真。但是,如果您查看我发布的示例,它与您正常调整大小的工件不同。它正在改变一些文本的颜色。我认为调整笔画效果的大小是一个问题。但我会认为,因为我先将图像展平,所以笔触效果将不再存在。我可以传入同一个文件的 jpeg 表示形式,它会完美地调整它们的大小。

【问题讨论】:

  • 示例图片显示给您了吗?它正在改变图像上的颜色,看看“01”。它是红色的,然后突然变黑。我完全希望缩小尺寸而不是改变颜色会导致图像失真。
  • @developerwjk 如果它以 JPG 而不是 PSD 开头,则不会发生
  • @Sean256 你能提供一个示例 psd 吗?这很可能是实际进行转换的包的问题 - 通常是 inkscape 或 rsvg。
  • 我在想我是通过使用 mergeImageLayers 来避免这种情况
  • @developerwjk 你没有帮助.....图像明显不同,而且不一致。

标签: php imagick


【解决方案1】:

我认为 PSD 转换只是被 PSD 上的库/特殊 FX 破坏了。这是与您的类似代码输出的第一张图像:

数字的颜色是透明的而不是黑色的——但同样不正确。如果问题是由该层上的 FX 引起的,并且您找不到处理正常工作的 PSD 的库版本,我建议不要使用 Imagick/ImageMagick 进行处理,而是安装一个副本服务器上的 Photoshop,并使用 Photoshop 本身的 CLI 处理能力进行处理:https://helpx.adobe.com/photoshop/using/processing-batch-files.html

顺便说一句,您正在反复调整同一图像的大小,这不是最佳的。您可以通过调整原始图像的克隆大小来避免这种情况:

foreach ($thumbSizes as $key => $size) { //largest to smallest

    $temp = clone $image;
    if($size>$longestSide){
         $size = $longestSide;
    }
    $temp->thumbnailImage($size,$size,true);
    $temp->writeImage($nameBase . '-' . $key . ".$extension");
}

这应该会提供稍高的输出图像质量。

【讨论】:

  • 实际上我们就是这样开始的。它对红黑色的颜色变化做同样的事情。最终的拇指总体上要好一些(压缩伪影更少),但花费了几毫秒的时间。对我们来说,压缩工件值得我们节省毫秒的时间,但红黑错误不是。
  • 有趣的是,dropbox 也关闭了预览。他们可能使用的是同一个库。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多