Working with EXIF data

 简介

 

        我们继续关注Windows Mobile 5.0关于图像的API特性。前面我们展示了如何使用API加载并显示图像,在这片文章里,我将展示如何读取图像中的Exif数据。

        Exif是数码相机中存储照片元数据的地方。它可以存储包括相机制造商、相机型号、相机的参数设置,设置可以存储拍照时刻所在的地理位置,如果你的数码相机支持GPS的话。下面我们就来看看我们如何读取这些数据。

 

实现

 

        这个测试应用只是展示读取Exif信息

  1. IStream* pStream = CreateStreamByFileName(strFileName);
  2. IStream* CTestExifDlg::CreateStreamByFileName(const CString& strFileName) 
  3. {
  4.    HANDLE hFile = CreateFile(strFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
  5.     if (hFile == INVALID_HANDLE_VALUE) {
  6.         return 0;
  7.     }
  8.    
  9.    DWORD dwFileSize = GetFileSize(hFile, NULL);
  10.     if (dwFileSize == (DWORD)-1)
  11.     {
  12.         CloseHandle(hFile);
  13.         return 0;
  14.     }
  15.     HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
  16.     if (hGlobal == NULL) {
  17.         CloseHandle(hFile);
  18.         return 0;
  19.     }
  20.     LPVOID pvData = GlobalLock(hGlobal);
  21.     if (pvData == NULL) {
  22.         GlobalUnlock(hGlobal);
  23.         CloseHandle(hFile);
  24.         return 0;
  25.     }
  26.     DWORD dwBytesRead = 0;
  27.     BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
  28.     GlobalUnlock(hGlobal);
  29.     CloseHandle(hFile);
  30.     if (!bRead)
  31.     {
  32.         return 0;
  33.     }
  34.    IStream* pStream = 0;
  35.    if (FAILED(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream))) {
  36.       return 0;
  37.    }
  38.    return pStream;
  39. }

        现在我们有一个IStream,可以创建Image Decoder来读取Exif数据了。

  1. IImagingFactory *pImgFactory = 0; 
  2.    if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **)&pImgFactory))) {
  3.       IImageDecoder* pDecoder = 0;
  4.       if (SUCCEEDED(pImgFactory->CreateImageDecoder(pStream, DecoderInitFlagNone, &pDecoder))) {
  5.          UINT nCount = 0;
  6.          if (SUCCEEDED(pDecoder->GetPropertyCount(&nCount)) && nCount) {
  7.             PROPID* pIds = new PROPID[nCount];
  8.             if (SUCCEEDED(pDecoder->GetPropertyIdList(nCount, pIds))) {
  9.                for (UINT i = 0; i < nCount; i++) {
  10.                   UINT nPropSize = 0;
  11.                   if (SUCCEEDED(pDecoder->GetPropertyItemSize(pIds[i], &nPropSize))) {
  12.                      BYTE* pBuff = new BYTE[nPropSize];
  13.                      PropertyItem* pItem = (PropertyItem*)pBuff;
  14.                      if (SUCCEEDED(pDecoder->GetPropertyItem(pIds[i], nPropSize, pItem))) {
  15.                         AddPropertyItemToList(i, pList, pItem);
  16.                      }
  17.                      delete[] pBuff;
  18.                   }               
  19.                }
  20.             }
  21.             delete[] pIds;
  22.          }
  23.          pDecoder->Release();
  24.       }
  25.       pImgFactory->Release();
  26.    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值