图像亮度调节
亮度调节的原理是:
对 每个像素的 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