UWP开发细节记录:加载图像文件到D2D位图和D3D纹理
在UWP中加载文件一般先创建 StorageFile 对象,然后调用StorageFile.OpenReadAsync 方法得到一个IRandomAccessStream 接口用来读取数据:
 StorageFile image_file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/sample.jpg", UriKind.Absolute));
 IRandomAccessStream stream = await image_file.OpenReadAsync();
从一个 IRandomAccessStream 流开始,加载图像的步骤(C++ /CX实现):
1. 转换 IRandomAccessStream^ 到 ISream 接口:
ComPtr<IStream> source_stream;
DX::ThrowIfFailed(::CreateStreamOverRandomAccessStream(stream, IID_PPV_ARGS(&source_stream)));
2. 调用 IWICImagingFactory::CreateDecoderFromStream 方法(假设IWICImagingFactory对象以创建)创建 IWICBitmapDecoder 对象用于图像解码,并最终得到 IWICFormatConverter 对象转换为适合D2D/D3D的位图格式:
ComPtr<IWICBitmapDecoder> decoder;
DX::ThrowIfFailed(_device_resources->GetWicImagingFactory()->CreateDecoderFromStream(source_stream.Get(), nullptr, WICDecodeMetadataCacheOnDemand, &decoder)); ComPtr<IWICBitmapFrameDecode> frame;
DX::ThrowIfFailed(decoder->GetFrame(, &frame)); // Convert the image to a pixel format supported by Direct2D. 32bppPBGRA is guaranteed to be supported on all hardware.
ComPtr<IWICFormatConverter> covert;
DX::ThrowIfFailed(_device_resources->GetWicImagingFactory()->CreateFormatConverter(&covert));
DX::ThrowIfFailed(covert->Initialize(frame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom));
3. 如果图像用于 D2D ,现在就可以直接用 ID2D1DeviceContext::CreateBitmapFromWicBitmap 方法创建 D2D 位图了:
ComPtr<ID2D1Bitmap1> d2d_bitmap;
DX::ThrowIfFailed(_device_resources->GetD2DDeviceContext()->CreateBitmapFromWicBitmap(covert.Get(), &d2d_bitmap));
4. 如果要用于 D3D 则需要先创建 D3D 纹理:
// 创建D3D纹理用于3D渲染
D3D11_TEXTURE2D_DESC tex_desc = { };
tex_desc.ArraySize = ;
tex_desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
tex_desc.CPUAccessFlags = ;
tex_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
tex_desc.Height = height;
tex_desc.Width = width;
tex_desc.MipLevels = ;
tex_desc.MiscFlags = ;
tex_desc.SampleDesc.Count = ;
tex_desc.SampleDesc.Quality = ;
tex_desc.Usage = D3D11_USAGE_DEFAULT; ComPtr<ID3D11Texture2D> image_texture;
DX::ThrowIfFailed(_device_resources->GetD3DDevice()->CreateTexture2D(&tex_desc, NULL, &image_texture));
5. 从 ID3D11Texture2D 对象中获取 IDXGISurface 接口,D2D和D3D只能通过DXGI进行交互:
ComPtr<IDXGISurface> dxgi_surface;
DX::ThrowIfFailed(image_texture.As(&dxgi_surface));
6. 通过 ID2D1Factory::CreateDxgiSurfaceRenderTarget 方法创建 D2D 渲染目标:
float dpiX = 1.0f;
float dpiY = 1.0f;
_device_resources->GetD2DFactory()->GetDesktopDpi(&dpiX, &dpiY); D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
dpiX,
dpiY
); ComPtr<ID2D1RenderTarget> render_target;
DX::ThrowIfFailed(_device_resources->GetD2DFactory()->CreateDxgiSurfaceRenderTarget(dxgi_surface.Get(), props, &render_target));
7. 通过 ID2D1RenderTarget::CreateBitmapFromWicBitmap 方法创建位图(注意这里不能直接使用第3步创建的位图,是不同的渲染目标,设备相关的位图不能通用):
ComPtr<ID2D1Bitmap> bitmap;
DX::ThrowIfFailed(render_target->CreateBitmapFromWicBitmap(covert.Get(), &bitmap));
8. 绘制位图到渲染目标,实际上也是绘制到 D3D 纹理:
render_target->BeginDraw();
render_target->DrawBitmap(bitmap.Get());
render_target->EndDraw();
参考:MSDN 《Direct2D 和 Direct3D 互操作性概述》
UWP开发细节记录:加载图像文件到D2D位图和D3D纹理的更多相关文章
- UWP开发细节记录:DirectX::XMMATRIX 的坑
		
这两天写的代码概率性的崩溃在 XMMatrixMultiply() 函数,XMMatrixMultiply() 本身是 inline 函数可以看到崩溃处的代码: vX = _mm_mul_ps(vX, ...
 - UWP开发细节记录:WRL::ComPtr 的坑
		
WRL::ComPtr 取原始指针的地址有两种方式: operator&() 先释放原指针再取地址 GetAddressOf() 直接得到原始指针的地址 显然,operator& ...
 - UWP开发细节记录:判断文件类型
		
StorageFile.ContentType 属性,是 string 类型,用来表示文件内容的 MIME 类型.例如,音乐文件可能有 "audio/mpeg" MIME 类型.( ...
 - UWP开发细节记录:IStream 和 IRandomAccessStream^ 以及 IMFByteStream 互转
		
IStream 和 IRandomAccessStream^ 互转 IRandomAccessStream^ --> IStream: CreateStreamOverRandomAccess ...
 - 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】
		
转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...
 - 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条
		
混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...
 - 微信小程序开发动感十足的加载动画--都在这里!
		
代码地址如下:http://www.demodashi.com/demo/14242.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
 - 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用
		
标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1171 ...
 - hive--udf函数(开发-4种加载方式)
		
UDF函数开发 标准函数(UDF):以一行数据中的一列或者多列数据作为参数然后返回解雇欧式一个值的函数,同样也可以返回一个复杂的对象,例如array,map,struct. 聚合函数(UDAF):接受 ...
 
随机推荐
- 【VC版】如何获取其他进程中ListView控件中的内容
			
如果需要C#版的,可以看下我之前写的:C#如何获取其他程序ListView控件中的内容 获取其他进程的数据需要使用到以下几个函数: VirtualAllocEx() VirtualFreeEx() W ...
 - SpringMVC+FreeMarker+Mybatis 整合
			
这个项目自己有时写写测试代码什么的, 代码比较简单,代码已放在 github : https://github.com/zhouyongtao/homeinns-web 目录结构: 贴一下Maven的 ...
 - Vue源码翻译之渲染逻辑链
			
本篇文章主要要记录说明的是,Vue在Vdom的创建上的相关细节.这也是描绘了Vue在界面的创建上的一个逻辑顺序,同时我也非常拜服作者编码的逻辑性,当然或许这么庞大复杂的编码不是一次性铸就的,我想应该也 ...
 - 自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。
			
要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识.和JS/JQuery基本语法. 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到 ...
 - 【sh文件权限】无法启动tomcat -bash: ./startup.sh: Permission denied
			
今天在Linux上启动Tomcat,结果弹出:-bash: ./startup.sh: Permission denied 的提示. 这是因为用户没有权限,而导致无法执行, 用命令chmod 修改一下 ...
 - vscode浏览器打开html vscode修改默认浏览器
			
vscode怎么浏览器打开html预览?这里大家可以通过安装open in browser插件解决. 1.vscode怎么浏览器预览 1.点击拓展 2.输入open in browser,选择第一个 ...
 - SpringMVC官方文档阅读
			
默认的DispatcherServlet配置 在spring-webmvc-4.3.16.RELEASE.jar/org/springframework/web/servlet/路径下的Dispatc ...
 - JavaWeb学习路线图
			
基本把JavaWeb的学了有一半了,在网上找了个学习路线图,供参考.
 - RabbitMQ学习系列一:windows下安装RabbitMQ服务
			
Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang. 第一步下载erlang:http://www.erlang.org/download ...
 - MSSQL标识ID的修改
			
今天机缘巧合,无意听到别人闲聊,突发奇想设计一套系统来解决他们的痛点,待我进一步分析下如何执行.回到主题,最近修改ID的工作做了不少.企业补充历史数据用.现总结如下: 1.想把递增ID某一段的ID都加 ...