C++系列——Direct2D进行图片处理

2024-09-02 20:36

本文主要是介绍C++系列——Direct2D进行图片处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++系列——Direct2D图片处理

01 前言

图片处理工具多如牛毛了,自不必说。主要是应对需要批量处理的场景,所以不如手搓。已经试过直接用C#封装好的库System.Drawing,挺好的,就是过了一段时间感觉这速度有点受不了。于是转用C++,结合GDI+又手搓了一个。因为部分代码与C#版本类似(C#底层用的还是GDI),很快也搞好了。
嗯~~ 这下舒服了。随着效率的提高,我以为可以快乐的摸鱼了。省下来的时间里,突然想到——有没有可能利用上GPU的性能再提高一下?于是与Direct2D偶遇了,有人说这玩意比GDI+更快,还可以利用GPU的优势。什么?总以为这玩意就是做游戏开发的,这辈子可能都接触不到的……
于是,新的活又来了——继续搓。
因为需求只是想简单的做图片处理,比如复制图片,然后加点文字、形状等等,然后保存输出。但是似乎这么玩的人比较少(或者可能是用Direct2D的人比较少),资料比较少。没办法只能结合官方的文档慢慢踩坑了。
第一步,我只想简单地从磁盘读取一个PNG图片,然后再画一个矩形,然后再另存为一张图。就这么一个简单的需求,不需要显示到窗口什么的,就单纯的图片处理,都没找到一个比较完整可用的例子(我菜我承认 )。
由于半桶水的水平,摸索了大半天才搞出来一个例子,供学习参考。

02 正文

开发环境:

Windows 11 64 bit
Microsoft Visual Studio Community 2022
C++ 14

VS编辑器,怎么创建项目不用多说了。
就直接写在主文件中。代码如下:

// ImgTool.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <windows.h>
#include <d2d1.h>
#include <d2d1_1.h>
#include <wincodec.h>//表示链接XXXX.lib这个库。
//和在工程设置里写上链入wpcap.lib的效果一样(两种方式等价,或说一个隐式一个显式调用)
//不过这种方法写的 程序别人在使用你的代码的时候就不用再设置工程settings了。
//告诉连接器连接的时候要找XXX.lib,这样你就不用在linker的lib设置里指定这个lib了。
#pragma comment(lib, "d2d1.lib")
#pragma comment(lib, "windowscodecs.lib")using namespace std;/// <summary>
/// 释放 COM 接口指针
/// https://learn.microsoft.com/zh-cn/windows/win32/medfound/saferelease
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ppT"></param>
template <class T> void SafeRelease(T** ppT)
{if (*ppT){(*ppT)->Release();*ppT = NULL;}}/// <summary>
/// 导入图片,转换成direct2d的图像对象:ID2D1Bitmap
/// </summary>
/// <param name="pRenderTarget"></param>
/// <param name="pIWICFactory"></param>
/// <param name="resourceName"></param>
/// <param name="ppBitmap"></param>
/// <returns></returns>
HRESULT LoadResourceBitmap(ID2D1RenderTarget* pRenderTarget,IWICImagingFactory* pIWICFactory,PCWSTR resourceName,ID2D1Bitmap** ppBitmap
)
{IWICBitmapDecoder* pDecoder = NULL;IWICBitmapFrameDecode* pSource = NULL;IWICFormatConverter* pConverter = NULL;//直接从文件,比fromStream方便一点,不需要处理那么多步HRESULT hr = pIWICFactory->CreateDecoderFromFilename(resourceName, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder);if (SUCCEEDED(hr)){// Create the initial frame.hr = pDecoder->GetFrame(0, &pSource);}else {std::cout << "pDecoder->GetFrame fail..." << std::endl

这篇关于C++系列——Direct2D进行图片处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131004

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则