Direct2D 极速教程(2) —— 画淳平

极速导航

    • 创建新项目:002-DrawJunpei
    • WIC 是什么
    • 用 WIC 加载图片
    • 画淳平



创建新项目:002-DrawJunpei


  • 右键解决方案 -> 添加 -> 新建项目

在这里插入图片描述


  • 选择"空项目",项目名称为 “002-DrawJunpei”,然后按"创建"

在这里插入图片描述


  • 将 “佐佐木淳平.jpg” 移动到项目文件夹里

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


WIC 是什么


在这里插入图片描述


WIC (32位 Windows 映像组件) 其实就是一个图像处理框架,在 Windows Vista 的时候,微软把 GDI+ 里面的 Image 类关于图片解编码的部分单独拆出来,弄成了一套组件,这样所有的 DirectX 套件都能共用这个图像处理组件了。


用 WIC 加载图片


在这里插入图片描述

只需要注意 Direct2D 的渲染目标是自带 WIC 位图转 D2D 位图的方法的 (CreateBitmapFromWicBitmap),Direct2D 要求位图格式都是 GUID_WICPixelFormat32bppPBGRA 这点即可。

// 创建 WIC 工厂
CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_WICFactory));// 读取图片数据并创建解码器
m_WICFactory->CreateDecoderFromFilename(L"佐佐木淳平.jpg", nullptr, GENERIC_READ,WICDecodeMetadataCacheOnDemand, &m_BitmapDecoder);// 读取一帧图片
m_BitmapDecoder->GetFrame(0, &m_DecodeFrame);// 创建转换器
m_WICFactory->CreateFormatConverter(&m_Converter);// 将图片进行转换,注意 D2D 位图格式都是 GUID_WICPixelFormat32bppPBGRA
m_Converter->Initialize(m_DecodeFrame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeCustom);// 将 WIC 位图转换成 D2D 位图
m_RenderTarget->CreateBitmapFromWicBitmap(m_Converter.Get(), &m_Bitmap);

画淳平


#include<Windows.h>
#include<wincodec.h>
#include<wrl.h>
#include<d2d1.h>#pragma comment(lib, "d2d1.lib")
#pragma comment(lib, "windowscodecs.lib")using namespace Microsoft::WRL;LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);ComPtr<ID2D1Factory> m_D2DFactory;				// D2D 工厂
ComPtr<ID2D1HwndRenderTarget> m_RenderTarget;	// 窗口渲染目标
ComPtr<ID2D1SolidColorBrush> m_Brush;			// 纯色画刷
ComPtr<ID2D1Bitmap> m_Bitmap;					// D2D 位图ComPtr<IWICImagingFactory> m_WICFactory;		// WIC 工厂
ComPtr<IWICBitmapDecoder> m_BitmapDecoder;		// 位图解码器
ComPtr<IWICBitmapFrameDecode> m_DecodeFrame;	// 位图解码帧
ComPtr<IWICFormatConverter> m_Converter;		// 位图转换器int WINAPI WinMain(HINSTANCE hins, HINSTANCE hPrev, LPSTR lpstr, int cmdShow)
{WNDCLASS wc = {};wc.hInstance = hins;wc.lpszClassName = L"D2D";wc.lpfnWndProc = callBackFunc;RegisterClass(&wc);HWND hwnd = CreateWindow(wc.lpszClassName, L"有", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT, 768, 512, NULL, NULL, hins, NULL);MSG msg = {};while (GetMessage(&msg, NULL, 0, 0) > 0){TranslateMessage(&msg);DispatchMessage(&msg);}
}LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_CREATE: {	// 在这里创建 D2D 设备CoInitialize(nullptr);// 创建 D2D 工厂D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, m_D2DFactory.GetAddressOf());D2D1_RENDER_TARGET_PROPERTIES properties = {};properties.dpiX = 0;properties.dpiY = 0;properties.type = D2D1_RENDER_TARGET_TYPE_HARDWARE;					// 硬件渲染properties.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;	// 开启 alpha 混合properties.pixelFormat.format = DXGI_FORMAT_R8G8B8A8_UNORM;D2D1_HWND_RENDER_TARGET_PROPERTIES Hwndproperties = {};Hwndproperties.hwnd = hwnd;											// 窗口句柄Hwndproperties.pixelSize.width = 640;								// 渲染目标宽度Hwndproperties.pixelSize.height = 480;								// 渲染目标高度Hwndproperties.presentOptions = D2D1_PRESENT_OPTIONS_NONE;			// 自动选择呈现模式// 创建窗口渲染目标m_D2DFactory->CreateHwndRenderTarget(properties, Hwndproperties, &m_RenderTarget);// 创建纯色画刷m_RenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Blue), &m_Brush);// 创建 WIC 工厂CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_WICFactory));// 读取图片数据并创建解码器m_WICFactory->CreateDecoderFromFilename(L"佐佐木淳平.jpg", nullptr, GENERIC_READ,WICDecodeMetadataCacheOnDemand, &m_BitmapDecoder);// 读取一帧图片m_BitmapDecoder->GetFrame(0, &m_DecodeFrame);// 创建转换器m_WICFactory->CreateFormatConverter(&m_Converter);// 将图片进行转换,注意 D2D 位图格式都是 GUID_WICPixelFormat32bppPBGRAm_Converter->Initialize(m_DecodeFrame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeCustom);// 将 WIC 位图转换成 D2D 位图m_RenderTarget->CreateBitmapFromWicBitmap(m_Converter.Get(), &m_Bitmap);} break;case WM_PAINT: {	// 在这里进行绘制操作m_RenderTarget->BeginDraw();m_RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::LightSteelBlue));	// 清空窗口D2D1_RECT_F rect = D2D1::RectF(0, 0, 768, 512);m_RenderTarget->DrawBitmap(m_Bitmap.Get(), rect);m_RenderTarget->EndDraw();} break;case WM_DESTROY: {PostQuitMessage(0);} break;default: return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}

在这里插入图片描述



下一章,我们将画淳平的 GIF 动图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理——从原理、经典模型到应用

1. 概述 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一门借助计算机技术研究人类语言的科学&#xff0c;是人工智能领域的一个分支&#xff0c;旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…

【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文

全球网络犯罪与网络安全政策的多维度分析及效能评估 摘要1 Introduction1.1 Problem Background1.2Restatement of the Problem1.3 Literature Review1.4 Our Work 2 Assumptions and Justifications数据完整性与可靠性假设&#xff1a;法律政策独立性假设&#xff1a;人口统计…

06-AD向导自动创建P封装(以STM32-LQFP48格式为例)

自动向导创建封装 自动向导创建封装STM32-LQFP48Pin封装1.选则4排-LCC或者QUAD格式2.计算焊盘相定位长度3.设置默认引脚位置(芯片逆时针)4.特殊情况下:加额外的标记 其他问题测量距离:Ctrl M测量 && Ctrl C清除如何区分一脚和其他脚?芯片引脚是逆时针看的? 自动向导…

【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…

Java基于SSM框架的互助学习平台小程序【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

实战纪实 | 真实HW漏洞流量告警分析

视频教程在我主页简介和专栏里 目录&#xff1a; 一、web.xml 文件泄露 二、Fastjson 远程代码执行漏洞 三、hydra工具爆破 四、绕过验证&#xff0c;SQL攻击成功 五、Struts2代码执行 今年七月&#xff0c;我去到了北京某大厂参加HW行动&#xff0c;因为是重点领域—-jr&…

WSL安装CUDA

WSL安装CUDA 参考文档&#xff1a; ​ 总安装文档&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#wsl-installation 1. 下载cuda ​ 进入下载界面&#xff1a;https://developer.nvidia.com/cuda-downloads?target_osLinux&target_archx86_…

IO进程寒假作业DAY6

请使用互斥锁 和 信号量分别实现5个线程之间的同步 使用互斥锁 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include &…

初始JavaEE篇 —— Spring Web MVC入门(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 RequestMappingg 注解介绍 Postman的介绍与使用 PostMapping 与 GetMapping 注解 构造并接收请求 接收简单参数 接收对象…

vim交换文件的工作原理

在vim中&#xff0c;交换文件是一个临时文件&#xff0c;当我们使用vim打开一个文件进行编辑&#xff08;一定得是做出了修改才会产生交换文件&#xff09;时候&#xff0c;vim就会自动创建一个交换文件&#xff0c;而之后我们对于文件的一系列修改都是在交换文件中进行的&…

类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件

目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写&#xff08;overidde&#xff09; 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…

16届蓝桥杯寒假刷题营】第2期DAY5IOI赛

3.小蓝小彬的代码挑战 - 蓝桥云课 问题描述 在蓝桥杯大赛中&#xff0c;小蓝和小彤是一对好朋友。他们在比赛中遇到了一个有趣的挑战。这个挑战是给定一个由大写字母组成的代码&#xff0c;他们需要找出这串代码中有多少个子序列LQB。小蓝和小彬都很聪明&#xff0c;他们想到…

51单片机入门_02_C语言基础0102

C语言基础部分可以参考我之前写的专栏C语言基础入门48篇 以及《从入门到就业C全栈班》中的C语言部分&#xff0c;本篇将会结合51单片机讲差异部分。 课程主要按照以下目录进行介绍。 文章目录 1. 进制转换2. C语言简介3. C语言中基本数据类型4. 标识符与关键字5. 变量与常量6.…

【Java】微服务找不到问题记录can not find user-service

一、问题描述 运行网关微服务与用户微服务后&#xff0c;nacos服务成功注册 但是测试接口的时候网关没有找到相关服务 二、解决方案 我先检查了pom文件确定没问题后查看配置文件 最后发现是配置里spring.application.namexxx-user里面服务的名字后面多了一个空格 三、总结…

Java设计模式:行为型模式→策略模式

Java 策略模式详解 1. 定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列的算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。通过这种模式&#xf…

c++学习第十四天

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考。 //力扣代码 class Solution {const char* numStrArr[10]{"","","abc","def","ghi","jkl","mno","pqrs","tuv&q…

Python Matplotlib库:从入门到精通

Python Matplotlib库&#xff1a;从入门到精通 在数据分析和科学计算领域&#xff0c;可视化是一项至关重要的技能。Matplotlib作为Python中最流行的绘图库之一&#xff0c;为我们提供了强大的绘图功能。本文将带你从Matplotlib的基础开始&#xff0c;逐步掌握其高级用法&…

Vue平台开发三——项目管理页面

前言 对于多个项目的使用&#xff0c;可能需要进行项目切换管理&#xff0c;所以这里创建一个项目管理页面&#xff0c;登录成功后跳转这个页面&#xff0c;进行选择项目&#xff0c;再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…

常见字符串相关题目

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 14.最长公共前缀 5.最长回文子串 67.二进制求和 43.字符串相乘 14.最长公共前缀 题目&#xff1a; 编写一个函数来查…