利用GDI+显示资源文件(Resource)中的JPG图像

 使用GDI+在程序中显示一幅JPG图像的时候,若文件在硬盘上则操作极为简单:

 

                 Image image(L"E://your.JPG");
                 Graphics graphics(GetDC()->m_hDC);
                 graphics.DrawImage(&image,0,0);

 

     有趣的是,若图像存在于程序资源中时,要实现相同的效果却麻烦了很多,你说微软的人是不是有些8*%@(^@^):

 

    实现的流程是这样的:

           1.先用FindResource,LoadResource,LockResource三个函数得于指向资源的指针(由LockResource返回,假定是lpvoid);

           2.通过StgCreateStorageEx创建IStorage,再由IStorage创建一个IStream;

           3.调用IStream::Write(lpvoid,size,NULL)将由资源数据写入到IStream中;

           4.Image image(m_stream) 注:m_stream为上述过程中创建的IStream对象;

           5.余下步骤同上.

    下面给出关键代码:(创建一个单文档,在:OnDraw()中实现本例功能)

void CShowJpgFromResView::OnDraw(CDC* /*pDC*/)
{

 // ......................

 HRSRC hrsrc=::FindResource(::AfxGetInstanceHandle(),

                                               MAKEINTRESOURCE(IDR_JPG1),L"jpg");
 HGLOBAL hglobal=::LoadResource(::AfxGetInstanceHandle(),hrsrc);
 LPVOID pvoid=::LockResource(hglobal);
 DWORD dw=::SizeofResource(::AfxGetInstanceHandle(),hrsrc);

 IStorage *m_stor;
 ::StgCreateStorageEx(L"D://test.stg",STGM_CREATE|STGM_SHARE_EXCLUSIVE|

                                                STGM_READWRITE,STGFMT_STORAGE,0,

                                                                                    0,0,IID_IStorage,(void**)&m_stor);
 IStream *m_stream;
 m_stor->CreateStream(L"MyStream",STGM_CREATE|STGM_READWRITE|

               STGM_DIRECT|STGM_SHARE_EXCLUSIVE,0,0,(IStream**)&m_stream);

 m_stream->Write(pvoid,dw,NULL);

 Graphics graphics(GetDC()->m_hDC);
 Image image(m_stream);
 graphics.DrawImage(&image,0,0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值