首页 > 解决方案 > 移位和按位和运算符在查找像素颜色中的意义/功能是什么?

问题描述

在试图弄清楚如何获取特定像素的颜色时,我遇到了以下代码:

fn findRed(pointer: UInt32) (UInt8) {
    return UInt8((pixelData >> 16) & 255)
}

fn findGreen(pointer: UInt32) (UInt8) {
    return UInt8((pixelData >> 8) & 255)
}

fn findBlue(pointer: UInt32) (UInt8) {
    return UInt8((pixelData >> 0) & 255)
}

我知道在 RGB 世界中,RGB 中的每种颜色都是在 0 到 255 的范围内测量的,但是这里的位和运算符(& 255)对此做了什么?

更进一步,在这种情况下,移位是做什么的?为什么它会移动 8 的倍数?需要明确的是,这是处理 8 位彩色图像,但我似乎无法弄清楚它是如何完成“查找”的

标签: cpointerscolorspixel

解决方案


使用 8 位,您可以覆盖 [0..255] 的范围。

十进制:255
十六进制:0xFF(或只是 FF)
二进制:11 11 11 11

封装在 UInt32 中的像素 (RGB) 如下所示:0x00RRGGBB

如果要提取单个组件,则必须移动位并将其屏蔽掉。

面具

0x000000FF (binary: 00000000 00000000 00000000 11111111)

蓝色

0x00RRGGBB & Mask => 0x000000BB

绿色:我们必须向右移动 8 位(1 个字节)

(0x00RRGGBB >> 8) & Mask => 0x0000RRGG & Mask => 0x000000GG

红色:我们必须向右移动 16 位(2 个字节)

(0x00RRGGBB >> 16) & Mask => 0x000000RR & Mask => 0x000000RR 

关于按位运算符的 wiki 页面可能很有趣:按位运算 - AND


推荐阅读