• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

PHP是怎么运算的?:$r = ($rgb >> 16) & 0xFF; - SegmentFault 思否

Data: 2017-09-17 06:29:54Form: JournalClick: 9

PHP是怎么运算的?:$r = ($rgb >> 16) & 0xFF;

 

int imagecolorat ( resource $image , int $x , int $y )
返回 image 所指定的图形中指定位置像素的颜色索引值。

如果 PHP 编译时加上了 GD 库 2.0 或更高的版本并且图像是真彩色图像,则本函数以整数返回该点的 RGB 值。用移位加掩码来取得红,绿,蓝各自成分的值:

Example #1 取得各自的 RGB 值

<?php
$im = ImageCreateFromPng("rockym.png");
$rgb = ImageColorAt($im, 100, 100);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
?>
回答:

$rgb十六进制假设为 0xAB3456 直接可以得到$r为0xAB $g为0x34 $b为0x56

但是php是这样的

($rgb >> 16) & 0xFF
先右移16位 得到 0xAB & 0xFF
按位与0xFF进行与操作 得到最低的16位 十六进制即 0xAB
这个就是$r

($rgb >> 8) & 0xFF
先右移8位 得到 0xAB34 & 0xFF
按位与0xFF进行与操作 得到最低的16位 十六进制即 0x34
这个就是$g

$rgb & 0xFF
直接得到最低16位 十六进制即0x56
这是$b

评论
BohrTang
 

@前端记录 请问一下,获取某一个点的rgb值,为什么还需要做位运算呢?
'''
//循环色值

$rColorNum=$gColorNum=$bColorNum=$total=0;
for ($x=0;$x<imagesx($i);$x++) {
    for ($y=0;$y<imagesy($i);$y++) {
        $rgb = imagecolorat($i,$x,$y);
        //三通道
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;
        $rColorNum += $r;
        $gColorNum += $g;
        $bColorNum += $b;
        $total++;
    }
}
$rgb = array();
$rgb['r'] = round($rColorNum/$total);
$rgb['g'] = round($gColorNum/$total);
$rgb['b'] = round($bColorNum/$total);
Name:
<提交>