public void printPixelARGB(int pixel){
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
System.out.println("ARGB : " + alpha + ", " + red + ", " + green + ", " + blue);
}
我发现Java语法显示图像每个像素的RGB值,但我对这种方法有点困惑。你可以通过解释这种方法来帮助我吗?
0xff
?那是什么?另外,(pixel>>24) & 0xff
是什么意思?提前谢谢。
答案 0 :(得分:9)
pixel是一个int
int中有4个字节,每个字节有8位
作为例子
0xA3 0x41 0x28 0x76
是一个示例像素(1个int,其中包含4个字节,32位)
现在打包在此像素中的是有关透明度的信息(A)红色,绿色和蓝色组件。
透明度是第一个字节(0xA3) 然后是红色(0x41) 绿色(0x28) 然后是蓝色(0x76)
所以为了得到红色部分,你向右移16位,这就是
0x00 0x00 0xA3 0x41
现在红色是最正确的位置,但是那里有透明度字节,这不好,所以你必须删除它
做& 0xFF,真的是
0xA341&设为$ 00FF
表示你和每个位,所以A3的位用00给出0,41的位用FF表示,因为FF全为1,给你原始值,即41
所以红色是
0x00 0x00 0x00 0x41
所以这段代码就是从一个整数中抽出每个组件。
答案 1 :(得分:4)
0xff
是hexadecimal(另一个基于16而不是10的计数系统),它表示255. >>
和&
是按位右移和按位AND ,分别(参见wikipedia article)。
颜色通常以十六进制处理,因为RGB值以0到255(例如0x00到0xff)的值表示,如HTML颜色代码中所示(例如#FFFFFF)。
答案 2 :(得分:0)
存储像素的程序使用int
作为基本类型的一些优化。
我怀疑,在程序的某个地方有一个类似的定义:
int screen[1024][726];
从面向对象的角度来看,这是完全异端,但有时性能确实很重要。
以下是像素将如何表示为完整的Java对象:
class Pixel
{
byte alpha;
byte red;
byte green;
byte blue;
}
但没有任何东西是免费的,并且需要在每个屏幕上更新许多对象刷新确实加起来。这就是为什么它们被存储为非常快int
的原因,当你需要访问内容时,你需要跳过一些操作箍。
>>
和& 0xff
在这里很方便,因为它们允许在某些预定义位置访问特定位并将它们转换为表示颜色强度的值。
正如您所看到的,如果您处理过Pixel对象,那么工作会更容易。