2014-11-04 5 views
0

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

function getPixelARGB(doc, x, y); 

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

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

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

+0

Кажется, что вам нужно настроить Adobe Bridge для этого ... https://forums.adobe.com/message/5075865#5075865 –

ответ

0

Я могу коротко рассказать вам, как это сделать, но у меня нет времени писать код в эту минуту - может быть, в ближайшие пару дней, если вам повезет. Итак, надеюсь, ваши навыки 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 

Большинство ExtendScript для выше, довольно просто, только два более твердые биты устанавливают прозрачные пиксели в locked, которые вы делаете, как это:

docLay[l].transparentPixelsLocked = true; 

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

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

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

enter image description here

+0

И для вашего следующего трюка сделайте это для CS2! (где colorSamplers.add() не работает) –

+0

Держись, у меня есть еще более хакерский план! Скоро... –

1

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

Основная идея заключается в том, чтобы заставить ImageMagick делать это от имени Photoshop - и это, вероятно, быстрее, чем любой доступ к отдельным пикселям в ExtendScript Photoshop в любом случае. Таким образом, команда 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); 
0

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

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

enter image description here

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

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

enter image description here

Теперь переместите Color Sampler вокруг, и вы увидите Red значение RGB прямо обратно пропорциональна непрозрачности - и теперь хорошая новость - вы можете получить красный канал с ExtendScript! Таким образом, метод должен был бы получить значение RGB красного пикселя, затем поместить слой позади и снова получить значение красного пикселя, а разница между ними пропорциональна непрозрачности.

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

Смежные вопросы