javascript - 使用色彩平衡修改颜色

标签 javascript colors photoshop-script

在 JavaScript 中,我可以使用像这样的函数来调整图像的色彩平衡

colorBalanceLayer(-50,0,0)

function colourBalanceLayer(cya, mag, yel)
{
  // cyan, magenta, yellow values are between -100 & +100
    var id713 = charIDToTypeID( "ClrB" );
    var desc162 = new ActionDescriptor();
    var id714 = charIDToTypeID( "ShdL" );
    var list37 = new ActionList();
    list37.putInteger( 0 );
    list37.putInteger( 0 );
    list37.putInteger( 0 );
    desc162.putList( id714, list37 );
    var id715 = charIDToTypeID( "MdtL" );
    var list38 = new ActionList();
    list38.putInteger( cya );
    list38.putInteger( mag );
    list38.putInteger( yel );
    desc162.putList( id715, list38 );
    var id716 = charIDToTypeID( "HghL" );
    var list39 = new ActionList();
    list39.putInteger( 0 );
    list39.putInteger( 0 );
    list39.putInteger( 0 );
    desc162.putList( id716, list39 );
    var id717 = charIDToTypeID( "PrsL" );
    desc162.putBoolean( id717, true );
    executeAction( id713, desc162, DialogModes.NO );
}

效果很好,在我的示例中,向图像的中间调添加了青色。我想知道的是:如果我想将 RGB 颜色修改为类似的 -50 青色值(如上例所示),我该怎么做?最好将颜色更改为 CMKY,适当调整,然后再改回 RGB。只有我在某处读到我最好先从 RGB 转到 L*ab(我知道该怎么做)。

最佳答案

如果您想在 RGB 颜色上使用该函数,您必须将它们转换为 CMY,因为 colorBalanceLayer 设计用于处理 CMY 颜色。可以使用以下功能轻松完成:

// r, g, b and c, m, y are in the range of 0 to 255

function rgb_cmy(r, g, b) {
    return [].map.call(arguments, function(v) {return 255 - v;});
}

// return value is an array of the form: [cyan, magenta, yellow]

处理后使用相同的函数转换回 RGB:

rgb_cmy(c, m, y) // returns an array of the form: [red, green, blue]

我们是否应该将转换为 L*ab 作为中间步骤? 没有。

RGB 和 CMY 是两个大小相同的不同颜色空间:这意味着:两者包含相同数量的颜色。但是这两个空间并没有完全相互覆盖。这意味着:RGB 包含一些不能完全表示为 CMY 颜色的颜色,反之亦然。因此每次转换都会带来一些不准确。

L*ab 色彩空间比其他色彩空间大得多,完全涵盖了 RGB 和 CMY。这意味着:每种 RGB(或 CMY)颜色都可以准确地表示为 L*ab 颜色,但有许多 L*ab 颜色无法用 RGB 或 CMY 表示。

如果 RGB 颜色不完全适合 CMY,则会发生以下情况:

RGB --inaccurate--> CMY --inaccurate--> RGB // output !== input
RGB --accurate--> L*ab --inaccurate--> CMY --accurate--> L*ab --inaccurate--> RGB

我们看到引入了相同的错误。

编辑colorBalanceLayer 中调用一些其他函数。我看不出他们到底做了什么,所以我只能提供以下内容作为草稿。

当然,可以在不进行任何转换的情况下更改 RGB 颜色中的青色、品红色或黄色。为此,我们需要知道两件事:

1) CMY 与打印颜料一起使用,RGB 与发射光一起使用,因此它们在亮度上是互补的。这意味着:为 CMY 增加一些值会使颜色更深,为 RGB 添加一些值使其更亮。

2) RGB和CMY的色轮转了60度,所以它们是颜色互补的。这意味着:两者的相反颜色构成互补对青色/红色、品红色/绿色和黄色/蓝色。

因此,以下操作会导致相同的结果(左 CMY,右 RGB):

cyan += 20   ===   red -= 20;
magenta  -= 30   ===   green += 30;
yellow += 40   ===   blue -= 40;

也许可以调整您的函数,使它们也适用于 RGB。

关于javascript - 使用色彩平衡修改颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137112/

相关文章:

javascript - 在 Safari、iOS 上使用 History API 后警告、确认和提示不起作用

javascript - 在元素中保存超时

javascript - 调整 photoshop 智能对象 JavaScript

javascript - 如何在 Javascript 中创建圆形或椭圆形选区以便在 Photoshop 中使用?

c# - 将 C# 日期时间转换为 Javascript 日期

android - 在 Linux [android] 上为 logcat 的行着色

javascript - 如何更改我的 WordPress 网站加载栏的颜色?

graph - 不同类别的 Stata 着色条形图

javascript - 如果警报被取消,如何使 javascript 部分重复?

javascript - 如何为这个脚本 jquery 绑定(bind)关闭事件