【问题标题】:Why my ImageMagick performs colortoning with different results than expected?为什么我的 ImageMagick 执行调色时的结果与预期不同?
【发布时间】:2013-03-12 13:18:28
【问题描述】:

我找到了用于照片滤镜的 Instagraph PHP 库(GitHubNetTuts)。但是,我在我的盒子上发现它输出的图像与 NetTuts 上显示的图像不同。因为我对照片滤镜或 ImageMagick 的魔法一无所知,所以我需要你的帮助,ImageMagick 魔术师 :-)

我已将问题本地化,它必须在 colortone 函数内,否则过滤器可以正常工作。让我们以 Toaster 作为展示,因为它只执行一次 colortone 转换。

colortone PHP function(bash 转义)生成的代码:

convert test.jpg \( -clone 0 -fill '#330000' -colorize 100% \) \( -clone 0 -colorspace gray -negate \) -compose blend -define compose:args=100,0 -composite test.jpg

完成过滤的命令序列的其余部分(应该没问题):

convert test.jpg -modulate 150,80,100 -gamma 1.2 -contrast -contrast test.jpg
convert test.jpg \( -size 960.0x960.0 radial-gradient:none-LavenderBlush3 -gravity center -crop 640x640+0+0 +repage \) -compose multiply -flatten test.jpg
convert test.jpg \( -size 960.0x960.0 radial-gradient:#ff9966-none -gravity center -crop 640x640+0+0 +repage \) -compose multiply -flatten test.jpg

现在,让我们看看 Toaster 过滤器的预期结果

但是,我的脚本会产生以下内容:

颜色要深很多,但我不知道为什么。可能只有两种选择可以解释这种行为:

  1. 库的作者在他的库中存在错误。 (我不这么认为,但还是有可能的……)
  2. 我的 ImageMagick 与作者的不同,因此会产生不同的结果。(这是怎么发生的?)

有人知道为什么我的 ImageMagick 会产生不同的结果吗?会不会是一些初始设置?我的 ImageMagick 完全是从标准 Ubuntu 软件包安装的。

$ convert --version
Version: ImageMagick 6.7.7-10 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP

我编译了自己最新的 ImageMagick 上游版本,它产生了相同的错误输出。

$ convert --version
Version: ImageMagick 6.8.3-9 2013-03-15 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2013 ImageMagick Studio LLC
Features: DPC OpenMP
Delegates: bzlib djvu mpeg fontconfig freetype jbig jng jp2 jpeg lcms lqr lzma openexr png ps tiff x xml zlib

【问题讨论】:

  • 您可以在调用self.imagemagick(...) 之前先执行print commands 并向我们展示输出吗?我还注意到您在第一个字符串中 -composite 之后有一个文件名,但在第二个字符串中没有。
  • self.imagemagick 添加文件名。命令扩展为'( -clone 0 -fill #330000 -colorize 100% ) ( -clone 0 -colorspace gray -negate ) -compose blend -define compose:args=100,0 -composite' 第一个字符串基本上是从self.imagemagick函数内部的日志输出。
  • 直接从 shell 运行 imagemagick 能得到正确的输出吗?
  • 我根据我的进一步调查更改了问题。
  • 准确了解作者使用的版本,更重要的是,了解作者使用的配置选项以及用于所述配置选项的库版本将有助于您的诊断。请记住,Imagemagick 利用了几个不同的编程库,其中任何一个都可能影响渲染输出。

标签: imagemagick imagemagick-convert


【解决方案1】:

Solution:

convert -set colorspace RGB test.jpg \( -clone 0 -fill '#330000' -colorize 100% \) \( -clone 0 -colorspace gray -negate \) -compose blend -define compose:args=100,0 -composite test.jpg

英文:添加-set colorspace RGB 强制图像为线性RGB色彩空间。


感谢 Instagraph 的作者 guys from ImageMagick forumDejan Marjanovic 在我的调查中提供帮助。出现该问题是因为 ImageMagick changed behavior 在 6.7.7-8 版本中并开始默认将图像视为 sRGB。

Dejan 使用 6.7.5 版本开发和测试了 Instagraph,当时该版本处于上游。编写过滤器时假定 RGB 作为默认色彩空间(之前的 ImageMagick 的默认行为)。我用 ImageMagick 6.7.7-10 和 6.8.3-9 尝试了相同的代码,所以得到了不同的输出。

如果添加了-set colorspace RGB,图像将转换为线性 RGB,并且滤镜按设计正常工作。另一种解决方案(可能更好)是调整色调子程序,使其也适用于 sRGB 颜色空间,但这远远超出了我目前的知识范围,所以我对此很满意,比如说 hotfix .

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 2020-04-07
    • 2023-02-02
    • 2020-11-14
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多