3

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

我本地化了这个问题,它必须在colortone功能范围内,否则过滤器工作得很好。让我们以Toaster为例,因为它只执行一次色调转换。

colortone PHP 函数生成的代码(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
4

1 回答 1

3

解决方案

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 颜色空间中。


感谢ImageMagick 论坛和Instagraph 的作者Dejan Marjanovic在我的调查中提供的帮助。出现此问题是因为 ImageMagick在 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,并且过滤器按设计正常工作。另一种解决方案(可能更好)是调整 colortone 子程序,使其也适用于 sRGB 颜色空间,但这远远超出了我目前的知识范围,所以我对此很满意,比如说hotfix

于 2013-03-15T11:04:39.267 回答