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

深入探索AGG开源2D图形绘制引擎 AGG(Anti-Grain Geometry)是一个高性能的开源二维图形绘制引擎,它在图形处理领域因其高效的渲染能力及跨平台兼容性而闻名。AGG特别适合于需要高清晰度图形输出的应用程序,如打印输出、矢量图形编辑器和各种图形用户界面。 阅读详情

来自http://www.cppprog.com/2009/0816/146.html

 

AGG是一个开源、高效的跨平台2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+)

 

使用前AGG的准备工作

  1. 下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5
  2. 解压,后面以[AGG]表示AGG的解压目录.
  3. 把[AGG]/include加入到include搜索目录中
  4. 把[AGG]/src里所有cpp加入到项目中(或者用makefile一起编译)
  5. 另外,AGG还有一些其它组件,用到时也要把它们(都是些.h和.cpp文件)加入项目:
    • 如果要用AGG的控件和窗体,要加入[AGG]/src/ctrl/*.cpp和[AGG]/src/platform/<OS>/*.cpp,头文件在[AGG]/include/ctrl和[AGG]/include/platform里
    • 如果要用到TrueType字体显示,要加入[AGG]/font_win32_tt目录下的源码和头文件。利用freetype库,则是[AGG]/font_freetype目录。
    • 如果要用到Generic Polygon Clipper库(一个区域剪裁计算库),加入[AGG]/gpc目录下的源码和头文件。

AGG图形显示原理见下图:

其中:

  1. Vertex Source 顶点源,里面存放了一堆2D顶点以及对应的命令,如"MoveTo"、"LineTo"等。
  2. Coordinate conversion pipeline 坐标转换管道,它可以变换Vertex Source中的顶点,比如矩阵变换,轮廓提取,转换为虚线等。
  3. Scanline Rasterizer 把顶点数据(矢量数据)转换成一组水平扫描线,扫描线由一组线段(Span)组成,线段(Span)包含了起始位置、长度和覆盖率(可以理解为透明度)信息。AGG的抗锯齿(Anti-Aliasing)功能也是在这时引入的。
  4. Renderers 渲染器,渲染扫描线(Scanline)中的线段(Span),最简单的就是为Span提供单一颜色,复杂的有多种颜色(如渐变)、使用图像数据、Pattern等。
  5. Rendering Buffer 用于存放像素点阵数据的内存块,这里是最终形成的图像数据。
要理解AGG的工作原理,先看一段代码:
  1. #include "agg_basics.h"
  2. #include "agg_rendering_buffer.h"
  3. #include "agg_rasterizer_scanline_aa.h"
  4. #include "agg_scanline_u.h"
  5. #include "agg_renderer_scanline.h"
  6. #include "agg_pixfmt_rgb.h"
  7. #include "platform/agg_platform_support.h"
  8. #include "agg_ellipse.h"
  9. #include "agg_conv_contour.h"
  10. #include "agg_conv_stroke.h"
  11.  
  12. class the_application : public agg::platform_support
  13. {
  14. public:
  15.     the_application(agg::pix_format_e format, bool flip_y) :
  16.         agg::platform_support(format, flip_y)
  17.     {
  18.     }
  19.  
  20.     virtual void on_draw()
  21.     {
  22.         //Rendering Buffer
  23.         agg::rendering_buffer &rbuf = rbuf_window();
  24.         agg::pixfmt_bgr24 pixf(rbuf);
  25.        
  26.         // Renderers
  27.         typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;
  28.         renderer_base_type renb(pixf);
  29.  
  30.         typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderer_scanline_type;
  31.         renderer_scanline_type rensl(renb);
  32.        
  33.         // Vertex Source
  34.         agg::ellipse ell(100,100,50,50);
  35.        
  36.         // Coordinate conversion pipeline
  37.         typedef agg::conv_contour<agg::ellipse> ell_cc_type;
  38.         ell_cc_type ccell(ell);
  39.        
  40.         typedef agg::conv_stroke<ell_cc_type> ell_cc_cs_type;
  41.         ell_cc_cs_type csccell(ccell);
  42.        
  43.         // Scanline Rasterizer
  44.         agg::rasterizer_scanline_aa<> ras;
  45.         agg::scanline_u8 sl;
  46.        
  47.         // Draw
  48.         renb.clear(agg::rgba8(255,255,255));
  49.         for(int i=0; i<5; i++)
  50.         {
  51.             ccell.width(i*20);
  52.             ras.add_path(csccell);
  53.             rensl.color( agg::rgba8(0,0,i*50));
  54.             agg::render_scanlines(ras,sl,rensl);
  55.         }
  56.     }
  57. };
  58.  
  59. int agg_main(int argc, char* argv[])
  60. {
  61.     the_application app(agg::pix_format_bgr24, false);
  62.     app.caption("AGG Example. Anti-Aliasing Demo");
  63.  
  64.     if(app.init(600, 400, agg::window_resize))
  65.     {
  66.         return app.run();
  67.     }
  68.     return -1;
  69. }

编译这段代码的方法是(以VC为例):

  1. 新建空白GUI项目(就是有WinMain的项目)
  2. 把[AGG]/src里所有*.cpp加入到项目中
  3. 把[AGG]/src/platform/Win32/*.cpp加入到项目中
  4. Ctrl+C/Ctrl+V 上面的代码
  5. 编译!

显示效果:

 

我们先不管agg_main及agg::platform_support的问题,实际上agg::platform_support只是AGG给我们方便显示AGG图形用的,真正应用时几乎不会用到(后面会讲到怎样把AGG图形画到HDC上)。

现在我们只需要知道这个框架可以生成一个窗体,当窗体重画时会调用virtual void on_draw()就行了。

现在直接从on_draw()开始看

  1. 通过rbuf_window()方法得到一个agg::rendering_buffer,它就是“Rendering Buffer”,是一块用于存放图像的内存块。通过pixfmt_bgr24包装,我们就可以以像素为单位存取图像。
  2. agg::renderer_base和agg::renderer_scanline_aa_solid都属于"渲染器Renderer"。renderer_base为底层渲染器,它支撑起所有的高层渲染器。这里的renderer_scanline_aa_solid就是一个高层渲染器。
  3. agg::ellipse是“顶点源Vertex Source”,这个顶点源呈现的是一个圆形。
  4. agg::conv_contour和agg::conv_stroke作为“坐标转换管道Coordinate conversion pipeline”,conv_contour扩展轮廓线,conv_stroke只显示轮廓线(如果没有conv_stroke就会显示实心圆,可以去掉试试)。
  5. agg::rasterizer_scanline_aa<>就是“Scanline Rasterizer”啦。
  6. agg::render_scanlines函数执行这个AGG工作流程。
高性能开源2D图形库agg-2.5完整解析与实战 Anti-Grain Geometry(AGG)是一个开源的、高性能的C++二维图形渲染库,专注于高质量矢量图形的抗锯齿绘制。它不依赖于特定的显示设备或操作系统,具备高度可移植性,广泛应用于嵌入式系统、工业控制界面及自定义UI框架中。对于短生命周期对象(如vertex_cmd),AGG提供连接自定义内存池,实现O(1)分配:char* pool;配合RAII智能指针,可实现高效且安全的对象生命周期管理。 阅读详情

相关推荐

用AGG实现高质量图形输出.pdf

1 使用AGG的准备工作 1 2 AGG图形显示原理见下图: 1 3 要理解AGG的工作原理,先看一段代码: 2 4 顶点源(Vertex Source) 5 4.1 头文件 5 4.2 类型 5 4.3 画一条简单的箭头直线(基于此处代码) 6 4.4 自定义一个顶点源(基于此处代码) 7 5 Coordinate conversion pipeline 坐标转换管道 9 5.1 变换矩阵(trans_affine) 10 5.1.1 头文件 10 5.1.2 类型 10 5.1.3成员变量 10 5.1.4 成员方法 10 5.1.5 实验代码(基于此 处代码) 10 5.2 坐标转换管道 11 5.2.1 头文件 11 5.2.2 类型(演示程序基于基于此处代码) 12 6 Scanline Rasterizer 15 6.1 扫描线Scanline 15 6.1.1 头文件 15 6.1.2 类型 15 6.1.3 成员类型 15 6.1.4 成员方法 16 6.2 Rasterizer 16 6.2.1 头文件 16 6.2.2 类型 16 6.2.3 成员方法 16 7 Renderers 渲染器 17 7.1 Scanline Renderer 17 7.1.1 头文件 17 7.1.2 类型 17 7.1.3 实验代码(基于此 处代码) 18 7.2 Basic Renderers 19 7.2.1头文件 19 7.2.2类型 19 7.2.3 构造函数 19 7.2.4 成员方法 19 7.2.5 实验代码(基于此 处代码) 20 7.3 PixelFormat Renderer 20 7.3.1 头文件 21 7.3.2 类型 21 7.3.3 构造函数 21 7.3.4 类型定义 21 7.3.5 成员方法 21 7.3.6 实验代码(基于此 处代码) 22 8 Rendering Buffer 22 8.1 头文件: 22 8.2 类型: 22 8.3 构造函数: 22 8.4 成员方法: 23 8.5 实验代码(基于此处代码) 23 9 AGG与GDI显示 23 10 使用AGG提供的pixel_map类 26 11 线段生成器(Span Generator) 27 12 图案类线段生成器 28 12.1头文件 28 12.2类型 28 12.3 示例代码,使用span_image_filter_rgb_bilinear_clip 29 13 插值器Interpolator 31 13.1 头文件 31 13.2 类型 31 13.3实验代码,使用span_interpolator_persp_lerp 32 14 变换器Transformer 33 14.1 头文件 33 14.2 类型 33 14.3 实验代码,使用trans_warp_magnifier 33 15 图像访问器Image Accessor 34 15.1 头文件 34 15.2 类型 34 15.3 实验代码 35 16 图像过滤器(Image Filter) 36 16.1 头文件 36 16.2 类型 36 16.3 实验代码 37 17 色彩类线段生成器 37 17.1 头文件 37 17.2 类型 38 17.3 示例代码 38 18 渐变颜色 40 18.1 实验代码,使用std::vector实现多颜色渐变 40 18.2 gradient_lut 41 18.2.1 头文件 41 18.2.2 类声明 41 18.2.3 实验代码,使用gradient_lut实现多颜色渐变 41 19 渐变方式 42 20其它色彩类的线段生成器 43 21 组合类线段生成器 44 21.1 头文件 44 21.2 类型 44 21.3 演示代码 45 22 AGG的字符输出 47 22.1 方式一、使用gsv_text对象 47 22.2 方式二、使用字体引擎(Font Engine) 50 22.2.1 头文件 50 22.2.2 类型 50 22.2.3 成员类型 51 22.2.4 成员属性 51 22.2.5 成员方法 51 22.2.6示例代码1 - 从顶点源层输出文字 52 22.2.7 示例代码2 - 从Scanline Rasterizer层输出文字 53 22.3 方式三、使用FreeType 54 22.4 方式四、字体缓存管理器(font_cache_manager) 55 22.4.1 头文件 55 22.4.2 类型 55 22.4.3 成员方法 55 22.4.4 示例代码1-作为Rasterizer渲染: 56 22.4.5 示例代码2-作为顶点源渲染: 57 23 小结 58

从truetype字体中提取符号

做gis的朋友对地图符号并不陌生,地图上的各种要素正是由于有了符号而变得绚丽多彩。我这里要说的符号是指的点符号。     用过mo、ae、等gis平台做二次开发的都知道,在设置点状要素symbol的时候,都有一种symbol类型为truetype symbol,有一个font的属性来指定truetype字体,并有一个charactorIndex的属性用来指定符号的索引号,通过这两个属性即可得到一

cheunjq的专栏 1379

用AGG实现高质量图形输出.zip

用AGG实现高质量图形输出.zip,AGG图像引擎介绍

pandas学习笔记—agg()函数详解

目录1、agg()函数定义2、举例2.1 简单的列或行统计2.2 自定义统计函数2.3 先groupby()再agg() 1、agg()函数定义 agg()函数是聚合函数, DataFrame.agg(func,axis = 0,* args,** kwargs ) @@@func : 实现某种统计功能的函数,如果要不同列用求不同统计量,则用字典{‘行名/列名’,‘函数名’}指定。 2、举例 2.1 简单的列或行统计 import pandas as pd import numpy as np df1=pd

sunmingyang1987的博客 4万+

手把手教你用STM32CubeMX和HAL库驱动DW3000:从SPI配置到第一个测距Demo

本文详细介绍了如何使用STM32CubeMX和HAL库驱动DW3000 UWB定位通信模块,从SPI配置到实现厘米级测距Demo的全过程。涵盖硬件连接、SPI通信调试、驱动移植及双向测距(TWR)算法实现,帮助开发者快速掌握UWB高精度定位技术,适用于仓储物流、智能家居等场景。

weixin_27038245的博客 485

射频工程师必须了解的S参数四项要点

本文围绕单端 6 英寸走线的 S 参数展开深入分析,核心包含四项关键要点:低频下导线电学长度远小于信号波长,S11 呈大负分贝值、S21 接近 0 分贝;端口与走线的阻抗不匹配引发反射叠加,形成 S11 首个峰值(对应传输线四分之一波长频率);S21 相位可作为一致性检查依据,其 90° 相位差与 S11 峰值吻合;理想建模中 S11 峰值随频率上升因损耗下降,实际测量因连接器等阻抗不连续性,S11 会出现振荡上升。分析依托 Keysight ADS 工具与电磁求解器原理,为 S 参数解读提供科学支撑。

一只豌豆象的博客 1284

详解Pandas聚合函数agg

func: 用于聚合数据的函数,如max()、mean()、count()等,函数必须满足传入一个DataFrame能正常使用,或传递到DataFrame.apply()中能正常使用。本文介绍的聚合函数为DataFrame.aggregate(),别名DataFrame.agg(),aggregate()和agg()是同一个函数,仅名字不同。在agg()中,可以用列表的方式传入多个函数,会将这些函数在每一列的执行结果聚合到一个DataFrame中,结果DataFrame中的索引为对应的函数名。

金戈鐡馬 4205

Carsim和Matlab/Simulink联合仿真时Carsim匹配不到Matlab的解决方法

      本人使用Carsim和Matlab/Simulink联合仿真做过用机器学习方法解决ACC和简单换道的仿真,曾将8.02 2016 2018三个版本Carsim反复安装N次,有相同方向的同学或安装过程遇到问题的同学可以加本人qq505625869一起交流经验心得。 一.前言       Carsim是一款很好的联合仿真软件,使用Carsim,可以避免搭建很多非常复杂的动力学模型

Kaikai_Liao的博客 8766

【Python】Pandas中的宝藏函数-agg()

利用agg()函数可以进行更灵活的聚合操作Pandas中的的agg()函数为aggregate的缩写,总数、合计、聚合的意思,是一个功能非常强大的函数,在Pandas中可以利用agg()对...

fengdu78的博客 1万+

手把手教你用CsvView分析大疆无人机飞行日志(附实战CTF题解)

本文详细介绍了如何使用CsvView工具分析大疆无人机飞行日志,包括环境搭建、日志提取、核心功能解析及CTF实战技巧。通过实战案例,帮助读者掌握无人机取证的关键技术,提升日志分析能力,特别适合网络安全竞赛和实际取证场景。

weixin_42652674的博客 455

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 120

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

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

weixin_30955617的博客 675

Unity开发抖音小游戏存储的几种方法分析

前段时间写小游戏为了省事一直就没有研究抖音小游戏的存储方案,一直使用的是unity中的PlayerPrefs去做的存储,但是后来发现官方会一直提醒让使用抖音sdk中的新文件存储系统,从而降低内存占用。

类人_猿的博客 2533

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

来自http://www.cppprog.com/2009/0821/150.html 上次讲了AGG的显示原理并举了一个简单的例子,这一篇文章开始讲AGG工作流程里的每个环节。为了方便对照,再放一次AGG显示流程 图  另外,上 一篇文章里的例 程也 很重要,后面的例子都将基于这个代码。下面,我们来考察AGG显示流程中的每个环节。理解每个环节最好的方法是编写实验代码,

bitasd的专栏 2238

AutoSAR系列讲解(实践篇)12.1-Diagnostics简介

主要概括性的讲解了诊断协议UDS和AutoSAR的诊断架构

雪云飞星的博客 1万+

自动驾驶领域自动化数据标注应用

自动驾驶领域自动化数据标注应用 1. 背景介绍 1.1 自动驾驶技术的发展 自动驾驶技术近年来取得了长足的进步,吸引了众多科技公司和传统车企的投入。自动驾驶系统需要感知周围环境、做出决策并控制车辆,是一个极具挑战的任务。其中,环境感知是自

AI天才研究院 2214

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

      线段生成器 (Span Generator) 我们前面举的例子使用的都是简单的单一实色,如蓝色的圆、黑色的线等。这是因为在例子里我们一直使用 renderer_scanline_aa_solid 或 render_scanlines_aa_solid 。 在上  线段生成器(Span Generator)我们前面举的例子使用的都是简单的单一实色,如蓝色的圆、黑色的线等。这是

bitasd的专栏 2060

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

开源2D图形库AGG研究(一)

      AGG(Anti-Grain Geometry),强大的2D几何图形库。因为GDI+的一些缺陷(不能跨平台,某些应用场合精度差),我一直在寻求可以替换gdi+绘图组件的方案,最终我选择了AGG,提供亚像素精度显示效果,反锯齿效果超好,跨平台,代码精致亦适合嵌入式开发。网上关于2D图形库的组件非常多,类似的还有GOOGLE PICASSO,CAIRO(firefox底层采用的渲染器),Q

bitasd的专栏 3215

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

本文介绍了 AGG 输出字符的几种方法:自带的 gsv_text 对象、 WinAPI 字体引擎、 FreeType 字体引擎以及字体缓存管理器。并简单介绍了 FreeType 在 VC 和 C++Builder 里的编译方法。 AGG 的字符输出本文介绍了AGG输出字符的几种方法:自带的gsv_text对象、WinAPI字体引擎、FreeType字体引擎以及字体缓存管理器。并简单介绍了 Free

bitasd的专栏 1778

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

AGG概述

 一、AGG是什么AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库,它的网站:http://www.antigrain.com/。二、?GG的特点?AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,我至少在Windows、Wince、Linux三个台平上

zengwh的专栏 6325

开源2D图形库AGG简介

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

pingis58的博客 1284

Agg vs. Cairo 二维绘图引擎之比较和选择

<br />Agg vs. Cairo 二维绘图引擎之比较和选择<br />cheungmine<br />当今时代对于作为二维图形软件开发者, 是幸运的。因为除了Windows GDI/GDI+之外,我们还有很多其他的选择。而且这些选择除了能跨平台之外,性能上与原始GDI/GDI+相比,都不逊色。<br /><br /> 如果不考虑绘图的效果,使用Win32 GDI函数直接绘图的效率大约是同样的GDI Plus的10倍以上。为了反走样的美观,只有牺牲效率了。老式的程序还在使用GDI绘图,不是这些程序不想

恒 1万+
上一篇: android中获取手机分辨率
下一篇: 用AGG实现高质量图形输出(二)
bitasd
博客等级 码龄19年 11粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值