图像像素坐标

时间:2016-10-25 20:56:27

标签: php imagemagick

我正在使用PHP和ImageMagick从图像边缘读取颜色。

$x = 1;
$y = 1;
$pixel = $image->getImagePixelColor($x, $y);
$colors = $pixel->getColor(); // rgba

但我不太了解坐标是如何工作的。所以我创建了这个4px png。

enter image description here

1,1代替透明像素rgba(0,30,255,0)。另外,如果我选择大范围的像素怎么办?

2 个答案:

答案 0 :(得分:2)

理解这一点的最简单方法是记住,当像素是透明的时,它的颜色变得无关紧要, 保留

所以,如果我们制作一个不透明的512x512随机噪声图像,就像这样:

convert -size 512x512 xc:gray +noise random a.png

enter image description here

并检查它的大小,你可以看到它是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

enter image description here

但是,如果我再次使像素透明,并将它们全部设置为图像背景的颜色(因为它们的颜色不相关),如下所示:

 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

enter image description here

像这样抛弃它:

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)坐标)。 enter image description here

示例:

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]....)

的坐标