#javascript #adobe #photoshop
Вопрос:
Пожалуйста, помогите в решении следующей проблемы:
Мне нужно подобрать цвет из выбранной области произвольной формы, вероятно, довольно маленькой по отношению к изображению и не имеющей заранее известного положения на холсте, с помощью пипетки. Это должно быть сделано автоматически, без щелчков вручную.
С моими навыками я смог написать сценарий, который берет образец из центра текущего документа, что не решает проблему, но дает направление.
// Set reference for active document
var srcDoc = app.activeDocument;
// remove any sample first
srcDoc.colorSamplers.removeAll();
// get width and height of image
var w = srcDoc.width.value;
var h = srcDoc.height.value;
// get positions of the center of the image
//var x = 0;
//var y = 0;
var x = Math.round(w/2);
var y = Math.round(h/2);
// will pick a sample from the middle of the image
var px = [UnitValue(x) , UnitValue(y)];
var Sampler = srcDoc.colorSamplers.add(px);
// Copy RGB Values of current layer with 3 decimal spaces
var myColor = Sampler.color;
var rgb_R = Math.round(myColor.rgb.red*1000)/1000;
var rgb_G = Math.round(myColor.rgb.green*1000)/1000;
var rgb_B = Math.round(myColor.rgb.blue*1000)/1000;
set(rgb_R, rgb_G, rgb_B, "photoshopPicker");
function set(red, Grn, blue, source) {
var c2t = function (s) {
return app.charIDToTypeID(s);
};
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var descriptor2 = new ActionDescriptor();
var reference = new ActionReference();
reference.putProperty( s2t( "color" ), s2t( "foregroundColor" ));
descriptor.putReference( c2t( "null" ), reference );
descriptor2.putDouble( s2t( "red" ), red );
descriptor2.putDouble( c2t( "Grn " ), Grn );
descriptor2.putDouble( s2t( "blue" ), blue );
descriptor.putObject( s2t( "to" ), s2t( "RGBColor" ), descriptor2 );
descriptor.putString( s2t( "source" ), source );
executeAction( s2t( "set" ), descriptor, DialogModes.NO );
}
Я не нашел способов сделать это в самой PS без участия человека, и у меня нет опыта написания сценариев, но сценарии, похоже, являются правильным решением проблемы. Было бы здорово иметь готовый сценарий для такой операции.
Спасибо.
Комментарии:
1. Я думаю, что для этого требуется больше усилий. Как сценарий узнает, откуда вы хотите выбрать цвет?
2. Да. В документе будет подготовлена выделенная область. Именно из нее нужно забрать цвет. Скажем, есть условная область площадью 50px. Она будет иметь один цвет. Его нужно забрать. Но эта область может иметь случайную форму. Т.е. не обязательно это будет квадрат. А так же может иметь случайные координаты.
3. Поскольку в выделении есть только ограничительные рамки, вам сначала нужно преобразовать выделенный фрагмент в путь, а затем использовать любой алгоритм для поиска точки внутри полученного многоугольника (например observablehq.com/@scarysize/finding-random-points-in-a-polygon )
4. Вы можете получить цвет пикселя x,y с помощью
var pointSample = app.activeDocument.colorSamplers.add([(x),(y)]);