VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 964|回复: 3

[求助] VC++ 如何读取自身资源中的BMP图片

[复制链接]
31_avatar_middle
在线会员 发表于 2016-10-5 15:56:06 | 显示全部楼层 |阅读模式
3驿站币
若资源中有一 16 位 的BMP图片,如何读取 该 BMP 的二进制数据。





上一篇:图零科技这家公司怎么样?资质全吗?正规吗?
下一篇:如何计算网络使用率?
52_avatar_middle
在线会员 发表于 2016-10-8 11:18:53 | 显示全部楼层
http://blog.sina.com.cn/s/blog_71fa0df50100v2gv.html    C++读取与保存bmp图片文件编程实现
53_avatar_middle
在线会员 发表于 2016-10-8 16:44:18 | 显示全部楼层
//16位的bmp?你确定有这样的bmp吗?

BOOL GetBitmapData(UINT bmpResourceID)
{
        BOOL bRet = FALSE;
        HDC hdc = NULL;
        HBITMAP bmp = NULL;
        char * bmpData = NULL;
       
        do
        {
                //第一步:将资源文件载入成HBITMAP
                bmp = ::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(bmpResourceID));
                if(bmp == NULL)
                {
                        break;
                }
               
                //第二步:获取bitmap 的信息
                BITMAP bmpInfo;
                if(::GetObject(bmp,sizeof(BITMAP),&bmpInfo) == 0)
                {
                        break;
                }
               
                //第三步:计算存储bitmap点阵数据的内存
                hdc = ::CreateCompatibleDC(NULL);

                char buffer[2048] = {0};
                BITMAPINFO * lpBIH = reinterpret_cast<BITMAPINFO *>(buffer);
                lpBIH->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
                lpBIH->bmiHeader.biWidth = bmpInfo.bmWidth;
                lpBIH->bmiHeader.biHeight = bmpInfo.bmHeight;
                //16位的Bitmap
                //=32 32位的bmp
               // = 24 24位的bmp
               //= 8 256色的bmp
                lpBIH->bmiHeader.biBitCount = 16;
                lpBIH->bmiHeader.biCompression = 0;
                lpBIH->bmiHeader.biPlanes = 1;
               
                //注意这里和下面调用的区别
                //第5个参数传入NULL,则返回需要的内存数在 lpBIH->bmiHeader.biSizeImage 里
                if(::GetDIBits(hdc,bmp,0,bmpInfo.bmHeight,NULL,lpBIH,DIB_RGB_COLORS) == 0)
                {
                        break;
                }

                //第四步:分配存储点阵数据所需内存
                bmpData = new char [lpBIH->bmiHeader.biSizeImage];
                if(bmpData == NULL)
                {
                        break;
                }
               
               
                //第五步:获取点阵数据
                //第5个参数传入分配好的内存
                if(::GetDIBits(hdc,bmp,0,bmpInfo.bmHeight,bmpData,lpBIH,DIB_RGB_COLORS) == 0)
                {
                        break;
                }

                bRet = TRUE;
        }while(FALSE);
       
        if(hdc != NULL)
        {
                ::DeleteDC(hdc);
                hdc = NULL;
        }
       
        if(bmp != NULL)
        {
                ::DeleteObject(bmp);
                bmp = NULL;
        }

        /*
                这里使用获得的点阵数据
        */

        //点阵数据使用完后,记得释放
        delete [] bmpData;
        bmpData = NULL;

        return bRet;
}
53_avatar_middle
在线会员 发表于 2016-10-9 09:01:51 | 显示全部楼层
补充一下:
可以用以下方式显示图像,以验证获取的图像数据是否正确。
StretchDIBits(hdc,
                        0,
                        0,
                        lpBIH->bmiHeader.biWidth,
                        lpBIH->bmiHeader.biHeight,
                        0,
                        0,
                        lpBIH->bmiHeader.biWidth,
                        lpBIH->bmiHeader.biHeight,
                        bmpData,
                        lpBIH,
                        DIB_RGB_COLORS,
                        SRCCOPY);
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-19 23:36

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表