使用 WIC 对 Windows Vista 图标进行解码

最近写个控件,发现 VC 的 API 函数 ::LoadImage 对含有 128x128, 256x256 格式的图标,部分是无法载入该格式的。

原因是因为该格式是采用 png 压缩的图像格式。

 

-- 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 的一个下载项,可供于本机应用程序使用。

 

 

要想读取这种格式的 ico,这里有两篇文章很值得拜读一下:

第一部分:http://msdn.microsoft.com/zh-cn/magazine/cc500647.aspx

第二部分:http://msdn.microsoft.com/zh-cn/magazine/cc546571.aspx

 

 

WIC (Windows Imaging Component) 是一个 Windows 平台上的图像编解码框架,它提供了一个统一的编解码器接口,使得开发人员能够轻松地读取、写入、转换和处理各种图像格式。 要使用 WIC 存储 PNG 图片,可以按照以下步骤进行操作: 1. 创建 WIC 编码器实例。 ```c++ IWICImagingFactory *pFactory = NULL; IWICBitmapEncoder *pEncoder = NULL; // 创建 WIC 工厂 CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFactory)); // 创建 PNG 编码器 pFactory->CreateEncoder(GUID_ContainerFormatPng, NULL, &pEncoder); ``` 2. 创建一个 WIC 编码器输出流。 ```c++ IStream *pStream = NULL; pFactory->CreateStream(&pStream); // 打开输出流 pStream->InitializeFromFilename(L"output.png", GENERIC_WRITE); // 将输出流与编码器关联 pEncoder->Initialize(pStream, WICBitmapEncoderNoCache); ``` 3. 创建一个 WIC 编码器帧,并将要存储的图像数据写入帧中。 ```c++ IWICBitmapFrameEncode *pFrame = NULL; pEncoder->CreateNewFrame(&pFrame, NULL); // 初始化帧 pFrame->Initialize(NULL); // 设置帧大小和格式 pFrame->SetSize(width, height); pFrame->SetPixelFormat(&pixelFormat); // 将图像数据写入帧 pFrame->WritePixels(height, stride, imageSize, pData); // 关闭帧 pFrame->Commit(); // 关闭编码器 pEncoder->Commit(); ``` 4. 释放资源。 ```c++ pFrame->Release(); pStream->Release(); pEncoder->Release(); pFactory->Release(); ``` 其中,`width` 和 `height` 分别表示图像的宽度和高度,`pixelFormat` 表示图像的像素格式,`stride` 表示每一行像素数据的字节数,`imageSize` 表示图像的总大小,`pData` 表示指向图像数据的指针。 需要注意的是,WIC 框架并不支持所有的 PNG 特性,例如 alpha 通道混合模式、灰度图像、动画等,因此在使用 WIC 存储 PNG 图像时需要注意选择合适的像素格式和图像处理方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值