用色彩平衡修饰色彩
Modifiying colours with color balance
在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
我们看到了同样的不准确之处。
EDIT在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一起工作。
回答我自己的问题:可以返回"平衡"颜色的值。这不是一个优雅的解决方案:
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;
}
- 为图例添加动态色彩标签
- Firefox中document.write()的树不平衡
- 如何在node.js中的两个相同主机之间进行负载平衡(弹性)
- 使用 HTTP 代理进行负载平衡
- 这是一个好的服务器的负载平衡系统吗?
- 使用 SVG 的色彩平衡效果
- 为什么我的平衡不会改变
- JavaScript数据结构:优先级队列,字典,平衡二叉树
- 平衡.init() 上的 JS 错误
- 如何在多行上均匀平衡文本
- 用色彩平衡修饰色彩
- 使用Node.jslib从平衡支付中获取JSON数据
- 是否有可能增加一个额外的高度来平衡高度
- 色彩可视化网站开发
- 尝试用动画在拉斐尔的色彩中循环
- 不平衡的二叉树不能正常工作.node . js
- 该图像色彩均衡算法逻辑错误
- 平衡性能繁重的程序与实时鼠标输入
- JavaScript Regex匹配平衡结构,而不关心不平衡结构
- 我可以用javascript负载平衡