004:Direct 2D离屏渲染(Qt中实现)

简介:

    用QT开发图像显示的小程序,需要一些标注工具,由于用的是opengl渲染,所以就在内存中进行绘制,然后纹理贴图贴出去,发现Qt绘制的效果太差,且速度一般,于是就想着用direct2d来绘制需要的纹理图像。

一、QT:QPainter绘制到QImage

下图是QT直接在QImage对象上绘制的效果,其中QImage长和宽分别为:564 - 466。在打开反走样的设置下,线段和椭圆中的锯齿非常明显,字体绘制的也非常丑陋。

QT绘制代码:

void YGLayerScreen::UpdateQImage(){if (m_QImage.isNull())return;QFont m_Font;m_Font.setPixelSize(36);m_Font.setStyleStrategy(QFont::PreferAntialias);QPainter painter;if (!painter.begin(&m_QImage))return;painter.setPen(QPen(Qt::red, 1));painter.setFont(m_Font);painter.setRenderHints(QPainter::TextAntialiasing|QPainter::Antialiasing | QPainter::SmoothPixmapTransform);painter.drawEllipse(QPoint(m_TextureCol/2, m_TextureRow/2),100,200);painter.drawLine(10, 10, m_TextureCol / 2, 30);painter.drawText(QPoint(50, 50), QString::fromLocal8Bit("你好123TEXTtext"));painter.end();}

二、Direct2D绘制

QT中Direct2D的配置(非常简单),添加头文件和对应的Lib文件即可,如下:

#include <wrl.h>
#include <windows.h>
#include <d2d1.h>
#include <dwrite.h>
#include <wincodec.h>
#pragma comment(lib, "d2d1.lib")
#pragma comment(lib, "Dwrite.lib")
#pragma comment(lib, "windowscodecs.lib")

在窗口中随机绘制100个圆形和一个字符串和椭圆,代码如下:

void QtOpenGL::TestDirect2D()
{/* 统计运行时间 */LARGE_INTEGER start_counter, end_counter, counters, nFreq;QueryPerformanceFrequency(&nFreq);QueryPerformanceCounter(&start_counter);/* 离屏渲染图像的宽高 */UINT uiWidth = 512;// 1920;UINT uiHeight = 512;// 1080;/* IWIC 相关变量 */IWICBitmap *pBitmap = NULL;IWICImagingFactory* pImageFactory = NULL;/* IDWrite 相关变量 */IDWriteTextFormat *pTextFormat = NULL;IDWriteFactory* pDWriterFactory = NULL;   /* use the DrawText method */static const WCHAR msc_fontName[] = L"Verdana";static const FLOAT msc_fontSize = 50;HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IWICImagingFactory,(LPVOID*)&pImageFactory);if (SUCCEEDED(hr)) {//WICPixelFormatGUID formatGUID = GUID_WICPixelFormat32bppBGRA;hr = pImageFactory->CreateBitmap(uiWidth, uiHeight,GUID_WICPixelFormat32bppPBGRA,WICBitmapCacheOnLoad, &pBitmap);if (SUCCEEDED(hr)) {int a = 0;}}/* */hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED,__uuidof(pDWriterFactory),reinterpret_cast<IUnknown **>(&pDWriterFactory));// Create a DirectWrite text format object.hr = pDWriterFactory->CreateTextFormat(msc_fontName, NULL,DWRITE_FONT_WEIGHT_NORMAL,DWRITE_FONT_STYLE_NORMAL,DWRITE_FONT_STRETCH_NORMAL,msc_fontSize,L"", //locale&pTextFormat);pTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);pTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);ID2D1Factory *m_pD2DFactory = NULL;//ID2D1DCRenderTarget *m_pRenderTarget = NULL;hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory);if (SUCCEEDED(hr)){// Create a DC render target.D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED),0,0,D2D1_RENDER_TARGET_USAGE_NONE,D2D1_FEATURE_LEVEL_DEFAULT);ID2D1RenderTarget* m_Target = NULL;hr = m_pD2DFactory->CreateWicBitmapRenderTarget(pBitmap, &props, &m_Target);D2D1_SIZE_F rtSize = m_Target->GetSize();// Draw a grid background.int width = static_cast<int>(rtSize.width);int height = static_cast<int>(rtSize.height);ID2D1SolidColorBrush* pBlackBrush = NULL;hr = m_Target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red),//颜色&pBlackBrush//接收画刷);static const WCHAR sc_txt[] = L"你好!Direct 2D!";if (SUCCEEDED(hr)){m_Target->BeginDraw();m_Target->Clear(D2D1::ColorF(0.26f, 0.56f, 0.87f));m_Target->DrawEllipse(D2D1::Ellipse(D2D1::Point2F(150, 55), 50, 30), pBlackBrush);m_Target->DrawTextW(sc_txt, ARRAYSIZE(sc_txt) - 1,pTextFormat,D2D1::RectF(0, 0, uiWidth/2, uiHeight/2),pBlackBrush);for (int i = 0; i < 100; ++i){FLOAT left = rand() % width;FLOAT top = rand() % height;FLOAT radius = rand() % 200;pBlackBrush->SetColor(D2D1::ColorF(rand() % 100 / 100.f, rand() % 100 / 100.f, rand() % 100 / 100.f, 100));//CD2DEllipse ellipse(CD2DRectF(left, top, left + radius, top + radius));//CD2DSolidColorBrush brush(pRenderTarget, D2D1::ColorF(rand() % 100 / 100.f, rand() % 100 / 100.f, rand() % 100 / 100.f, 100));m_Target->DrawEllipse(D2D1::Ellipse(D2D1::Point2F(left, top), radius, radius), pBlackBrush);//pRenderTarget->FillEllipse(ellipse, &brush);}m_Target->EndDraw();}IWICBitmapLock *pLock = NULL;WICRect rcLock = { 0, 0, uiWidth, uiHeight };hr = pBitmap->Lock(&rcLock, WICBitmapLockWrite, &pLock);if (SUCCEEDED(hr)){UINT cbBufferSize = 0;UINT cbStride = 0;BYTE *pv = NULL;hr = pLock->GetStride(&cbStride);if (SUCCEEDED(hr)){hr = pLock->GetDataPointer(&cbBufferSize, &pv);FILE* pFile = fopen("bmp512.raw", "wb+");fwrite(pv, 1, cbBufferSize, pFile);fclose(pFile);}// Clear the image data//ZeroMemory(pv, cbBufferSize);// Release the bitmap lock.pLock->Release();}}if (pBitmap) {pBitmap->Release();}if (pImageFactory) {pImageFactory->Release();}QueryPerformanceCounter(&end_counter);counters.QuadPart = end_counter.QuadPart - start_counter.QuadPart;LONGLONG fps = nFreq.QuadPart / counters.QuadPart;LONGLONG elapsed = counters.QuadPart * 1000 / nFreq.QuadPart;qDebug() << "FPS :" << fps << "ms";qDebug() << "TIMES :" << elapsed << "ms";start_counter = end_counter;
}

 绘制效果如下:

三、性能:待测试 

由于绘制的内容不同,暂时没对性能进行测试。 

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

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

相关文章

python——第十五天

面向对象和面向对象编程 面向对象编程&#xff1a; C语言是一门面向过程的编程语言&#xff01;&#xff01;&#xff01; 面向对象的编程思想 就是分门别类的一种能力 面向对象的概念 类&#xff1a; 对一类事物的统称 对象&#xff1a; 一类事物中的具体案例 面向对象的…

python之pyqt专栏8-信号与槽4

信号重载 在上一篇python之pyqt专栏7-信号与槽3-CSDN博客&#xff0c;我们知道在自定义信号时&#xff0c;可以设定信号参数数据类型。pyqt还支持信号重载。 信号定义 sendText pyqtSignal([int],[str]) 代码意思是定义重载信号sendText&#xff0c;槽函数的参数可以是int数…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

postman打开白屏

现状&#xff1a;postman打开白屏如下图 window环境变量&#xff1a; Win R 快捷键打开 sysdm.cpl 增加环境变量&#xff1a; 变量名&#xff1a;POSTMAN_DISABLE_GPU 值&#xff1a;true 重新打开postman

不用第三方软件实现停止windows10/11更新

第一步&#xff1a;打开regedit 1&#xff1a;键盘按下winR输入regedit 2&#xff1a;按下图顺序选择 3&#xff1a;右击settings新建DWORD【32位】值 输入FlightSettingsMaxPauseDays 然后右击修改值选择十进制输入4000代表可以延迟4000天就是10年多 然后打开设置 一直…

网络运维与网络安全 学习笔记2023.11.29

网络运维与网络安全 学习笔记 第三十天 今日更新太晚啦&#xff01;&#xff01;&#xff01; 主要是今天工作时挨了一天骂&#xff0c;服了&#xff0c;下次记得骂的轻一点&#xff01;&#xff01;&#xff01; &#xff08;要不是为了那点微薄的薪资&#xff0c;谁愿意听你…

文件fd【Linux系统编程】

本文是基础IO的第一个部分&#xff0c;基础IO部分将主要讲解以下内容&#xff1a;文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd&#xff0c;其余内容将在后面的博客更新。 一、共识 文件 内容 属性 文件分为打开了的文件和没打开的文件。…

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

血的教训--kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】

血的教训–kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】 最近下载了一个2023版本的kail系统&#xff0c;但是经过几次设置免密后&#xff0c;ssh过去一直让提供密码&#xff0c;所以就仔细的分析了一下&#xff0c;果然还是发现了点猫腻 接上一个博客&#xff0c;大…

CSS新手入门笔记整理:CSS边框样式

边框宽度&#xff1a;boder-width 语法 boder-width:像素值&#xff1b; 边框样式&#xff1a;boder-style 语法 boder-style:取值&#xff1b; 属性值 说明 none 无样式 dashed 虚线 solid 实线 边框颜色&#xff1a;boder-color 语法 boder-color:色值&#xf…

Mysql之子查询(知识点+例题)

Mysql之子查询<知识点例题> 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充&#xff1a;聚合函数与GROUP BY的使用关系 CASE表达式&#xff08;子查询中的运用&#xff09;简单CASE表达式搜索CASE表达…

电脑突然死机怎么办?教你几招快速拯救

当今社会&#xff0c;电脑成为我们日常生活和工作不可或缺的一部分。然而&#xff0c;有时电脑可能会突然死机&#xff0c;给我们的操作和数据带来不便。那电脑突然死机怎么办呢&#xff1f;本文将介绍解决电脑突然死机的三种方法&#xff0c;通过详细的步骤指南&#xff0c;帮…

类 —— 继承、多重继承

继承 一个类&#xff0c;继承另一个已有的类。&#xff08;在一个已存在的类的基础上建立一个新的类&#xff0c;并拥有其特性&#xff09; 是一个父类&#xff08;基类&#xff09;派生出子类&#xff08;派生类&#xff09;的过程。 派生类往往是基类的具象化&#xff0c;基…

接口测试之测试原则、测试用例、测试流程......

一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&#xff08;API&#xff09;。 接口&#xff08;API&#xff09;是系统与系统之间&#xff0c;模块与模块之间或者…

异常数据检测 | Python实现oneclassSVM模型异常数据检测

支持向量机(SVM)的异常检测 SVM通常应用于监督式学习,但OneClassSVM[8]算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 OneClassSVM OneClassSVM的思想来源于这篇论文[9],SVM使用…

unity UGUI中获取点击位置处的URL链接

需求是&#xff0c;我们在一个text组件中像写网页那样写入链接&#xff0c;然后点击这个链接&#xff0c;就能访问配置的网页啥的。比如&#xff1a; <a href"hello">链接文本</a></summary> 最终的效果如下&#xff1a; 图中&#xff0c;image区…

华为智能手表独立导航,一呼即应轻松畅行

PetalMaps 手表独立导航&#xff0c;一声令下唤醒导航&#xff0c;打造了智慧的语音交互唤醒体验功能。导航时&#xff0c;语音播报、变道震动提醒功能&#xff0c;让您尽情体验腕上导航乐趣&#xff0c;同时又能安全抵达目的地。

通过滴滴技术博客:探寻造成此次P0故障的真正原因

2023年11月27日晚至2023年11月28日早晨&#xff0c;滴滴发生了长达12小时的P0级故障&#xff0c;导致滴滴核心业务都受到了影响&#xff0c;比如不显示定位无法打车、滴滴单车无法扫码等问题&#xff0c;期间滴滴进行了多次致歉 目前问题故障已经恢复&#xff0c;根据最新的消息…

Python使用pywebview开发桌面应用:打造现代化、跨平台的用户体验

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今科技快速发展的时代&#xff0c;为了提供更好的用户体验&#xff0c;许多应用程序都转向了桌面应用的开发。在Python领域&#xff0c;pywebview是一款优秀的库&#xff0c;它使得用Web技术开发桌面应用变得…

flask中路由route根据字典ID展示部分内容,字典名展示全部内容

from flask import Flask, jsonify , request,render_template,app Flask(__name__)app.config[JSON_AS_ASCII] Falsebooks [{"id": 1, "name": 三国演义},{"id": 2, "name": 水浒传},{"id": 3, "name": 西游记…