一、前言:从'显示图片'到'理解像素'
在日常开发中,我们通常使用 JLabel 或 HTML 的标签来显示图片。这种方式是'黑盒'的,我们只需要告诉计算机'显示这张图',而不需要知道图里具体是什么。 但在图像处理(如 Photoshop、美颜相机)中,我们需要打开这个'黑盒',直接操作像素(Pixel)。每一个像素本质上就是一个数字,而这个数字的结构,正是计算机科学的基础——二进制。
二、项目实战:Java 实现图像处理
本项目包含两个核心类:PixelUI(界面)和 PixelListener(逻辑)。我们将重点分析 PixelListener 中的算法实现。
核心逻辑:读取像素
在 PixelListener 的 getImagePixel 方法中,我们通过 BufferedImage.getRGB(x, y) 获取了一个 int 类型的值。 关键点:为什么一个 int(32 位整数)能代表一个像素的颜色? 这就是我们要讲的第一个计算机基础概念。
三、计算机基础详解:字节、位与颜色存储
1.什么是字节 (Byte) 和位 (Bit)?
- 位 (Bit): 计算机储存的最小单位,只有 0 和 1 两种状态。
- 字节 (Byte): 1Byte=8Bits.
- 整数 (int): 在 Java 中,int 占 4 个字节,即 32 位 (32bits)。
2.ARGB 模型与内存布局
- A (Alpha):透明度,8 位
- R (Red):红色,8 位
- G (Green):绿色,8 位
- B (Blue):蓝色,8 位 内存中的排列: 一个 int 类型的像素值在内存中是这样排列的(共 32 位):
| A (8 位) | R (8 位) | G (8 位) | B (8 位) |
|---|---|---|---|
11111111 | 11111111 | 11111111 | 11111111 |
例如,一个纯红色的像素(不透明),其二进制表示为: 11111111 00000000 00000000
3.位运算 (Bitwise Operation):提取颜色的'手术刀'
如果我们想从这个 32 位的整数中单独取出红色 (R) 的值,该怎么办?直接除以 256 的倍数?太慢了。计算机科学家发明了位运算,这是 CPU 最擅长的操作。 这就是代码中这两行的含义:
int red = pixel >> 16 & 0xFF;
int green = pixel >> 8 & 0xFF;
int blue = pixel & ;

