来自网络:http://dev.21tx.com/2009/02/09/14033.html
目录
入门
解码图像
编码图像
WIC 图像工厂
使用流
通过 WPF 使用 WIC
下一步是什么?
Microsoft® Windows® Imaging Component (WIC) 是用于编码、解码和操控图像的可扩展框架。WIC 最初是为 Windows Vista® 和 Windows Presentation Foundation (WPF) 而设计的,但现在,不仅 Windows Vista 和 Microsoft .net Framework 3.0 及更高版本附带此框架,而且它还是 Windows XP 和 Windows Server® 2003 的一个下载项,可供于本机应用程序使用。
作为支持 WPF 的多个功能强大的本机框架之一,本文中所说的 WIC 是用于实现 System.Windows.Media.Imaging 命名空间的框架。但是,它也非常适合于以 C++ 编写的本机应用程序,因为它提供了通过一组 COM 接口呈现的简单但功能强大的 API。
WIC 使用一组可扩展的图像编解码器支持多种图像格式。每个编解码器支持一种不同的图像格式,并且通常同时提供编码器和解码器。WIC 包括用于所有主要图像格式的一组内置编解码器,这些格式包括 PNG、JPEG、GIF、TIFF、HD Photo (HDP)、ICO,当然还有 Windows BMP。
HDP 可能是唯一您没有听过的格式。它最初称为 Windows Media Photo 且是配合 Windows Vista 开发的,用于克服现有格式的一些限制并提供更好的性能和更高的图像质量。如需有关 HDP 的更多信息,请查看 microsoft.com/whdc/xps/wmphoto.mspx 上的规范。幸运地是,WIC 可很好地支持这一新图像格式,因此应用程序不必知道格式的具体细节即可使用它们。
本月,我将向您展示如何使用 WIC 来编码和解码不同的图像格式以及其间的多项事宜。下一次,我将讲述一些更高级的功能,并向您展示如何使用自己的图像编解码器来扩展 WIC。
入门
WIC API 包含 COM 接口、函数、结构和错误代码,以及标识各种编解码器、容器和格式的 GUID。需要的所有声明均包括在 wincodec.h 和 wincodecsdk.h 头文件中,这些文件是 Windows SDK 的一部分(Visual Studio® 2008 中附带这些文件)。您还必须链接到 WindowsCodecs.lib 库,该库提供了您可能需要的各种定义。可将以下代码添加到项目的预编译头文件中以使其完全可用:
#include <wincodec.h>
#include <wincodecsdk.h>
#pragma comment(lib, "WindowsCodecs.lib")
由于 WIC API 主要包含的是 COM 接口,因此我使用活动模板库 (ATL) CComPtr 类来处理接口指针的创建和管理。如果要执行相同的操作,还需包括定义 CComPtr 模板类的 atlbase.h 头文件:
#include <atlbase.h>
WIC API 还使用 COM 库,因此使用此 API 的任何线程均必须调用 CoInitializeEx 函数。
最后,WIC API 使用 HRESULT 来描述错误。本文中的示例使用 HR 宏来清晰地识别方法在何处返回需要检查的 HRESULT。可将它替换为自己的错误处理策略—由它引发异常或是您自己返回 HRESULT。
解码图像
解码器由 IWICBitmapDecoder 接口表示。WIC 提供了多种用于创建解码器对象的方法,但可仅使用特定解码器的 CLSID 来创建一个实例。以下示例为 TIFF 图像创建了一个解码器:
CComPtr<IWICBitmapDecoder> decoder;
HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));
图 1 列出了 WIC 所包含的编解码器以及可用于创建不同解码器的 CLSID。创建完解码器后,需使用包含像素和可选元数据(它们使用解码器可理解的格式)的流对其进行初始化:
Figure1内置 WIC 编解码器的 CLSID
格式 | 解码器 | 编码器 |