图像亮度调节
亮度调节的原理是:
对 每个像素的 R、G、B 分量 加上 brightness 值,并确保结果在 0 - 255 之间。
#include <windows.h>
HANDLE WINAPI BIPImgLight(HANDLE hDib, long brightness) {
if (!hDib) return NULL;
// 锁定 DIB 句柄,获取 BITMAPINFOHEADER
BITMAPINFOHEADER* pBIH = (BITMAPINFOHEADER*)GlobalLock(hDib);
if (!pBIH) return NULL;
int width = pBIH->biWidth;
int height = abs(pBIH->biHeight);
int bitCount = pBIH->biBitCount;
int bytesPerPixel = bitCount / 8; // 每像素字节数(一般 3 或 4)
int rowSize = ((width * bitCount + 31) / 32) * 4;
int imageSize = rowSize * height;
// 创建新的 DIB 内存
HANDLE hNewDib = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + imageSize);
if (!hNewDib) {
GlobalUnlock(hDib);
return NULL;
}
// 锁定新 DIB,获取 BITMAPINFOHEADER
BITMAPINFOHEADER* pNewBIH = (BITMAPINFOHEADER*)GlobalLock(hNewDib);
if (!pNewBIH) {
GlobalFree(hNewDib);
GlobalUnlock(hDib);
return NULL;
}
// 复制头部信息
*pNewBIH = *pBIH;
BYTE* pSrcData = (BYTE*)(pBIH + 1);
BYTE* pDstData = (BYTE*)(pNewBIH + 1);
// 亮度调整,每个通道加上 brightness
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int pixelOffset = y * rowSize + x * bytesPerPixel;
for (int c = 0; c < bytesPerPixel; c++) {
int newValue = pSrcData[pixelOffset + c] + brightness;
pDstData[pixelOffset + c] = (BYTE)min(255, max(0, newValue)); // 限制 0 - 255
}
}
}
// 解锁 DIB
GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
return hNewDib;
}
📌 关键点
✅ 遍历所有像素,调整 RGB 分量的亮度
✅ 防止溢出 (min(255, max(0, newValue)))
✅ 适用于 24-bit / 32-bit DIB
✅ 创建新 DIB,保证原始数据不被修改
HANDLE hNewDib = BIPImgLight(hDib, 50); // 提高亮度 +50
HANDLE hDarkDib = BIPImgLight(hDib, -30); // 降低亮度 -30
浙公网安备 33010602011771号