全志科技
直播中

李晶

7年用户 934经验值
私信 关注
[问答]

求一种MiniGUI获取和设置BITMAP像素点的解决方案

  • 在MiniGUI中使用FillBoxWithBitmap加载一张图片后,需要获取到每一个像素点并重新设置像素点,实时更新内存中图像数据,做一些特效,比如旋转
    通过FillBoxWithBitmap加载图片后,返回的是BITMAP结构体,里面包含指向图像内存的指针bmBits,因此访问和修改该指针里的内容即可修改。

回帖(1)

胡劝侨

2021-12-29 14:08:21
解决方案
需要一个结构体来存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 %dn", 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;
    dstbmp->bmPitch = src->bmPitch;
    dstbmp->bmBits = malloc(src->bmWidth * src->bmHeight * src->bmBytesPerPixel);

    /* dstdib存的是自己需要的每个像素点的值,根据需要自己赋值 */
    RGBQUAD dstdib[src->bmWidth * src->bmHeight];
    int x, y, point = 0;
    Uint32 pixel;
   
    /* 设置每一个像素点的值 */
    for (y = 0; y < src->bmHeight; y++) {
        for (x = 0; x < src->bmWidth; x++) {
            pixel = RGBA2Pixel(HDC_SCREEN, dstdib[point].rgbRed,
                    dstdib[point].rgbGreen, dstdib[point].rgbBlue,
                    dstdib[point].rgbReserved);
            /* 打印看看像素是否正常 */
            printf("%d %d %d %dn", dstdib[point].rgbReserved,
             dstdib[point].rgbRed, dstdib[point].rgbGreen,
             dstdib[point].rgbBlue);
            printf("pixel=%xn", pixel);

            /* MiniGUI根据pixel设置像素点的函数 */
            SetPixelInBitmap(dstbmp, x, y, pixel);
            /* 记录点的位置 */
            point++;
        }
    }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分