Получить цвет пикселей ARGB с помощью Photoshop Javascript

Я хочу написать код PS Javascript, чтобы получить значение цвета ARGB пикселя. Функция, которая будет выглядеть так:

function getPixelARGB(doc, x, y);

Я некоторое время искал и нашел метод Mike Hale на этом сайте: ссылка

Ответ, предложенный Mike Hale, отлично работает, единственная проблема заключается в том, что он не может получить альфа-значение (непрозрачность) выбранного пикселя, что я и хочу знать.

Кто-нибудь знает, как получить значение ARGB выбранного пикселя с помощью сценария PS? Заранее спасибо.


person Vigor    schedule 04.11.2014    source источник
comment
Похоже, для этого вам следует ориентироваться на Adobe Bridge... #5075865   -  person Mark Setchell    schedule 04.11.2014


Ответы (3)


Хорошо, если вы хотите поддерживать Photoshop CS2, у меня есть кое-что, что будет работать, но, мягко говоря, hacky.

Основная идея состоит в том, чтобы заставить ImageMagick делать это от имени Photoshop — и это, вероятно, быстрее, чем любой доступ к отдельным пикселям в Photoshop's ExtendScript. Итак, команда ImageMagick для просмотра пикселей в текстовом/удобочитаемом виде такова:

convert out.png txt:

# ImageMagick pixel enumeration: 256,256,255,srgba
0,1: (255,0,0,0.996078)  #FF0000FE  srgba(255,0,0,0.996078)
1,1: (255,0,0,0.996078)  #FF0000FE  srgba(255,0,0,0.996078)
2,1: (255,0,0,0.996078)  #FF0000FE  srgba(255,0,0,0.996078)
3,1: (255,0,0,0.996078)  #FF0000FE  srgba(255,0,0,0.996078)

Вы можете видеть, что прозрачность для этой строки равна FE или 0,996078.

Итак, если вам нужен 1 пиксель, скажем, 128 128, вы должны сделать это:

convert out.png -crop 1x1+128+128 -depth 8 txt:
# ImageMagick pixel enumeration: 1,1,255,srgba
0,0: (255,0,0,0.498039)  #FF00007F  srgba(255,0,0,0.498039)

и имеет непрозрачность 7F или 0,498039.

Итак, чтобы понять, что вы хотите сделать, ваша предполагаемая функция getPixelARGB(doc, x, y) должна будет выполнить следующие шаги:

1. duplicate document `doc`
2. save duplicate as `PNG` (to preserve transparency) on somewhere like `/tmp`
3. invoke ImageMagick - see below
4. read result - see below

Итак, как вы вызываете ImageMagick и читаете его вывод? Вы можете использовать это:

app.system("convert /tmp/tmp.png -crop 1x1+128+128 -depth 8 txt: > /tmp/result.txt")
var w = new File("/tmp/result.txt");
w.open('r');
var str = "";
while(!w.eof)
   str += w.readln();
w.close();   
alert(str);
person Mark Setchell    schedule 05.11.2014

Я могу вкратце рассказать, как это сделать, но у меня нет времени писать код сию же минуту — может быть, в ближайшие пару дней, если повезет. Так что, надеюсь, ваши навыки работы с Extendscript разумны.... :-)

Проблема в том, что Color Sampler не возвращает прозрачность, а только значения RGB. Таким образом, метод будет заключаться в принудительном включении прозрачности в значения RGB, чтобы вы могли их использовать. Вот шаги:

 Duplicate the document - because we are going to be a bit destructive
 Select all & copy merged (Cmd-A,Shift+Cmd+C) 
 Flatten (Layer->Flatten Image)
 Fill with black (Edit->Fill->Black)
 Paste (the layer we copy merged)
 Lock transparent pixels on pasted layer (top of layers palette - first checkerboard icon on left)
 Fill with white (Edit->Fill->White)
 Add a color sampler at the pixel position you want
 Read sampler's red value (or green, or blue - they are all the same) and that is the transparency

Большая часть расширенного сценария для вышеизложенного довольно проста, единственные два более сложных бита — установка прозрачных пикселей на locked, что вы делаете следующим образом:

docLay[l].transparentPixelsLocked = true;

и сэмплеры - где вам может быть полезно очистить все существующие сэмплеры (поскольку разрешено только максимум 4)

var sampler = doc.colorSamplers.add([64, 64]);

Я сделал небольшой анимированный GIF здесь, который показывает вам процесс. Я начинаю с градиентного изображения red->transparent. Обратите внимание, что в конце, когда у меня запущен инструмент «Пипетка», вы увидите, как значения оттенков серого в окне «Информация о цвете» изменяются, когда я перемещаю изображение вверх и вниз с помощью мыши, они отражают исходную прозрачность.

введите здесь описание изображения

person Mark Setchell    schedule 05.11.2014
comment
И для вашего следующего трюка сделайте это для CS2! (где colorSamplers.add() не работает) - person Ghoul Fool; 05.11.2014

Я мог бы также пойти на третий метод, пока я думаю об этом... :-)

Если вы создаете градиентное изображение от сплошного красного до прозрачного, например:

введите здесь описание изображения

затем загрузите его в Photoshop, выберите инструмент Color Sampler и переместите его, вы увидите в окне Info, что Photoshop сообщает о нем как о чистом красном, куда бы вы ни перемещали сэмплер - в основном игнорируя прозрачность.

Теперь создайте новый слой и залейте его черным, а затем в окне Layers перетащите новый черный слой под прозрачный - оставьте режим наложения normal, opacity и fill на 100%. Это будет выглядеть так:

введите здесь описание изображения

Теперь переместите Color Sampler, и вы увидите, что значение Red RGB прямо обратно пропорционально непрозрачности — а теперь ХОРОШАЯ НОВОСТЬ — вы можете получить красный канал с помощью Extendscript! Таким образом, метод будет заключаться в том, чтобы получить значение RGB красного пикселя, затем поместить слой позади и снова получить значение красного пикселя, а разница между ними пропорциональна непрозрачности.

Я думаю, если бы вы заполнили белым цветом вместо черного, красный канал был бы прямо пропорционален непрозрачности.

person Mark Setchell    schedule 05.11.2014