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将不方便,需要自己解码。

posted on 2010-05-31 10:28  xilentz  阅读(3160)  评论(0编辑  收藏  举报