真的对java像素操作感到困惑

  • 本文关键字:操作 java 像素 真的 java
  • 更新时间 :
  • 英文 :


这部分我对这 3 个十六进制在做什么(例如 00ff0000)以及为什么它们被位移 16 或 8 位感到困惑

 // Getting pixel color by position x=100 and y=40 
    int clr=  image.getRGB(100,40); 
    int  red   = (clr & 0x00ff0000) >> 16;
    int  green = (clr & 0x0000ff00) >> 8;
    int  blue  =  clr & 0x000000ff;

像素的颜色信息以单个 32 位整数编码。最低的8位存储蓝色信息,第8至15位存储绿色,16至23位存储红色。位 24 到 31 存储 alpha 值。首先显示的代码通过使用 and 操作屏蔽正确的位来选择正确的位。为了对它们进行计算,它们被移动以表示它们的实际值。

clr & 0x0000ff00

选择位置 8 到 15 处的位,

(clr & 0x0000ff00) >> 8

将结果向右移动 8 个位置。

in

int  red   = (clr & 0x00ff0000) >> 16;

&将清零除所需位之外的所有位:

0x00123456 & 0x00ff0000 == 0x00120000

移会将这些位放置在所需位置:

0x00120000 >> 16 == 0x00000012 == 0x12

其他两个通道也是如此。

0x00123456 & 0x0000ff00 == 0x00003400
0x00003400 >> 16 == 0x34
0x00123456 & 0x000000ff == 0x56

原因是 ARGB 格式将四个字节(字母、红色、绿色、蓝色)塞进一个 int: 0xAaRrGgBb .RGB 格式类似,只是不使用 alpha(不透明度)通道。位移背后的重点是分隔这些字节:clr == 0x123456red == 0x12 green == 0x34 blue == 0x56

请注意,每个

字节(8 位)在十六进制表示法中由两个十六进制数字(每个 4 位)表示,因此移位 16 位会移位 4*4 位 = 4 个十六进制数字 = 2 个字节。

最新更新