// Recolor engine v2.0
// Original idea and Scripting by Stanislav Hoffman(SPB) - S.N. - April 2017
var doc = app.activeDocument;
var mSel = doc.selection;
var c, m, y; // Два набора значений CMY, первый это лучший найденный на текущий момент
var tc, tm, ty; // второй будет проверяться на лучшее приближение delta E
function convertColor(src, dest, clrArr)
{
return app.convertSampleColor(ImageColorSpace[src], clrArr, ImageColorSpace[dest], ColorConvertPurpose.defaultpurpose);
}
function AddV(n,a){
r=Math.round(n+a);
if (r>100) {r=100}
if (r<0) {r=0}
return r;
}
function deltaE(lab,labs){
DE76=Math.sqrt(
Math.pow(labs[0]-lab[0],2)+
Math.pow(labs[1]-lab[1],2)+
Math.pow(labs[2]-lab[2],2));
return DE76;
};
function CalcNewCMY(z){
tc = c;
tm = m;
ty = y;
if (z==0){tc=AddV(c,1)}
if (z==1){tc=AddV(c,-1)}
if (z==2){tm=AddV(m,1)}
if (z==3){tm=AddV(m,-1)}
if (z==4){ty=AddV(y,1)}
if (z==5){ty=AddV(y,-1)}
}
for (i=0; i < mSel.length; i++)
{
if (mSel.filled == true){
var color = mSel.fillColor;
var labs = convertColor("CMYK", "LAB", [color.cyan,color.magenta,color.yellow,color.black]);
color.black = 0;
c = color.cyan;
m = color.magenta;
y = color.yellow;
var goo = true;
var DD, lab;
var maxDD = 10000000000;
while (goo){
goo = false;
for (z=0; z<6; z++){
CalcNewCMY(z);
lab = convertColor("CMYK", "LAB", [tc, tm, ty, 0]);
DD = deltaE(lab, labs);
if (maxDD>DD){maxDD = DD; goo = true; c = tc; m = tm; y = ty}
}
}
color.cyan = c;
color.magenta = m;
color.yellow = y;
}
}