將 8 位灰度圖 (0-255) 縮減至 16 級 (0-15),調色板從 256 色縮為 16 色,RGB 數值範圍改為 0.0-1.0。處理後圖片**出現彩色噪點,不再是純灰度**。
灰度圖核心特徵:**R = G = B**。你的代碼:
double gray = i * 0.0667; // 0.0 ~ 1.0
(map + i)->rgbBlue = gray;
(map + i)->rgbRed = gray;
(map + i)->rgbGreen = gray; // 三通道賦相同值 → 正確
**但結構體定義用 `double` 儲存 RGB**,而 BMP 標準調色板 `RGBQUAD` 每通道 **1 字節 (0-255, `BYTE`)**。寫入檔案時若直接寫 `double` (8 字節) 會導致:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
BYTE gray = (BYTE)(i * 255.0 / 15.0); // 0, 17, 34, ... 255
(map + i)->rgbBlue = gray;
(map + i)->rgbGreen = gray;
(map + i)->rgbRed = gray;
(map + i)->rgbReserved = 0;
// 讀取原像素 0-255
BYTE orig = src->imageData[...];
// 量化為 0-15
BYTE quantized = orig >> 4; // 等價 /16
// **擴展回 0-255 存入目標**
dst->imageData[...] = quantized * 17; // 0, 17, 34... 255
灰度圖處理變彩色 = **調色板結構體型別錯誤 (`double` vs `BYTE`)** 導致寫入/讀取不匹配,或 **量化後未擴展回 0-255**。修正結構體、保持 R=G=B、像素值擴展回標準範圍,圖片即恢復純灰度。