图像亮度调节

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

posted on 2025-02-01 03:12  lydstory  阅读(13)  评论(0)    收藏  举报

导航