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.hqwc.cn/news/233409.html

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

相关文章

WEB渗透—反序列化(九)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

windows环境下载安装Nginx并配置防火墙

1、下载Nginx Nginx官网 下载稳定版 2、下载之后&#xff0c;解压 3、启动Nginx&#xff0c;命令&#xff1a;start nginx 最小化该窗口 主要&#xff0c;不要关闭&#xff0c;如果关闭&#xff0c;表示nginx服务关闭了 4、测试是否启动成功 在浏览器中输入http://localhos…

PHP在线日语学习平台

有需要请加文章底部Q哦 可远程调试 PHP在线日语学习平台 一 介绍 此日语学习平台基于原生PHP开发&#xff0c;数据库mysql。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/注销 2 个人中心 3 查看课程…

RT1020 —— BootLoader 中烧写 APP 到指定位置的方法

把数组数据放到指定的 Flash 自定义 section 中&#xff1a; 数组定义与声明&#xff1a; #define LOCATION_EXTFLASH_ATTRIBUTE __attribute__ ((section ("Myapp"))) __attribute__ ((aligned(4)))const unsigned char _aclwip_ping_bm[0x12880] LOCATION_EXTFLAS…

MySQL InnoDB Cluster

MySQL InnoDB Cluster 一、InnoDB Cluster 基本概述 MySQL InnoDB Cluster 为 MySQL 提供了一个完整的高可用解决方案。通过使用 MySQL Shell 提供的 AdminAPI,你可以轻松地配置和管理一组至少由3个MySQL服务器实例组成的 InnoDB 集群。 InnoDB 集群中的每个 MySQL 服务器实例…

河道水质在线监测系统:守护河流的生命力

随着工业和城市化的快速发展&#xff0c;水资源的污染问题日益严重。为了保障人民生活用水安全和生态环境的可持续发展&#xff0c;河道水质在线监测系统为守护河流的生命力提供了强有力的科技支持。 一、河道水质在线监测系统概述 河道水质在线监测系统是一种利用先进传感器、…

KaiwuDB 亮相中国国际供应链促进博览会

11月28日&#xff0c;全球首个以供应链为主题的国家级展会——2023 中国国际供应链促进博览会&#xff08;简称“链博会”&#xff09;在北京盛大召开。KaiwuDB 受邀亮相大会&#xff0c;向与会者展示现代数据库技术在数字科技链条中的根基作用&#xff0c;其中分布式多模数据库…

【JS Promise, Promise.all 与 async/await用法详解】

目录 PromisePromise基本使用Promise可进行连续回调Promise回调可接受入参1.工作原理 async/await总结参考文档&#xff1a; 异步 let a 0setTimeout(() > {a 1}, 1000)console.log(a) // 0此时这个延迟就成为异步执行的了&#xff0c;a值还没有变1就被使用输出&#xff0…

Halcon 协同机械手进行自动标定

流程 使用相机捕捉初始标定点位&#xff0c;记录世界坐标 在机器人示教器上基于基准点位进行其余8个点位设置&#xff0c;每次x轴偏移4 或 Y轴偏移4 对每个点位进行图像获取 编写Halcon脚本&#xff0c;获取9幅图像中点位中心的像素坐标&#xff0c;以及对应算出的…

还在愁没项目?来瞧瞧这些另类赚钱方式

客套话不多说&#xff0c;直接上案例&#xff0c;这些都是正儿八经的真实案例&#xff0c;相信大家通过这些人的案例自然能摸索整理出一套属于自己的项目&#xff01;摸索不出&#xff0c;也多多少少能受一些灵感上的启发。 小A是长期混B站的&#xff0c;大家称他为“B站搬运工…

vscode插件问题

1 Vscode code颜色变化 最外层标签颜色变成白色 其他标签有颜色&#xff0c;css代码颜色有些变成白色 是安装的另一个插件vue影响的&#xff0c;卸载就能恢复正常的颜色 2 配置Vue项目的代码片段 css 样式代码片段 配置css.json上后偶尔能用偶尔不能用&#xff0c;Vscode 右下…

css浮动属性学习

在此文&#xff0c; html菜单的基本制作-CSDN博客 已经看到css 浮动属性的效果&#xff1b;下面单独看一下浮动属性&#xff1b; 做4个div&#xff0c;设置不同的背景色&#xff0c;不为div添加float属性&#xff1b;效果如下&#xff1b; 因为div是块级元素&#xff0c;默认…