2012-05-22 45 views
3

我试图将Photoshop中创建的一些效果转换为代码使用PHP/imagemagick。现在我特别感兴趣的是如何重新创建Photoshop的RGB等级功能。我不是很熟悉Photoshop的界面,但是这是信息,我给出:Photoshop的RGB水平与ImageMagick

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

什么exaclty是输入电平与输出电平?我如何将它转换成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 –

+1

我不确定他希望澄清API的用法,尽可能多地理解如何使用它重现Photoshop效果。 – Ani

回答

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-255。他们可能实际上是0-65535在您的系统上。如果这是他们可以很容易地调整它。您还可以使用$ im-> getQuantumRange()检查设置使用的值。它将返回一个数组,其中包含一个字符串版本和一个长版本的量子。从那里开始,应该很容易规范化数值或者使用新的范围。

+0

任何方式在GD中实现这一点? – alphablender

+0

你有一个完整的工作例子吗?或者代码如何应用于图像?这是我需要的东西。 –

+0

$ im是一个IMagick对象(图像应该先前已加载到该对象中)。只需将上面看到的代码应用到IMagick图像。 – gregghz

1

查看documentation:第一个值是黑点(阴影)输入值,中间是伽马(我猜测它与Photoshop的中点相同),最后一个是白点(高亮)输入值。

输出值固定为图像类型的量子值,不需要指定它们。

+2

看到了,但这或多或少是我所尝试过的,它不会产生与Photoshop相同的结果 – gregghz

+0

@ greggory.hz,“不会产生相同的结果”不是很具描述性。帮助我们帮助你。 –

+0

你是对的,这不是很具描述性。但那是故意的,因为我希望从photoshop到图像魔术师进行一对一的映射。我怀疑这不太可能。所以,如果取而代之,我会很高兴能够了解photoshop的rgb级别的工作原理,以便我可以让底层知识正确调整(而不是无目标地)以实现我想要的结果。 – gregghz

3

阴影,中间色调和亮点是落在一定亮度范围内的颜色。例如,阴影是亮度直方图的较低范围,中间色是中间的颜色,亮点是高的。但是 - 您无法对这些值使用硬性限制,这就是为什么您必须使用像这样的曲线来加权直方图(像素可能同时位于多个范围内)。

Shadows, MidTones and Highlights

要单独调节阴影,中间色调和亮点,你将需要创建每个像素使用当前阴影,中间色调和高光值来创建作为结果的值的加权和。

我不认为你可以直接使用ImageMagick API来做到这一点 - 也许你可以简单地把它写成一个过滤器。

希望这会有所帮助。

+0

据我了解,阴影和高光是抛物线,对吧?但是它的公式是什么? –

+1

@MaksimSorokin否 - 他们gaussians(http://en.wikipedia.org/wiki/Gaussian_function)适当地缩放和翻译。 – Ani