pix[i] = 255 << 24 | gray << 16 | gray << 8 | gray;
Java int 32 位元表示 ARGB 像素:
| 位元範圍 | 佔位 | 說明 |
|---|---|---|
| 31-24 | AAAA AAAA | Alpha (透明度),255 = 不透明 |
| 23-16 | RRRR RRRR | Red |
| 15-8 | GGGG GGGG | Green |
| 7-0 | BBBB BBBB | Blue |
gray = (r + g + b) / 3 → 灰度值 0~255。255 << 24 → 0xFF000000 (Alpha 滿)。gray << 16 → 灰度值置於 Red 位置。gray << 8 → 灰度值置於 Green 位置。gray → 灰度值置於 Blue 位置。| (按位或) 合併四部分 → 完整 ARGB 像素,R=G=B=gray,呈現灰階。public int[] toGray(int[] pix, int w, int h) {
for (int i = 0; i < w * h; i++) {
int r = (pix[i] >> 16) & 0xFF;
int g = (pix[i] >> 8) & 0xFF;
int b = pix[i] & 0xFF;
int gray = (r + g + b) / 3; // 或 0.299*r + 0.587*g + 0.114*b
pix[i] = 0xFF000000 | (gray << 16) | (gray << 8) | gray;
}
return pix;
}
int gray = (int)(0.299 * r + 0.587 * g + 0.114 * b);
更符合人眼亮度感知,常用於影像處理標準。
BufferedImage.TYPE_BYTE_GRAY 直接建立灰度圖,避免手動像素運算。