如何在photoshop曲线背后重现数学

时间:2010-12-05 01:01:03

标签: math graphics

基本上,我想要做的是了解如何计算沿着'曲线'的值,如photoshop曲线框中所示:

Photoshop Curves

因此,给定N点,其中x在0和1之间,y在0和1之间 - 我们将创建一条穿过所有这些点的曲线。鉴于此曲线,我希望能够计算任何给定X的曲线的所有值。

换句话说,我想像曲线框一样修改颜色值,但是以编程方式修改。

我读过这些是“catmull-rom splines” - 但我看到的只是一个依赖于参数T的函数 - 我希望能够查找x的值。如果可能,我想在C中这样做

5 个答案:

答案 0 :(得分:7)

答案 1 :(得分:3)

使用 Catmull-Rom Spline ,因为它是一种样条曲线,表示可以添加控制点并细化曲线本身的曲线(这是您在单击时在Photoshop上执行的操作添加新点),具有使曲线通过您指定的每个控制点的特殊性。

在任何情况下,你只需要一个取值的函数(浮点数为0..1或0..255中的int或你所拥有的任何颜色空间)都会产生另一个值。

float fun(float x) {
  y = /* something */
  return y;
}

当然,这可以通过任何类型的功能来完成。最基本的是默认的身份函数

float fun(float x) {
  y = x;
  return y;
}

任何其他函数都可以用曲线计算,它可以正常但开发起来比较复杂,我建议你从简单的例子开始,比如Bezier曲线。在任何情况下都使用t参数,因为它们是参数曲线,您需要在深入研究开发之前了解曲线的一些数学背景,看看here

答案 2 :(得分:2)

这是一个vbscript的链接,似乎可以实现photoshop使用的三次样条曲线。

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68577&lngWId=-1

答案 3 :(得分:2)

Photoshop使用 interpolating cubic spline 作为曲线,正如a separate Math StackExchange thread所述。

答案 4 :(得分:0)

我不熟悉C-R,但如果它像beziers,则T参数从曲线部分的一个端点处的0变化到另一个端点处的一个。这就是你如何“走上”曲线。所以你不能只是插入你输入的x值。你可以在某个任意间隔采样一个长的,或者你可以使用某种目标寻找算法来接近给定的x值,达到你认为必要的任何精度。