我正在使用PHP和ImageMagick从图像边缘读取颜色。
$x = 1;
$y = 1;
$pixel = $image->getImagePixelColor($x, $y);
$colors = $pixel->getColor(); // rgba
但我不太了解坐标是如何工作的。所以我创建了这个4px png。
1,1
代替透明像素rgba(0,30,255,0)
。另外,如果我选择大范围的像素怎么办?
答案 0 :(得分:2)
理解这一点的最简单方法是记住,当像素是透明的时,它的颜色变得无关紧要, 保留。
所以,如果我们制作一个不透明的512x512随机噪声图像,就像这样:
convert -size 512x512 xc:gray +noise random a.png
并检查它的大小,你可以看到它是1.5MB:
-rw-r--r--@ 1 mark staff 1.5M 26 Oct 09:14 a.png
如果我现在制作一个完全相同的透明版本:
convert -size 512x512 xc:gray +noise random -alpha transparent b.png
你可以看到文件变大了(1.7MB),因为它现在存储透明度和原始随机数据。我不会显示图像,因为没有什么可看的:
-rw-r--r--@ 1 mark staff 1.7M 26 Oct 09:16 b.png
我现在可以使透明层完全不透明,随机像素再次变得可见 - 所以它们一直都在那里 - 即使图像是透明的:
convert b.png -alpha opaque c.png
但是,如果我再次使像素透明,并将它们全部设置为图像背景的颜色(因为它们的颜色不相关),如下所示:
convert -size 512x512 xc:gray +noise random -alpha transparent -alpha background d.png
-rw-r--r--@ 1 mark staff 1.8K 26 Oct 09:22 d.png
现在突然1.5MB的文件在1.8K下小了近1000倍,因为它的压缩效果要好得多,因为所有(不可见/透明)颜色都是单一的纯色背景。
回答有关坐标的问题。我们可以制作一个这样的小图像:
convert -size 1x1 \
xc:red xc:cyan +append \
\( xc:yellow xc:magenta +append \) -append a.png
像这样抛弃它:
convert a.png txt:
# ImageMagick pixel enumeration: 2,2,65535,srgb
0,0: (65535,0,0) #FF0000 red
1,0: (0,65535,65535) #00FFFF cyan
0,1: (65535,65535,0) #FFFF00 yellow
1,1: (65535,0,65535) #FF00FF magenta
看到ImageMagick中的像素坐标从左上角开始。
答案 1 :(得分:1)
屏幕/图像上像素的坐标系:
任何像素系统都从屏幕/图像的最左下角开始,称为原点。像素的映射从第0个索引开始。 (即图中的绿点将具有(0,0)坐标)。
示例:
Green pixel => (0,0)
Transparent => (1,0)
Blue => (1,1)
Red => (0,1)
您不会选择一次选择每个像素的大量像素,然后增加坐标以选择另一个
即
如果你想得到大量像素的颜色,你会得到一个像素分析它的颜色,然后选择另一个像素。为避免反复提供坐标,您可以存储想要选择的像素坐标,或者编写一个循环来选择特定区域。
示例:
如果你想获得所有4个像素的颜色,写一个从(0,0)到(1,1)的坐标的循环自动增量值,获得所选像素的颜色,提供下一个像素的坐标并获得颜色(重复直到你想要)
OR
声明一个数组,该数组将保存所需像素array => ([0]=> [0,0] [1]=> [0,1]....)