AGG 渲染缓存(Rendering Buffer)

深入解析AGG:高性能2D图形渲染库的核心架构与应用实践 在计算机图形学领域,2D图形渲染是构建用户界面、数据可视化和嵌入式显示系统的核心技术。其基本原理是将矢量几何图元通过坐标变换、路径生成、光栅化等流程转换为像素图像,最终呈现到显示设备。这一技术对于需要高质量图形输出和跨平台兼容性的应用场景具有重要价值,尤其在资源受限的嵌入式环境或需要软件渲染的特定系统中。AGG(Anti-Grain Geometry)作为一个开源的高性能2D图形渲染库,通过模块化的流水线设计和模板元编程技术,实现了对渲染过程的极致控制与优化。它不依赖特定图形API,完全基于CPU进行高质量 阅读详情

Rendering Buffer

Rendering Buffer是一个内存块,用于保存图像数据。这是AGG与显示器之间的桥梁,我们要显示AGG图形实际上就是识别这个内存块并使用系统的API显示出来 而已(实际上几乎不需要做转换工作,因为无论是Windows还是Linux,API所用的图像存储格式与Rendering Buffer都是兼容的)。

头文件:
#include "agg_rendering_buffer.h"
类型:
rendering_buffer
构造函数:
rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride);

参数分别表示内存块指针,宽、高、每行的步幅(当步幅<0时,表示上下颠倒)

成员方法:
void attach(int8u* buf, unsigned width, unsigned height, int stride);参数与构造函数相同
int8u* buf();返回内存块指针
unsigned width() const;
unsigned height() const;
int      stride() const;
unsigned stride_abs() const;
返回宽、高、每行步幅
int8u* row_ptr(int y)返回指向第y行起点的指针
void clear(int8u value)以value值填充整个内存块
template<class RenBuf> void copy_from(const RenBuf& src)从另一rendering_buffer中复制数据
实验代码(基于此处代码)

在on_draw()方法的最后加上:

  1. agg::int8u* p = rbuf.row_ptr(20);//得到第20行指针
  2. memset(p,0,rbuf.stride_abs());//整行以0填充
得到的图形是:

AGG与GDI显示

Rendering Buffer的图像存储方式和Windows的BMP是一样的,所以让AGG处理BMP是很简单的事情,下面的代码演示了怎样在HDC上显示AGG

  1. #include <agg_rendering_buffer.h>
  2. #include <agg_pixfmt_rgba.h>
  3. #include <agg_renderer_base.h>
  4. #include <agg_rasterizer_scanline_aa.h>
  5. #include <agg_scanline_p.h>
  6. ...
  7. // 首先让系统生成一个32位的bmp缓存
  8. BITMAPINFO bmp_info;
  9. bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  10. bmp_info.bmiHeader.biWidth = width;
  11. bmp_info.bmiHeader.biHeight = height;
  12. bmp_info.bmiHeader.biPlanes = 1;
  13. bmp_info.bmiHeader.biBitCount = 32;
  14. bmp_info.bmiHeader.biCompression = BI_RGB;
  15. bmp_info.bmiHeader.biSizeImage = 0;
  16. bmp_info.bmiHeader.biXPelsPerMeter = 0;
  17. bmp_info.bmiHeader.biYPelsPerMeter = 0;
  18. bmp_info.bmiHeader.biClrUsed = 0;
  19. bmp_info.bmiHeader.biClrImportant = 0;
  20. HDC mem_dc = ::CreateCompatibleDC(hdc);
  21. void* buf = 0;
  22. HBITMAP bmp = ::CreateDIBSection(
  23.      mem_dc,
  24.      &bmp_info,
  25.      DIB_RGB_COLORS,
  26.      &buf,
  27.      0,
  28.      0
  29.      );
  30. // 把bmp与mem_dc关联,这样AGG就可以和原生GDI一起工作了
  31. HBITMAP temp = (HBITMAP)::SelectObject(mem_dc, bmp);
  32. //============================================================
  33. // 以下是AGG代码
  34. agg::rendering_buffer rbuf;
  35. // 32位位图,每行字节数为width*4。
  36. // BMP是上下倒置的,为了和GDI习惯相同,最后一个参数是负值。
  37. rbuf.attach((unsigned char*)buf, width, height, -width*4);
  38. // 像素格式和renderer_base
  39. agg::pixfmt_bgra32 pixf(rbuf);
  40. agg::renderer_base<agg::pixfmt_bgra32> renb(pixf);
  41. renb.clear(agg::rgba8(255, 255, 255, 255));
  42. // Scanline renderer
  43. agg::renderer_scanline_aa_solid<agg::renderer_base<agg::pixfmt_bgra32> > ren(renb);
  44. // Rasterizer & scanline
  45. agg::rasterizer_scanline_aa<> ras;
  46. agg::scanline_p8 sl;
  47. // 多义线(三角形)
  48. ras.move_to_d(20.7, 34.15);
  49. ras.line_to_d(398.23, 123.43);
  50. ras.line_to_d(165.45, 401.87);
  51. // 设置颜色后渲染
  52. ren.color(agg::rgba8(80, 90, 60));
  53. agg::render_scanlines(ras, sl, ren);
  54. //============================================================
  55. // 把bmp显示到hdc上,如果图片中有Alpha通道,可以使用AlphaBlend代替BitBlt。
  56. ::BitBlt(
  57.      hdc,
  58.      rt.left,
  59.      rt.top,
  60.      width,
  61.      height,
  62.      mem_dc,
  63.      0,
  64.      0,
  65.      SRCCOPY
  66.      );
  67. // 释放资源
  68. ::SelectObject(mem_dc, temp);
  69. ::DeleteObject(bmp);
  70. ::DeleteObject(mem_dc);
得到的图形是:

使用AGG提供的pixel_map类

如果你觉得上面的方法还是有点烦的话(这个要怪MS的API太麻烦),可以考虑用AGG友情提供的pixel_map类,用它操作 BMP方便多了。(要把[AGG]/src/platform/win32/agg_win32_bmp.cpp加入一起编译)

  1. #include <agg_rendering_buffer.h>
  2. #include <agg_pixfmt_rgba.h>
  3. #include <agg_renderer_base.h>
  4. #include <agg_rasterizer_scanline_aa.h>
  5. #include <agg_scanline_p.h>
  6. #include <platform/win32/agg_win32_bmp.h>
  7. ...
  8. CRect rc;
  9. GetClientRect(&rc);
  10. agg::pixel_map pm;
  11. pm.create(rc.right,rc.bottom,agg::org_color32);
  12. //============================================================
  13. // 以下是AGG代码
  14. agg::rendering_buffer rbuf;
  15. rbuf.attach(pm.buf(), pm.width(), pm.height(), -pm.stride());
  16. // 像素格式和renderer_base
  17. agg::pixfmt_bgra32 pixf(rbuf);
  18. agg::renderer_base<agg::pixfmt_bgra32> renb(pixf);
  19. renb.clear(agg::rgba8(255, 255, 255, 255));
  20. // Scanline renderer
  21. agg::renderer_scanline_aa_solid<agg::renderer_base<agg::pixfmt_bgra32> > ren(renb);
  22. // Rasterizer & scanline
  23. agg::rasterizer_scanline_aa<> ras;
  24. agg::scanline_p8 sl;
  25. // 多义线(三角形)
  26. ras.move_to_d(20.7, 34.15);
  27. ras.line_to_d(398.23, 123.43);
  28. ras.line_to_d(165.45, 401.87);
  29. // 设置颜色后渲染
  30. ren.color(agg::rgba8(80, 90, 60));
  31. agg::render_scanlines(ras, sl, ren);
  32. //============================================================
  33. pm.draw(hdc);
《 待续》

 

作者:毛毛 来源:www.cppprog.com

 

杰理接入第三方升级协议OTA教程 本教程介绍了使用dual_bank_updata_api.h接口接入第三方协议进行固件升级的方法。主要内容包括:INI配置要求(需启用双备份并强制4K对齐)、7个核心API接口功能说明及参数详解(初始化、空间检查、数据写入、校验等)、标准升级流程步骤(初始化→检查→写入→校验→引导→清理)。特别强调了4K对齐配置的重要性以避免数据丢失,并提供了被动升级流程图。该方案支持用户自定义协议接入,需严格按照流程调用接口完成升级。 阅读详情

相关推荐

C# 开发 WPS 插件实战:从环境搭建到功能实现(附完整代码)

本文提供了一份详尽的C#开发WPS插件实战指南,涵盖从环境搭建到功能实现的完整流程。通过COM技术,开发者可以创建自定义插件,为WPS Office扩展自动化功能,如文档处理与格式转换。文章包含核心概念解析、Ribbon界面集成、调试部署方法及完整代码示例,帮助开发者快速上手。

rust6ferris的博客 927

多维聚合与数据变形:构建OLAP立方体的坐标系映射引擎

多维聚合是OLAP分析的核心能力,其本质并非简单SQL分组,而是对n维数据立方体(Cube)中切片、钻取、旋转等操作的数学建模;数据变形则是在保持维度结构前提下,对聚合结果进行相对值计算、跨维排名、动态阈值标记等上下文感知的函数映射。该技术显著提升指标平台的灵活性与实时性,支撑BI报表、机器学习特征工程及业务规则驱动的智能预警等场景。本文聚焦Multi-Dimensional Aggregation与Data Manipulation在高维、高并发、强语义需求下的工程落地路径。

dglf54292的博客 575

WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)

本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。

potato的博客 567

agg的基本使用

agg 是一个可跨平台的2D绘制库,最小的库只包括一个cpp和h,地址:点击打开链接此库对于初学者还是有一定难度,可能是模版太多了吧,今天尝试使用他绘制一些基本的线测试,发现以下问题。在记录问题之前先学一下基本流程,也是官方的例子:几大对象: agg::rendering_buffer, 就是一块像素内存,一般rgb的new w*h*3,  rgba new w*h*4.             ...

CJJ的专栏 4669

3D IC中Memory-on-Logic堆叠测试的DFT解决方案与工程实践

在半导体行业,随着摩尔定律逼近物理极限,3D IC技术通过芯片垂直堆叠实现性能提升和异构集成,已成为重要发展方向。其核心原理是利用硅通孔(TSV)或微凸块实现芯片间电气互连,将多个不同功能的芯片(如逻辑芯片与存储芯片)集成在一个封装内。这项技术的核心价值在于能大幅提升系统性能、降低功耗并实现更小的封装尺寸。然而,芯片堆叠后,传统的测试方法面临巨大挑战,尤其是测试访问存在物理屏障,无法直接探测被覆盖的芯片接口。为此,可测试性设计(DFT)成为确保3D IC可靠性与量产可行性的关键技术。它通过在设计阶段植入专用

weixin_42521058的博客 632

OTFS从零开始11 10

未来的无线网络有望提供全球覆盖,因此需要支持在恶劣环境下的各种新兴应用,例如飞机上的移动通信(MCA)、低地球轨道(LEO)卫星通信、车对车(V2V)通信、高速铁路(HSR)通信、无人驾驶飞机(UAV)通信和水下声学通信(UAC)。在这些恶劣环境中的无线信道通常被视为对通信不友好,其特点是严重的延迟和多普勒扩散,以及有限的路径寿命等。这些不利于通信的特性使目前移动网络中广泛采用的正交频分复用(OFDM)调制的性能恶化。

qq_46009045的博客 9851

AGG第二十九课 agg::render_scanlines的不同

附上代码: agg::rendering_buffer &rbuf = rbuf_window();//获取渲染缓存 agg::pixfmt_bgr24 pixf(rbuf);//组成像素 typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_...

weixin_34176694的博客 240

微信中调起支付宝支付

微信中调用支付宝支付,首先我们知道微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行网页支付或打开app支付。以下为详细唤起支付宝的步骤、业务代码以及相关页面图。 如有问题欢迎评论留言,看到定回复哦^_^\(^o^)/~ 一、微信中唤起支付宝,有几个步骤: 1、中间页引导用户在浏览器中打开去唤起支付宝。 2、浏览器中打开支付宝或app中打开支付宝。 3...

han_calligrapher的博客 2万+

理解OpenGL中帧缓存FrameBuffer & 渲染缓存RenderingBuffer

操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。 帧缓存帮助我们离屏渲染,提高渲染速度 unsigned int captureFBO; glGenFramebuffers(1, &captureFBO); glBindFramebuffer(GL_FRAMEBUFFER, captureFBO); unsigned int captureRBO; glGenRenderbuffers(1, &captureRBO);

AplusX 2736

BES2700的PMU

BES2700ZP-BES2700芯片的PMU架构分析摘要:本文档分析了BES2700芯片的电源管理单元(PMU)架构。实际应用中仅需为VBAT引脚供电,其余电源均由芯片内部PMU提供。文档包含架构示意图、问题列表和参考链接,涉及PMU工作原理、外部供电要求等关键技术点。待解决问题包括具体供电参数和内部电源转换机制等。通过添加日志信息和代码片段,为开发人员提供了调试PMU功能的实用方法。

云淡风轻 117

MAX30102心率血氧传感器原理图设计,已量产(e-Health传感器)

在最近的便携健康监测设备项目中,我们采用了集成算法的 MAX30102 心率血氧模块 —— 这类带内置 MCU 算法的传感器能直接输出心率 / 血氧数值,大幅降低了主控资源占用。但硬件电路的稳定性直接决定了 PPG 信号的采集精度,下面结合实际项目里的原理图,拆解下这个模块的设计细节。

不脱发的程序猿 1278

agg::rendering_buffer 渲染缓存

这是一块保存了图形的像素点的内存,这是一块即将显示到界面的图形。这块内存保存了图形的像素点的颜色。在这里记录了每一个点的颜色。这是AGG与显示器之间的桥梁,把这块内存看成是一个二维的空间数组,就直接映射到显示器上的,内存的每一行的点,都对应屏幕上的位置点。我们要显示AGG图形实际上就是识别这个内存块并使用系统的API显示出来。(实际上不需要做任何的转换工作,因为无论是windows还是Linux,API所用的图像存储格式与Rendering Buffer都是兼容的)。 1.1 PPM介绍我...

vecloud的博客 258

如何利用Dpabi,AFNI,FSL软件计算种子点的功能连接?

fsl_glm 得到的是线性回归系数(beta coefficient),由于在自变量和因变量标准化(均值为 0,标准差为 1)的情况下,简单线性回归的回归系数和皮尔逊相关系数是相同的,因此这是一种间接的方法。(3)上一步得到的 PCC.nii.gz 文件是 Harvard-Oxford 概率模板中的后扣带回,每个体素中的数值(1-100)表示该体素属于 PCC 的概率,反映 PCC 在不同被试中的变异大小,也表示我们对于某个体素属于PCC 的信心。接下来,我们来聊聊功能连接在数据处理里的具体应用。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 7842

使用AGG 来进行GIS地图描画

准备把这个做成个系列。 大约有4-5个主题。分几个方面,主要介绍几个主流工具,今天先写一个 1     为什么要AGG和SDL?       SDL   是网络上一个有名的开源的,2维图像库,SDL的结构清晰易懂,代码结构非常紧凑。        SDL结合了alpha Blend                      bitBit               

gagechen2006的专栏 1015

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AGG第九课 agg::rendering_buffer 渲染缓存

1介绍 http://www.360doc.com/content/11/1015/09/992979_156314240.shtml http://www.cppblog.com/Shihira/archive/2012/07/24/183204.html http://www.cnblogs.com/liyiwen/archive/2010/06...

weixin_34126215的博客 107

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AGG第九课 agg::rendering_buffer 渲染缓存

1介绍http://www.360doc.com/content/11/1015/09/992979_156314240.shtmlhttp://www.cppblog.com/Shihira/archive/2012/07/24/183204.htmlhttp://www.cnblogs.com/liyiwen/archive/2010/06/03/1751094.htm...

weixin_34273479的博客 151

STM32H7S78-DK官方TouchGFX Demo源码获取与二次开发实战指南

在嵌入式开发中,官方Demo源码是快速掌握新平台硬件特性与软件框架的最佳起点。STM32H7S78-DK作为新一代高性能MCU开发板,其出厂TouchGFX界面演示涵盖图形加速、外部存储、多外设交互等核心工程实践。然而,许多开发者常因源码藏匿于官网深层链接或独立GitHub仓库而难以获取。本文从通用开发流程切入,讲解如何精准定位官方Demo源码、合理配置STM32CubeMX与TouchGFX Designer工具链版本、规避编译烧录中的经典陷阱,并延伸至基于MVC模式的UI二次开发与性能调优策略。无论你是

weixin_33796177的博客 289

AGG第四十七课 渲染抗锯齿线的宽度问题探讨

代码如下: agg::path_storage path; for (int i = 100; i < 500; i=i+100) { path.move_to(i, 100); path.line_to(i, 400); } for (int ii = 1...

weixin_34151004的博客 248

AGG学习之八----使用图案填充

装载bitmap文件,使用bitmap图案构建span生成器,对面进行填充。代码如下: #include "platform/agg_platform_support.h" #include "agg_basics.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgb.h" #include "agg_alpha_mask_u

ErikLiu的专栏 2468

(转)用AGG实现高质量图形输出(三)

线段生成器(Span Generator) 我们前面举的例子使用的都是简单的单一实色,如蓝色的圆、黑色的线等。这是因为在例子里我们一直使用renderer_scanline_aa_solid或render_scanlines_aa_solid。 在上篇文章的渲染器一节中除了renderer_scanline_aa_solid外,还提到有一个renderer_scanline_aa,这里再写一遍它的...

weixin_30371469的博客 259

开源2D图形库AGG简介

AGG(Anti-Grain Geometry),强大的2D几何图形库。

pingis58的博客 1284

AGG第四十四课 渲染问题:绘制较宽轮廓和尖锐边缘

提供展示代码: agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type; renderer_b...

weixin_34320724的博客 183

AGG第四十三课 例子image1从椭圆到矩形替换问题

I am basing my code on the p_w_picpaths1 example and I have changedthe p_w_picpath 'partner' shape from an ellipse to a rectangle.The partner rectangle comes out at X,Y and scales and rotat...

weixin_33940102的博客 189

介绍和推荐AGG

介绍和推荐AGG 最近在研发跨平台的GIS engine,GDI部分当然不能只用WINDOWS的GDI PLUS,一个跨平台的 2D Engine的选择就非常重要。网上查了N久,感觉AGG非常全面,效果也很好,而且也是跨平台的。非常适合我的问题领域。 一、AGG是什么 AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库,它的网站:...

weixin_30797027的博客 335

AGG学习之二----使用像素格式对渲染内存封装

#include "agg_rendering_buffer.h" #include "agg_basics.h" #include "platform/agg_platform_support.h" #include "agg_pixfmt_rgb.h" enum { flip_y = true, }; template void draw_black_frame(Ren &ren) { ag

ErikLiu的专栏 1727

(转)用AGG实现高质量图形输出(一)

AGG是一个开源、高效的跨平台2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 使用前AGG的准备工作 下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5 解压,后面以[AGG]表示AGG的解压目录. 把[AGG]\include加入到includ...

weixin_30955617的博客 675

AGG学习之一----直接操作渲染的内存区

看了  天秤座的唐风  对AGG文档的翻译,决定自己下载源代码、码几个example试试。   对AGG中的render_buffer讲解我就不在赘述了,http://www.cnblogs.com/liyiwen/archive/2010/06/03/1751094.html 写的非常清晰。   在使用VS2008建立测试example时,由于其官方代码要求输出PPM格式文件,而我在

ErikLiu的专栏 2822
上一篇: AGG 渲染器(Renderers)
下一篇: AGG 线段生成器(Span Generator)
bitasd
博客等级 码龄19年 11粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值