飞狐作一个简单概括,并给出源代码。
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将不方便,需要自己解码。
原文见 “http://jkflyfox.spaces.live.com/blog/cns!C936FCDDF997BA5F!1508.entry?_c=BlogPart”