通过Photoshop Javascript获取像素ARGB颜色

时间:2014-11-04 03:49:19

标签: javascript photoshop photoshop-script

我想编写一些PS Javascript代码来获取像素的ARGB颜色值。一个看起来像的函数:

function getPixelARGB(doc, x, y);

我搜索了一段时间,并在此网站Mike Hale找到了Mike Hale的方法:a link

{{1}}提出的答案很好,唯一的问题是它无法获得所选像素的 alpha值(不透明度),这就是我想要的知道。

有人知道如何通过PS脚本获取所选像素的ARGB值吗?提前致谢。

3 个答案:

答案 0 :(得分:1)

好的,如果你想支持Photoshop CS2,我会有一些可行的方法,但至少可以说是hacky

基本的想法是让ImageMagick代表Photoshop完成它 - 这可能比在Photoshop的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);

答案 1 :(得分:0)

我可以简单地告诉你如何做到这一点,但我没有时间在这一刻编写代码 - 如果你幸运的话可能会在接下来的几天内编写代码。所以,希望你的Extendscript技能是合理的......: - )

问题在于颜色采样器不会传回透明度,只传回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

答案 2 :(得分:0)

在考虑这个问题时,我不妨选择第三种方法......: - )

如果您创建一个红色到透明的渐变图像,请执行以下操作:

enter image description here

然后将其加载到Photoshop中并选择Color Sampler tol并移动它,您将在Info窗口中看到,无论您移动采样器,Photoshop都会将其报告为纯红色 - 基本上忽略了透明度。

现在,创建一个新图层并用黑色填充,然后在Layers窗口中,将新黑色图层拖到透明图层下方 - 将混合模式保留为normal和{{1 }和opacity为100%。它看起来像这样:

enter image description here

现在移动颜色采样器,您会看到fill RGB值与不透明度成反比 - 现在好消息 - 您可以使用Extendscript获得红色通道!因此,该技术将获得红色像素的RGB值,然后将该层放在后面并再次获得红色像素的值,并且两者之间的差异与不透明度成比例。

我猜如果你用白色而不是黑色填充,红色通道将与不透明度成正比。