1 个回答 得票排序 · 时间排序
极术小姐姐 · 2022年01月04日
本回答来源全志R329 MiniGUI如何获取和设置BITMAP像素点?

需要一个结构体来存RGBA数据

typedef struct tagRGBQUAD {
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
} RGBQUAD;

下面是获取像素的方法

static void getPixel(PBITMAP src) {
    RGBQUAD srcdib[src->bmWidth * src->bmHeight];
    int x, y, point = 0;
    Uint8 *srcrow;
    Uint32 pixel;

    /* 循环获取像素点 */
    for (y = 0; y < src->bmHeight; y++) {
        for (x = 0; x < src->bmWidth; x++) {
            /* 得到像素点的地址 */
            srcrow = (Uint8 *) src->bmBits + y * src->bmPitch
                    + x * src->bmBytesPerPixel;
            pixel = *((Uint32 *) (srcrow));
            /* 这是MiniGUI中根据Pixel转成RGBA的函数 */
            Pixel2RGBA(HDC_SCREEN, pixel, &srcdib[point].rgbRed,
                    &srcdib[point].rgbGreen, &srcdib[point].rgbBlue,
                    &srcdib[point].rgbReserved);
            /* 打印看看对不对 */
            printf("%d %d %d %d\n", srcdib[point].rgbReserved,
                    srcdib[point].rgbRed, srcdib[point].rgbGreen,
                    srcdib[point].rgbBlue);
            /* 记录点的位置 */
            point++;
        }
    }
}

下面是设置像素的方法

static void setPixel(PBITMAP src, PBITMAP dstbmp) {
    /* 这里根据源图片重新构造一个PBITMAP对象 */
    dstbmp->bmType = src->bmType;
    dstbmp->bmBitsPerPixel = src->bmBitsPerPixel;
    dstbmp->bmBytesPerPixel = src->bmBytesPerPixel;
    dstbmp->bmAlpha = src->bmAlpha;
    dstbmp->bmColorKey = src->bmColorKey;
#ifdef _FOR_MONOBITMAP
    dstbmp->bmColorRep = src->bmColorRep;
#endif
    dstbmp->bmAlphaMask = src->bmAlphaMask;
    dstbmp->bmAlphaPitch = src->bmAlphaPitch;
    dstbmp->bmWidth = src->bmWidth;
    dstbmp->bmHeight = src->bmHeight;
你的回答