深入了解图标,使用WIC对Windows Vista图标进行解码
2008-10-24 17:35:27 来源:WEB开发网QueryCapability 方法用于检查给定流并确定它是否能够解码图像。如果能,则指示它能解码图像中的所有帧 (WICBitmapDecoderCapabilityCanDecodeAllImages),还是只能解码其中的部分帧 (WICBitmap-DecoderCapabilityCanDecodeSomeImages)。此外,还可以指定其他功能标志。切记在返回前还原流位置。您可以通过 QueryCapability 读取我在上一部分中介绍的图标格式的基础结构,从而确保该结构是解码器预期的结构。您可能还希望枚举图标中的图像,以确保可以进行加载。
Initialize 方法提供可供解码器读取的流。根据所提供的选项,它可能会立即加载所有帧 (WICDecodeMetadataCacheOnLoad),也可能仅在使用 GetFrame 方法特别要求 (WICDecodeMetadataCacheOnDemand) 时进行加载。如果属于后者,您需要一直持有流,直到所有帧加载完毕。
以下是我执行的一些操作,可能会对您有所帮助:我发现,可以根据图标中每个图像的图像大小和偏移创建子流,然后将这些子流传递到 IWICBitmapFrameDecode 接口实现中,这很有用。幸运的是,借助我在 2008 年 4 月一期的专栏中介绍的 WIC 图像工厂对象,可以非常轻松地完成此操作。图 3 显示了我借助 WIC 流对象创建子流时使用的 CreateSubStream 帮助程序函数。
创建子流
HRESULT CreateSubStream(IWICImagingFactory* factory,
IStream* stream,
ULONGLONG offset,
ULONGLONG maxSize,
IStream** subStream)
{
ASSERT(0 != factory);
ASSERT(0 != stream);
ASSERT(0 != subStream);
*subStream = 0;
CComPtr<IWICStream> wicStream;
HR(factory->CreateStream(&wicStream));
ULARGE_INTEGER quadOffset = { 0 };
quadOffset.QuadPart = offset;
ULARGE_INTEGER quadMaxSize = { 0 };
quadMaxSize.QuadPart = maxSize;
HR(wicStream->InitializeFromIStreamRegion(stream,
quadOffset,
quadMaxSize));
return wicStream.QueryInterface(subStream);
}
- ››深入理解JAR包
- ››深入分析Volatile的实现原理
- ››深入理解Flash Player的应用程序域(Application ...
- ››深入理解flash函数(AS2)
- ››图标设计中的几何形状应用
- ››深入理解Android消息处理系统——Looper、Handler...
- ››深入理解SET NAMES和mysql(i)_set_charset的区别
- ››深入理解Mysql字符集设置
- ››深入浅出实战攻防恶意PDF文档
- ››深入剖析防火墙策略的执行过程:ISA2006系列之六
- ››深入JavaScript与.NET Framework中的日期时间(3)...
- ››深入JavaScript与.NET Framework中的日期时间(2)...
更多精彩
赞助商链接