Direct 2D 加载位图.
来源:互联网 发布:mac怎么玩魔兽世界 编辑:程序博客网 时间:2024/05/23 20:05
HRESULT LoadImageFormFile( ID2D1RenderTarget *pRT, IWICImagingFactory *pWicFactory, PCTSTR url, UINT dstWidth, UINT dstHeight, ID2D1Bitmap **ppBitmap ){ IWICBitmapDecoder *pDecoder = NULL; IWICBitmapFrameDecode *pFrame = NULL; IWICFormatConverter *pFormat = NULL; IWICBitmapScaler *pScaler = NULL; HRESULT hr = pWicFactory->CreateDecoderFromFilename( url, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder ); if ( SUCCEEDED(hr) ) { hr = pDecoder->GetFrame(0, &pFrame); } if ( SUCCEEDED(hr) ) { hr = pWicFactory->CreateFormatConverter(&pFormat); } if ( SUCCEEDED(hr) ) { if ( dstWidth != 0 || dstHeight != 0) { UINT originalWidth, originalHeight; hr = pFrame->GetSize(&originalWidth, &originalHeight); if ( SUCCEEDED(hr) ) { if ( dstWidth == 0 ) { FLOAT scalar = (FLOAT)dstHeight / (FLOAT)originalHeight; dstWidth = (UINT)(scalar * (FLOAT)originalWidth); } else { FLOAT scalar = (FLOAT)dstWidth / (FLOAT)originalWidth; dstHeight = (UINT)(scalar * (FLOAT)originalHeight); } hr = pWicFactory->CreateBitmapScaler(&pScaler); } if ( SUCCEEDED(hr) ) { hr = pScaler->Initialize( pFrame, dstWidth, dstHeight, WICBitmapInterpolationModeCubic ); } if ( SUCCEEDED(hr) ) { hr = pFormat->Initialize( pScaler, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeMedianCut ); } } else { hr = pFormat->Initialize( pFrame, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeMedianCut ); } } if ( SUCCEEDED(hr) ) { hr = pRT->CreateBitmapFromWicBitmap( pFormat, ppBitmap ); } SafeRelease(pDecoder); SafeRelease(pFrame); SafeRelease(pFormat); SafeRelease(pScaler); return hr;}
Direct 2D本身不能加载位图, 需要通过WIC接口.
#include <wincodec.h>
#pragma comment(lib, "Windowscodecs.lib")
首先 使用 CoCreateInstance 构造一个 IWicImaginFactory 对象.
IWicImaginFactory 对象用于创建所有 WIC 对象.
步骤:
1,
IWICImagingFactory::CreateDecoderFromFilename(...) 函数从 文件 加载位图.
该函数产生一个 IWICBitmapDecoder 对象.
该对象指向位图数据.
2,
IWICBitmapDecoder::GetSize(...) 函数从 位图数据 中读取一帧图像的数据.
该函数产生一个 IWICBitmapFrameDecode 对象.
该对象指向位图某一帧图像数据.
3,
IWICBitmapScaler::Initialize(...) 函数将 图像缩放.
如果不需要缩放, 此步骤可以省略.
4,
IWICFormatConverter::Initialize(...) 函数将 图像数据 转换格式, 使得Direct 2D能够识别.
5,
ID2D1HwndRenderTarget::CreateBitmapFromWicBitmap(...)
通过传入的 图像数据 创建 ID2D1Bitmap 对象.
前面4步都是由WIC完成, 只有最后一步使用Direct 2D完成.
创建的位图是设备相关资源, 在设备丢失之后需要重新创建.
0 0
- Direct 2D 加载位图.
- Direct 2D 平铺位图.
- 加载位图2
- 加载位图
- 加载位图
- 位图加载
- 第一章 Introducing Direct 3D
- Direct 3D骨骼动画
- 《Study Direct 3D》第一节
- flash位图技术研究篇(9):2D平面映射球体
- 从文件加载位图
- 加载位图VC++
- 加载显示位图
- 加载位图 LoadBitmap
- 纸牌位图的加载
- toolbar加载位图
- picture控件 加载位图
- 加载显示位图
- 共享内存
- Java使用网格组布局管理器
- 如何使 类的成员函数作为回调函数
- 通过笔记本建立wifi热点
- rpm 包的安装、卸载、升级、查询、验证
- Direct 2D 加载位图.
- Chromium 嵌入式框架
- 窗体控制
- log4net应用实践(一)
- vim复制代码包含注释时格式会乱掉的解决办法
- SignalR触发OnDisconnected事件收集
- Cheat Notes
- QT共享内存
- C#后期绑定操作Excel