我想编写一些PS Javascript代码来获取像素的ARGB颜色值。一个看起来像的函数:
function getPixelARGB(doc, x, y);
我搜索了一段时间,并在此网站Mike Hale
找到了Mike Hale
的方法:a link
{{1}}提出的答案很好,唯一的问题是它无法获得所选像素的 alpha值(不透明度),这就是我想要的知道。
有人知道如何通过PS脚本获取所选像素的ARGB值吗?提前致谢。
答案 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
渐变图像开始。请注意,当我运行颜色滴管工具时,您会看到颜色信息窗口中的灰度值随着我使用鼠标上下移动而改变,这些反映了原始透明度。
答案 2 :(得分:0)
在考虑这个问题时,我不妨选择第三种方法......: - )
如果您创建一个红色到透明的渐变图像,请执行以下操作:
然后将其加载到Photoshop中并选择Color Sampler
tol并移动它,您将在Info
窗口中看到,无论您移动采样器,Photoshop都会将其报告为纯红色 - 基本上忽略了透明度。
现在,创建一个新图层并用黑色填充,然后在Layers
窗口中,将新黑色图层拖到透明图层下方 - 将混合模式保留为normal
和{{1 }和opacity
为100%。它看起来像这样:
现在移动颜色采样器,您会看到fill
RGB值与不透明度成反比 - 现在好消息 - 您可以使用Extendscript获得红色通道!因此,该技术将获得红色像素的RGB值,然后将该层放在后面并再次获得红色像素的值,并且两者之间的差异与不透明度成比例。
我猜如果你用白色而不是黑色填充,红色通道将与不透明度成正比。