当前位置: 首页 > article >正文

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_WICPixelFormat32bppPBGRA
		m_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 动图。

原文地址:https://blog.csdn.net/DGAF2198588973/article/details/145387627
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/523467.html

相关文章:

  • 求解旅行商问题的三种精确性建模方法,性能差距巨大
  • android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色
  • woocommerce独立站与wordpress独立站的最大区别是什么
  • 每日OJ_牛客_小红的子串_滑动窗口+前缀和_C++_Java
  • 实验二 数据库的附加/分离、导入/导出与备份/还原
  • XCTF Illusion wp
  • 【C++动态规划 状态压缩】2741. 特别的排列|2020
  • 在FreeBSD下安装Ollama并体验DeepSeek r1大模型
  • 循序渐进kubernetes-RBAC(Role-Based Access Control)
  • Vue.js Vuex 持久化存储(持久化插件)
  • 【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解
  • 小阿卡纳牌
  • Python 数据分析 - 初识 Pandas
  • Git Bash 配置 zsh
  • webpack 打包自己的--windows
  • 乌兰巴托的夜---音乐里的故事
  • Redis部署方式全解析:优缺点大对比
  • 2025.1.26——1400
  • Winform如何取消叉号,减号和放大(两种)
  • Linux文件基本操作