ImageMagick如何处理Photoshop中的RGB级别?

3

我试图将在Photoshop中创建的一些效果转换为用于php/imagemagick的代码。现在我特别想知道如何重新创建Photoshop的RGB级别功能。我不太熟悉Photoshop界面,但这是我所得到的信息:

RGB Level Adjust
  Input levels: Shadow 0, Midtone 0.92, Highlight 255
  Output levels: Shadow 0, Highlight 255

输入级别和输出级别究竟是什么?我该如何将其转换为ImageMagick?下面是我尝试的内容,但它并没有正确地呈现所需的效果(将Photoshop的0-255比例转换为0-65535):

$im->levelImage(0, 0.92, 65535);
$im->levelImage(0, 1, 65535);

由于参数名称不匹配,且在输出级别时参数数量甚至不匹配,因此这基本上是在尝试中进行的。实际上,我并不完全理解Photoshop应用调整时正在发生什么。我认为这是我目前面临的最大障碍。一旦理解了这个问题,我就需要在ImageMagick中找到相应的效果。

有人能够揭示一下Photoshop中正在发生什么以及如何使用ImageMagick复制它吗?


1
请参见 http://stackoverflow.com/questions/4539307/php-imagicklevelimage-usage - Mark Ransom
1
我不确定他想要关于API的使用澄清,还是更想了解如何使用它来复制Photoshop效果。 - Ani
3个回答

3
我发现了这个网站:http://www.fmwconcepts.com/imagemagick/levels/index.php。根据那里的信息,我能够编写以下PHP代码,在输入和输出等方面很有效地模拟了Photoshop的操作。
function levels($im, $inshadow, $midtone, $inhighlight, $outshadow, $outhighlight, $channel = self::CHANNEL_ALL) {
    $im->levelImage($inshadow, $midtone, $inhighlight, $channel);
    $im->levelImage(-$outshadow, 1.0, 255 + (255 - $outhighlight), $channel);
}

假设levelImage的黑点和白点参数在你的系统上是0-65535的范围,而不是0-255。 如果是这样,很容易就可以进行调整。 你也可以通过$im->getQuantumRange()来检查你的设置所使用的值。它将返回一个包含量子的字符串版本和长版本的数组。从那里可以很容易地归一化值或者只是使用新的范围。


有没有办法在GD中实现这个功能? - alphablender
你有完整的工作示例吗?或者代码如何应用于图像?这是我需要的东西。 - Panama Jack
$im是一个IMagick对象(应该先加载图像)。只需将上面的代码应用于您的IMagick图像即可。 - gregghz
有人能解释一下-$outshadow值是如何有效的吗?我知道levelImage的输入值应该在0-255之间,那么负值会发生什么?另外,$outhighlight值为(255 + (255 - $outhighlight)),难道不总是255或更高吗?再次提醒,我认为levelImage需要一个在0-255之间的值。 - Ravean

3
阴影,中间色调和高亮度是在某个亮度范围内的颜色。例如,阴影是亮度直方图的较低范围,中间色调是介于两者之间的颜色,而高光则是最亮的颜色。但是,你无法对这些值使用硬性限制,因此你需要使用类似这样的曲线来加权直方图(一个像素可能同时处于多个范围内)。
要单独调整阴影、中间色调和高光,你需要为每个像素创建一个加权总和,该总和使用当前阴影、中间色调和高光值来创建结果值。
我认为你不能直接使用ImageMagick API进行此操作,也许你可以将其编写为过滤器。
希望这些能够帮到你。

据我所知,阴影和高光是抛物线,对吗?但它的公式是什么? - Maksim Sorokin
1
@MaksimSorokin 不是的 - 它们是高斯函数(http://en.wikipedia.org/wiki/Gaussian_function),适当缩放和平移。 - Ani

1
请查看文档:第一个值是黑点(阴影)输入值,中间是伽马值(我猜想与Photoshop的中点相同),最后是白点(高光)输入值。
输出值固定为图像类型的量子值,无需指定。

2
看,但那大致上就是我尝试过的,它并不能像在Photoshop中一样产生相同的结果。 - gregghz
你说得对,那不是很具体。但这是有意为之的,因为我希望从Photoshop到ImageMagick有一对一的映射。我怀疑这不太可能。所以如果没有这个,我会很高兴能够获得资源来了解Photoshop的RGB级别是如何工作的,这样我就可以获得低级别的知识来适当地调整(而不是漫无目的地)以达到我想要的结果。 - gregghz
@greggory.hz 请看我上面的回答,它旨在完全实现这一点。 - Ani
@greggory.hz,中间色调肯定是伽马值,但可能被反转了。尝试使用1.0/0.92,看看是否匹配。 - Mark Ransom
你是正确的,看起来它似乎是伽马值,但我不认为它是反转的。但我在另一个答案中提供了我得出的最终解决方案。我很抱歉无法有效量化结果有多大的偏差,但它们完全是错误的。它们似乎没有考虑输出值。 - gregghz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接