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

 

【Stata双重差分模型】双重差分DID的具体操作步骤 本案例将详细阐述如何使用双重差分法进行实证分析,并展示具体的STATA操作代码。 阅读详情

相关推荐

构建自己的哨兵数据集(以sentinel-1为例,使用SNAP软件)

通过欧洲航天官网获取哨兵数据的产品,通过SNAP软件进一步得到SAR图像(以导出图片为例)

xiaoxTai的博客 6182

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

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

dglf54292的博客 575

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 220

agg的基本使用

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

CJJ的专栏 4669

智能车视觉算法实战:十字路口与弯道拐点的精准识别

本文深入探讨了智能车视觉导航中十字路口与弯道拐点的精准识别算法。通过实战经验,详细解析了如何利用纵向巡线法生成边界数组,并从中高效提取“上拐点”与“下拐点”的关键特征。文章重点分享了提升算法鲁棒性的核心技巧,包括图像预处理、ROI设置、状态机应用及多特征融合,旨在帮助开发者实现智能车在复杂路况下从“看见”到“看懂”的稳定决策。

weixin_29061465的博客 633

机器视觉应用工程师职位深度解析与面试指南

广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。

郑伟强dev的专栏 431

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

【拼多多笔试题汇总】2024-03-24-拼多多春招笔试题

A 小镇上有个奇特的游戏。游戏开始时,A 先生准备了一排 nnn 个物品。K 小姐和卢小姐则轮流进行操作。首先,K 小姐可以选择移除至多 xxx 个物品。接着,卢小姐也可以选择移除剩余物品中的至多 yyy 个。游戏的目标是,K 小姐想尽量让剩余物品的价值之和最大化,而卢小姐则想将剩余物品的价值之和最小化。假设两人都采取最优策略,请问最后剩余物品的价值之和是多少?第一行包含五个正整数 n,m,k,x,yn, m, k, x, yn,m,k,x,y,分别表示物品的总数、K 小姐最多可移除的物品数、卢小姐最多可移

春秋招笔试突围 1万+

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

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

AplusX 2736

基于咸鱼最新九宫格图标验证码的语义增强模型识别

本文探讨了破解复杂验证码的技术思路,重点分析了某平台的九宫格验证码应对策略。作者提出通过图像语义抽取和增强技术来扩充数据集:先采集少量真实样本,利用形态学操作进行前增强生成变形图像,再通过叠加背景噪声进行后增强。同时强调真实数据集的重要性,建议采用真实+生成数据的混合训练方法。实验表明该方法可使模型准确率达到95%以上,但作者特别声明本文仅供技术研究,严禁用于非法用途。

码王吴彦祖的博客 601

点云目标检测:open3d多窗口联动可视化

多个模型之间的对比除了指标之外,还需要可以直接直观的对比可视化结果,这次介绍一下如何使用open3d同时打开两个窗口分别加载两个模型的结果进行对比,同时实现两个窗口的联动,也就是当一个窗口拖动或者缩放时另外一个窗口也跟着做同样的变换。

zhaoguanhua的博客 4688

agg::rendering_buffer 渲染缓存

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

vecloud的博客 258

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用AGG 来进行GIS地图描画

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

gagechen2006的专栏 1015

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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、付费专栏及课程。

余额充值