CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > WinSystem子站 > 技巧

编写支持WIC的CODEC 并对图像格式支持

作者: Peggi Goodwin ,  出处:微软, 责任编辑: 韩博颖, 
2008-05-23 10:06
  Vista Explorer、照片库和 Image Viewer 都基于 WIC 而构建,因此一旦在 Vista 系统中安装支持 WIC 的 CODEC,Vista 就会为相关图像格式提供与该平台所包含的标准图像格式同样级别的支持。

  选择某个解码器来解码特定的图像后,应用程序会调用 Initialize。图像流被传递给解码器,调用方也可以指定缓存选项来处理文件中的元数据。

  

      enum WICDecodeOptions
  { WICDecodeMetadataCacheOnDemand,
  WICDecodeMetadataCacheOnLoad }
  有些应用程序比其他应用程序更常使用元数据。大多数应用程序并不需要访问图像文件中的所有元数据,它们会在需要时请求特定元数据。而其他应用程序则会预先将所有元数据保存到缓存中,而不是将文件流始终打开并在每次需要访问元数据时执行磁盘 I/O。如果调用方不指定元数据缓存选项,则采用的默认缓存行为是根据请求进行缓存。这意味着在应用程序提出特定的元数据请求前,不会有元数据加载到内存中。如果应用程序指定 WICDecodeMetadataCacheOnLoad,元数据会立即加载到内存中进行缓存。对元数据采用加载缓存方式时,缓存元数据后,可以释放文件流。

  GetContainerFormat 是所要实现的一个简单方法。它只针对解码器为其实例化的图像返回图像格式的 GUID。此方法也在 IWICMetadataBlockReader 和 IWICBitmapEncoder 上实现。

  GetDecoderInfo 返回一个 IWICBitmapDecoderInfo 对象。要获得 IWICBitmapDecoderInfo 对象,只需将解码器的 GUID 传递给 IWICComponentFactory 上的 CreateComponentInfo 方法,然后请求其中的 IWICDecoderInfo 接口即可,如下所示。

  

      IWICComponentInfo* piComponentInfo = NULL;
  HRESULT hr;
  hr = m_piComponentFactory->CreateComponentInfo(CLSID_This,
  &piComponentInfo);
  hr = piComponentInfo->QueryInterface(IID_IWICBitmapDecoderInfo,
  (void**)ppIDecoderInfo);
  GetFrameCount 只返回容器中的帧数。对于每个容器,有些容器格式支持多个帧,而有些容器格式则只支持一个帧。

  GetFrame 很可能是 IWICBitmapDecoder 接口上最重要的方法,因为帧中包含实际的图像位,而且该方法返回的帧解码器对象是对所请求图像进行实际解码的对象。它是在编写解码器时需要实现的另一个对象。有关此接口的更多信息,请参阅下面的 IWICBitmapFrameDecode。

  GetPreview 返回图像预览。有关预览的详细讨论,请参阅 IWICBitmapEncoder 接口上的 SetPreview 方法。

  如果您的图像格式包含内嵌 JPEG 预览,则不必编写 JPEG 解码器来将其解码。实际上,我们强烈建议您不要那么做。而是应委托 WIC 平台附带的 JPEG 解码器来将预览和缩略图解码。为此,应找到流中预览图像数据的起点并调用图像工厂的 CreateDecoderFromStream 方法。

  

      IWICBitmapDecoder* piPreviewDecoder = NULL;
  IWICBitmapFrameDecode* piPreviewFrame = NULL;
  IWICBitmapSource* piPreview = NULL;
  HRESULT hr;
  hr = m_piImagingFactory->CreateDecoderFromStream(m_piStream,
  NULL, WICDecodeMetadataCacheOnDemand, &piPreviewDecoder);
  hr = piPreviewDecoder->GetFrame(0, piPreviewFrame);
  hr = piPreviewFrame->QueryInterface(IID_IWICBitmapSource,
  (void**)&piPreview);
  IWICBitmapCodecProgressNotification
  CODEC 对大图像执行 CopyPixels 或 WritePixels 等 I/O 操作时,可能需要几秒甚至几分钟时间才能完成。最终用户对应用程序最常有的投诉之一就是当他们无法中断长时间运行的操作时,他们会认为应用程序已经挂起。在这种应用程序没有响应的情况下,用户往往会关闭应用程序,甚至重新启动机器,来尝试重新获得对计算机的控制权。
?27?? 9 1 2 3 4 5 6 7 8 9 10 11 ... :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

该文章的读者还阅读了

天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i