【问题标题】:Modifiying colours with color balance使用色彩平衡修改颜色
【发布时间】:2014-11-26 01:01:19
【问题描述】:

在 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 );
}

这很好用,在我的示例中,向图像的中间色调添加了少量青色。我想知道的是:如果我想通过类似的 -50 青色值(如上面的示例)修改 RGB 颜色,我该怎么做?最好把颜色改成CMKY,适当调整一下,再改回RGB。只有我在某处读到最好先从 RGB 转到 L*ab(我知道该怎么做)。

【问题讨论】:

    标签: javascript colors photoshop-script


    【解决方案1】:

    如果您想在 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
    

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

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

    当然,可以在 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 一起使用。

    【讨论】:

    • 感谢您的解释。现在我需要做的就是关联色彩平衡变化的值。 RGB 128, 128, 128 +100 红色到 156, 97, 97 & 60,60,60 到 91,33,33。看起来红色向上移动了 30,而其他红色移动了相同的移动。我必须进一步调查以获得更准确的值。
    • @GhoulFool 改变色彩平衡必须保持色彩的亮度稳定。所以如果red += 50 应该有green -= 25blue -= 25
    【解决方案2】:

    回答我自己的问题:可以返回“平衡”颜色的值。这不是一个优雅的解决方案:

    colourBalanceLayer("C0FFEE", 100,0,0);
    
    function colourBalanceLayer(hexcol, cya, mag, yel)
    {
    
      var pixH = 10;
      var pixV = 10;
    
      // create a document to work with
      var docRef = app.documents.add(pixH *2, pixV *2, 72, "colours")
      var newDoc = app.activeDocument;
    
      // =======================================================
      var id70 = charIDToTypeID( "Fl  " );
      var desc18 = new ActionDescriptor();
      var id71 = charIDToTypeID( "From" );
      var desc19 = new ActionDescriptor();
      var id72 = charIDToTypeID( "Hrzn" );
      var id73 = charIDToTypeID( "#Pxl" );
      desc19.putUnitDouble( id72, id73, 10.000000 );
      var id74 = charIDToTypeID( "Vrtc" );
      var id75 = charIDToTypeID( "#Pxl" );
      desc19.putUnitDouble( id74, id75, 9.000000 );
      var id76 = charIDToTypeID( "Pnt " );
      desc18.putObject( id71, id76, desc19 );
      var id77 = charIDToTypeID( "Tlrn" );
      desc18.putInteger( id77, 32 );
      var id78 = charIDToTypeID( "AntA" );
      desc18.putBoolean( id78, true );
      var id79 = charIDToTypeID( "Usng" );
      var id80 = charIDToTypeID( "FlCn" );
      var id81 = charIDToTypeID( "FrgC" );
      desc18.putEnumerated( id79, id80, id81 );
      executeAction( id70, desc18, DialogModes.NO );
    
      // 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 );
    
      // =======================================================
      var id40 = charIDToTypeID( "setd" );
      var desc11 = new ActionDescriptor();
      var id41 = charIDToTypeID( "null" );
      var ref5 = new ActionReference();
      var id42 = charIDToTypeID( "Clr " );
      var id43 = charIDToTypeID( "FrgC" );
      ref5.putProperty( id42, id43 );
      desc11.putReference( id41, ref5 );
      var id44 = charIDToTypeID( "T   " );
      var desc12 = new ActionDescriptor();
      var id45 = charIDToTypeID( "Rd  " );
      desc12.putDouble( id45, 255.000000 );
      var id46 = charIDToTypeID( "Grn " );
      desc12.putDouble( id46, 255.000000 );
      var id47 = charIDToTypeID( "Bl  " );
      desc12.putDouble( id47, 255.000000 );
      var id48 = charIDToTypeID( "RGBC" );
      desc11.putObject( id44, id48, desc12 );
      executeAction( id40, desc11, DialogModes.NO );
    
      var selRegion = null;
      selRegion = Array(Array(pixH, pixV),
      Array(pixH + 1, pixV),
      Array(pixH + 1, pixV + 1),
      Array(pixH, pixV + 1),
      Array(pixH, pixV));
      newDoc.selection.select(selRegion);
      var histR = newDoc.channels.getByName("Red").histogram;
      var histG = newDoc.channels.getByName("Green").histogram;
      var histB = newDoc.channels.getByName("Blue").histogram;
      var returnColor = new RGBColor();
    
      for (iHistR in histR)
      {
      if (histR[iHistR]!=0)
        {
          returnColor.red = iHistR;
        }
      }
      for (iHistG in histG)
      {
      if(histG[iHistG]!=0)
        {
          returnColor.green = iHistG;
        }
      }
      for (iHistB in histB)
      {
        if(histB[iHistB]!=0)
        {
          returnColor.blue = iHistB;
        }
      }
    
      alert(returnColor.red+","+returnColor.green+","+returnColor.blue);
    
      return returnColor;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2014-02-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多