wince中显示BMP、JPG、Gif以及PNG的方法
wince中的图片解码方案中,利用Wince的API解码应该是用的非常广泛的。一来实现简单,二来支持多种图片格式(BMP、JPG、PNG、GIF),而且对每一种中的具体格式支持也很好。(微软自己做的,经过了各种样本的测试)。
飞狐作一个简单概括,并给出源代码。
1 确保操作系统中加入了组件,如果没有COM存储和Image的组件(在Wince 的core licence中就提供此组件),那么下面的都是白搭,程序可能都不能启动。
2 添加头文件
#include <INITGUID.h>
#include <imaging.h>
3 制作自己的读取文件函数,此函数返回HBITMAP,需要的地方可以自己放缩以及实现显示效果等等。
HBITMAP LoadImageFromFile(TCHAR * pFileImage)
{
IImagingFactory *pImgFactory = NULL;
IImage *pImageBmp = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
HBITMAP hResult = 0;
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory, NULL,
CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **)&pImgFactory)))
{
ImageInfo imageInfo;
HRESULT hr = pImgFactory->CreateImageFromFile(pFileImage, &pImageBmp);
if (SUCCEEDED(hr)&& SUCCEEDED(pImageBmp->GetImageInfo(&imageInfo)))
{
CWindowDC dc(0);
CDC dcBitmap;
dcBitmap.CreateCompatibleDC(&dc);
hResult = CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width, imageInfo.Height);
HGDIOBJ hOldBitmap = SelectObject(dcBitmap, hResult);
//note:内存不足的话,Draw操作可能会失败
pImage->Draw(dcBitmap, CRect(0, 0, stImageInfo.Width, stImageInfo.Height), NULL);
SelectObject(dcBitmap, hOldBitmap);
DeleteDC(dcBitmap);
pImageBmp->Release();
}
pImgFactory->Release();
}
CoUninitialize();
return hResult;
}
4 局限性:
A 需要OS组件支持,有的OS上可能没有。
B 为OS提供的API,不知道具体细节,尤其是对内存的控制不方便。
C 如果要读取某一图片各种的某一字段,运用此API将不方便,需要自己解码。