PHP imagecolorat()函数可用于获取图像像素的RGB值,如文档中所示:
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
Run Code Online (Sandbox Code Playgroud)
我根本不了解最后三行; 我知道他们返回正确的值,但我无法弄清楚>>
和&
运算符如何协同工作.有人可以解释一下吗?
作为参考,当$rgb = 9750526
RGB值变为时(148,199,254)
.
感谢您的回复.
Mat*_*ndh 11
&和>>是两个不同的按位运算符(PHP中的位运算符).它们使用值的位表示,这为我们提供了一些有用(和快速!)的可能性.
>>是正确的转变.如果右移一个值,则表示将所有位移到表示中的右侧.如果你有"11100"并右移它两个位置,你就会留下"111"(右端移开的位消失).>>右侧的数字表示要移位的位数.
&是按位和.如果你有两个值表示为111000和101011,并决定按位和它们,你将得到101000(两个值中相同位设置的位将为1,否则为0).
我们现在拥有了解上述代码所需的内容.$ rgb包含一个整数值(该值不是很有趣,但位模式是),它代表24位(RGBA为32位,但我们在此忽略它).该值由红色8位,绿色8位和蓝色8位组成.然而,我们对这24位代表的数字不感兴趣,但是R,G和B分别是什么.
我们的值代表颜色的以下位:
rrrrrrrr gggggggg bbbbbbbb
Run Code Online (Sandbox Code Playgroud)
如果我们用>> 16移动这个位掩码,我们将得到:
rrrrrrrr
Run Code Online (Sandbox Code Playgroud)
这就是>> 16的作用,只留下代表红色的位.由于我们现在已经将位一直向下移动,因此该值表示[0,255]中的数字.然后我们添加&255(这里用十六进制表示法写成0xFF)来删除我们感兴趣的8位之上的任何杂散位.当我们看看如何获得G值时,我们将了解现在如何发生这种情况. :
我们的价值仍然勇敢地代表了不同的颜色:
rrrrrrrr gggggggg bbbbbbbb
Run Code Online (Sandbox Code Playgroud)
如果我们用>> 8将这个位掩码移位8位,我们将得到:
rrrrrrrr gggggggg
Run Code Online (Sandbox Code Playgroud)
可是等等!这不仅是代表g的位,还有代表r的位!这不是我们追求的价值(因为我们只想要g).我们在上一个例子中很幸运,因为我们没有任何位设置在r之上,但这次我们真的为我们完成了工作.但我们知道&,现在是时候看到它的实际情况了.
我们现在有:
rrrrrrrr gggggggg
Run Code Online (Sandbox Code Playgroud)
然后我们应用&255(代码中为0xFF),它在位值中表示为:
00000000 11111111
Run Code Online (Sandbox Code Playgroud)
由于&仅保留在两个操作数中设置的位,我们最终只得到g值:
gggggggg
Run Code Online (Sandbox Code Playgroud)
在移位值中表示红色的位现在为0,并且我们只留下表示原始颜色的绿色的位.由于它们已经移动到代表[0,255]的相同8位,我们再次得到了我们的价值.
最后一个值更容易,因为它已经位于我们想要的位置:在代表[0,255]的位中.我们可以在这里进行&操作,然后走出另一边:
rrrrrrrr gggggggg bbbbbbbb &
00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)
最终得到:
bbbbbbbb
Run Code Online (Sandbox Code Playgroud)
而且我们也有蓝色价值.
希望能解释一下!