function get_average_color(color)
from here: Auto picking the most distinct accent color from an image
UPD.
Короче. По ссылке - глючная реплика со старого форума, скрипты там все нерабочие.
Вот готовый скрипт.
get_average_color(app.foregroundColor);
////////////////////////////////////////////////////////////
function get_average_color(color, x, y)
{
try {
if (x != undefined && y != undefined) app.activeDocument.selection.select([[x,y],[x+1,y],[x+1,y+1],[x,y+1]], SelectionType.REPLACE);
var chnl = 3;
if (app.activeDocument.mode == DocumentMode.CMYK) chnl = 4;
if (app.activeDocument.mode == DocumentMode.GRAYSCALE) chnl = 1;
var lm = new Array();
var px = new Array();
for (var i = 0; i < chnl; i++)
{
var hst = get_histogram(i+1);
var l = 0;
var p = 0;
if (!hst) { return false; }
for (var n in hst) { l += hst[n] * n; p += hst[n]; }
hst = null;
lm.push(l);
px.push(p);
}
if (app.activeDocument.mode == DocumentMode.RGB)
{
var r =lm[0]/px[0];
var g =lm[1]/px[1];
var b =lm[2]/px[2];
with (color.rgb) { red = Math.round(r); green = Math.round(g); blue = Math.round(b); };
}
else if (app.activeDocument.mode == DocumentMode.LAB)
{
var _l = lm[0]/px[0] * 100/255;
var _a = lm[1]/px[1] - 128;
var _b = lm[2]/px[2] - 128;
with (color.lab) { l = Math.round(_l); a = Math.round(_a); b = Math.round(_b); };
}
else if (app.activeDocument.mode == DocumentMode.CMYK)
{
var c = 100 - lm[0]/px[0] * 100/255;
var m = 100 - lm[1]/px[1] * 100/255;
var y = 100 - lm[2]/px[2] * 100/255;
var k = 100 - lm[3]/px[3] * 100/255;
with (color.cmyk) { cyan = Math.round(c); magenta = Math.round(m); yellow = Math.round(y); black = Math.round(k); };
}
else if (app.activeDocument.mode == DocumentMode.GRAYSCALE)
{
var _l = 100 - lm[0]/px[0] * 100/255;
with (color.gray) { gray = Math.round(_l); };
}
else { alert("Unsupported color mode", "Error", true); return false; }
if (x != undefined && y != undefined) app.activeDocument.selection.deselect();
return true;
}
catch (e) { alert(e); }
}
////////////////////////////////////////////////////////////
function get_histogram(n)
{
try {
var r = new ActionReference();
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("histogram"));
if (typeof(n) == "string")
r.putName(stringIDToTypeID("channel"), n);
else
{
if (app.activeDocument.mode == DocumentMode.RGB)
{
switch (n)
{
case -1: r.putEnumerated(stringIDToTypeID("document"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); break;
case 0: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("RGB" )); break;
case 1: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("red" )); break;
case 2: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("green")); break;
case 3: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("blue" )); break;
default: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); break;
}
}
else if (app.activeDocument.mode == DocumentMode.LAB)
{
switch (n)
{
case -1:
case 0: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("lab" )); break;
case 1: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("lightness")); break;
case 2: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("a" )); break;
case 3: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("b" )); break;
default: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); break;
}
}
else if (app.activeDocument.mode == DocumentMode.CMYK)
{
switch (n)
{
case -1: r.putEnumerated(stringIDToTypeID("document"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); break;
case 0: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("CMYK" )); break;
case 1: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("cyan" )); break;
case 2: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("magenta")); break;
case 3: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("yellow" )); break;
case 4: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("black" )); break;
default: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); break;
}
}
else if (app.activeDocument.mode == DocumentMode.GRAYSCALE)
{
switch (n)
{
case -1:
case 0: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("channel"), stringIDToTypeID("black")); break;
default: r.putEnumerated(stringIDToTypeID("channel"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); break;
}
}
else { alert("Unsupported color mode", "Error", true); return null; }
}
var ret;
try { ret = executeActionGet(r).getList(stringIDToTypeID("histogram")); } catch (e) { alert(e); return null; }
var hist = new Array();
for (var i = 0; i < 256; i++) hist.push(ret.getInteger(i));
return hist;
}
catch (e) { alert(e); return null; }
}