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清除如何区分一脚和其他脚?芯片引脚是逆时针看的? 自动向导…

MATLAB基础应用精讲-【数模应用】迭代扩展卡尔曼滤波(IEKF)(附MATLAB、python和C语言代码实现)

目录 前言 几个高频面试题目 卡尔曼滤波和扩展卡尔曼滤波的区别? 算法原理 卡尔曼滤波 数据融合 数学模型 KF计算公式 KF使用说明 尔曼滤波案例——多目标跟踪 卡尔曼滤波器——预测阶段 卡尔曼滤波器——更新阶段 扩展卡尔曼滤波 EKF EKF计算公式 EKF迭代过程 …

【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…

vue中的el是指什么

简介&#xff1a; 在Vue.js中&#xff0c;el指的是Vue实例的挂载元素。 具体来说&#xff0c;el是一个选项&#xff0c;用于指定Vue实例应该挂载到哪个DOM元素上。通过这个选项&#xff0c;Vue可以知道应该从哪个元素开始进行模板编译和渲染。它可以是一个CSS选择器字符串&…

实战纪实 | 真实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 注解 构造并接收请求 接收简单参数 接收对象…

详解排序算法

文章目录 1. 排序算法分类2. 比较排序算法介绍2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序2.2.2.1 向下调整算法建堆2.2.2.2 向上调整算法建堆2.2.2.3 进行堆排序2.2.2.4 堆排序时间、空间复杂度分析2.2.2.5 利用堆排序解决TOP-…

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 动态绑…

AUTOSAR从入门到精通-车身控制系统BCM(三)

目录 前言 算法原理 什么是车身控制模块BCM 1. BCM ECU的工作原理 a. 硬件架构 b. 控制逻辑 BCM带来的好处 车身控制模块(BCM)的功用 车身控制模块(BCM)能够控制的车身功能系统 BCM的各项功能 1.1内外部灯光控制 1.2 雨刮系统 1.3 车身防盗报警系统 1.4 车锁…

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.…

windows系统如何检查是否开启了mongodb服务

windows系统如何检查是否开启了mongodb服务&#xff01;我们有很多软件开发&#xff0c;网站开发时候需要使用到这个mongodb数据库&#xff0c;下面我们看看&#xff0c;如何在windows系统内排查&#xff0c;是否已经启动了本地服务。 在 Windows 系统上&#xff0c;您可以通过…

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

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