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

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

来自http://www.cppprog.com/2009/0821/150.html

上次讲了AGG的显示原理并举了一个简单的例子,这一篇文章开始讲AGG工作流程里的每个环节。为了方便对照,再放一次AGG显示流程 图

 

agg显示流程

 

另外,上 一篇文章里的例 程也 很重要,后面的例子都将基于这个代码。

下面,我们来考察AGG显示流程中的每个环节。理解每个环节最好的方法是编写实验代码,建议先参照这里建 立一个可以运行的AGG实验环境。

顶点源(Vertex Source)

<!--基本属性-->

顶点源(Vertex Source)

顶点源是一种可以产生多边形所需要的“带命令的顶点”的对象。比如三角形顶点源,就应该会产生一个带“MoveTo”命令的点,另外二 个带"LineTo"命令的点和最终闭合的“ClosePoly”命令。

头文件
#include <agg_path_storage.h> //path_storage
#include <agg_ellipse.h>  // ellipse
#include <agg_arc.h> // arc
#include <agg_arrowhead.h> // arrowhead
#include <agg_curves.h> // curve3, curve4
#include <agg_gsv_text.h> // gsv_text, gsv_text_outline
#include <agg_rounded_rect.h> // rounded_rect
...
类型
自定义类所有实现了void rewind(unsigned path_id);和unsigned vertex(double* x, double* y);的类。
ellipse圆,输入为中心点坐标和XY轴半径,本文所用的例子就 使用了这个顶点源
arc弧线,输入为中心点坐标和XY轴半径,以及起始和终止角(rad),顺时针/逆时针方向
curve3贝塞尔曲线,输入为起点坐标、第一控制点坐标、终点点坐标
curve4贝塞尔曲线,输入为起点坐标、第一控制点坐标、第二控制点坐标、终点坐标
gsv_text使用AGG自带字模的文字输出(只支持ASCII码),使用start_point方法指定文字位置,text方法指定 文字,flip指定是否上下倒转,size指定文字大小,适合与conv_stroke或gsv_text_outline配合。
gsv_text_outline<>可变换文字,输入为gsv_text和变换矩阵(默认为trans_affine,后文会提到)。width方法设置文 字宽度
rounded_rect圆角方形,输入为左上角右下角坐标和圆角半径
path_storage路径存储器,可以用join_path方法加入多个顶点源。而且path_storage本身支持move_to, line_to,curve和arc_to等画线功能
arrowhead箭头,它是作为标记点来用的

其中的arrowhead颇为特殊,它一般作为线段的标记点,具体用法是这样的:

arrowhead ah;
ah.head(d1,d2,d3,d4); //定义箭头
ah.tail(d1,d2,d3,d4); //定义箭尾
VertexSource VS; //其它顶点源
// 使用顶点转换器,并指定Markers类型为vcgen_markers_term
// 顶点转换器可以是conv_dash、conv_stroke或conv_marker_adaptor,见后文《坐标转换管道》
// vcgen_markers_term:以端点作为标记点
conv_stroke<VertexSource, vcgen_markers_term> csVS(VS);
...draw_term
// 用conv_marker指定ah作为线段marker点的标记
conv_marker<vcgen_markers_term, arrowhead> arrow(csVS.markers(), ah);
ras.add_path(csVS);
ras.add_path(arrow); //marker要紧随其后加入
...render

ah.head()和ah.tail()方法中的d1,d2,d3,d4参数的意义见下图

arrowhead
例,画一条简单的箭头直线(基于此处代码)

在on_draw()方法最后加上下列代码:

  1. agg::arrowhead ah;
  2.  ah.head(0,10,5,5);
  3.  ah.tail(10,10,5,5);
  4.  // 用path_storage生成一条直线
  5.  agg::path_storage ps;
  6.  ps.move_to(160,60);
  7.  ps.line_to(100,100);
  8.  // 转换
  9.  agg::conv_stroke<agg::path_storage, agg::vcgen_markers_term> csps(ps);
  10.  agg::conv_marker<agg::vcgen_markers_term, agg::arrowhead>
  11.      arrow(csps.markers(), ah);
  12.  // 画线
  13.  ras.add_path(csps);
  14.  agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,0));
  15.  // 画箭头
  16.  ras.add_path(arrow);
  17.  agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
得到的图形是:
arrow demo

注意要加头文件:

#include "agg_conv_marker.h"
#include "agg_arrowhead.h"
#include "agg_path_storage.h"
#include "agg_vcgen_markers_term.h"
试验代码,自定义一个顶点源(基于此处代码)

为了对顶点源有更深入的了解,我们要自己实现一个顶点源,这个顶点源只是很简单的一个三角形。

前面说过,只要实现了 void rewind(unsigned path_id); 和 unsigned vertex(double* x, double* y); 方法就可以作为顶点源。

rewind方 法指示顶点源回到第一个顶点;vertex方 法取出当前顶点然后把当前顶点下移,返回值是当前顶点所带的命令。所谓的命令是一个enum path_commands_e类 型,定义如下:

  1. enum path_commands_e
  2. {
  3.     path_cmd_stop     = 0,        //----path_cmd_stop   
  4.     path_cmd_move_to  = 1,        //----path_cmd_move_to
  5.     path_cmd_line_to  = 2,        //----path_cmd_line_to
  6.     path_cmd_curve3   = 3,        //----path_cmd_curve3 
  7.     path_cmd_curve4   = 4,        //----path_cmd_curve4 
  8.     path_cmd_curveN   = 5,        //----path_cmd_curveN
  9.     path_cmd_catrom   = 6,        //----path_cmd_catrom
  10.     path_cmd_ubspline = 7,        //----path_cmd_ubspline
  11.     path_cmd_end_poly = 0x0F,     //----path_cmd_end_poly
  12.     path_cmd_mask     = 0x0F      //----path_cmd_mask   
  13. };

path_commands_e还 能和path_flags_e组 合:

  1. enum path_flags_e
  2. {
  3.     path_flags_none  = 0,         //----path_flags_none
  4.     path_flags_ccw   = 0x10,      //----path_flags_ccw 
  5.     path_flags_cw    = 0x20,      //----path_flags_cw  
  6.     path_flags_close = 0x40,      //----path_flags_close
  7.     path_flags_mask  = 0xF0       //----path_flags_mask
  8. }; 

vertex()返回的命令中含有path_cmd_stop时 表示结束。

  1. // 等边三角形
  2. class triangle{
  3. public:
  4.     triangle(double cx, double cy, double r)//中心点,r为中心点到边的长度
  5.     {
  6.         // 直接准备好三个点
  7.         m_step = 0;
  8.         m_pt[0].x = cx; m_pt[0].y = cy-r;
  9.         m_pt[1].x = cx+r*0.866; m_pt[1].y = cy+r*0.5;
  10.         m_pt[2].x = cx-r*0.866; m_pt[2].y = cy+r*0.5;
  11.         //AGG把方向作为区分多边形内部和外部的依据,可以试试m_pt[1]和m_pt[2]对调
  12.     }
  13.     void rewind(unsigned)
  14.     {
  15.         m_step = 0;
  16.     }
  17.     unsigned vertex(double* x, double* y)
  18.     {
  19.         switch(m_step++)
  20.         {
  21.         case 0:
  22.             //第一步,move_to
  23.             *x = m_pt[0].x;
  24.             *y = m_pt[0].y;
  25.             return agg::path_cmd_move_to;
  26.         case 1:
  27.         case 2:
  28.             //第二、三步,line_to
  29.             *x = m_pt[m_step-1].x;
  30.             *y = m_pt[m_step-1].y;
  31.             return agg::path_cmd_line_to;
  32.         case 3:
  33.             // 第四步,闭合多边形
  34.             return agg::path_cmd_end_poly|agg::path_flags_close;
  35.         default:
  36.             // 第五步,结束
  37.             return agg::path_cmd_stop;
  38.         }
  39.     }
  40. private:
  41.     agg::point_d m_pt[3];
  42.     unsigned m_step;
  43. };

在on_draw()方法里把

    agg::ellipse ell(100,100,50 ,50); 改成 triangle ell(100,100,50);
    typedef agg::conv_contour< agg::ellipse> ell_cc_type;改成typedef agg::conv_contour< triangle> ell_cc_type;
得到的图形是:

triange demo


除了文字输出功能(gsv_text只能输出ASCII文字),上面这些顶点源提供的图形丰富程度已经超过了系统API。文字输出功能 将以单独的篇幅讲述。

  • 大小: 5.4 KB
  • 大小: 2.5 KB
  • 大小: 11.3 KB
  • 大小: 9.4 KB
用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 立即下载

相关推荐

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

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

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

      AGG(Anti-Grain Geometry),强大的2D几何图形库。因为GDI+的一些缺陷(不能跨平台,某些应用场合精度差),我一直在寻求可以替换gdi+绘图组件的方案,最终我选择了AGG。网上关于2D图形库的组件非常多,类似的还有GOOGLE PICASSO,CAIRO(firefox底层采用的渲染器),QT,OpenGL等等。从易用性的角度来说AGG比较困难,因为官方只给出了C++源代码,没有组件库和封装好的包,其他语言要想直接用是不可能了。从网上关于使用效果的评论来说,AGG是最高效,

阿翔 1万+

agg二维开发入门例程

agg二维绘图工具源码及入门例程及安装开发入门

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

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

weixin_30955617的博客 675

STM32 RC522串口驱动程序 (简单直接)

rc522作为使用非常多的读写卡芯片,使用SPI芯片读写应用已经非常广了。但有些时候我们只有串口可以使用,或者我们觉得串口使用更加方便,那么就必须要编写串口的驱动程序。不过很难找到可以直接使用的串口程序。所以在此将我这边写好的串口驱动写好如下: 直接上代码 下面是RC522.C的驱动文件。支持读写卡号8位数据。rc522用的是stm32 的串口3,调试显示是串口1; #include "rc522.h" #include "delay.h" /////////////////////////////////

qq_42074368的博客 9001

windows版kafka异常java.nio.file.FileSystemException另一个程序正在使用此文件,进程无法访问

环境 现象 原因 解决方法 参考

山水牧羊 3847

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

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

weixin_30371469的博客 259

SPV1050低功耗微功率太阳能充电管理模块原理图设计,已量产

在物联网应用快速普及的今天,户外低功耗传感器(如土壤温湿度、环境光照、无线节点等)的供电始终是行业痛点 —— 传统锂电池不仅需要定期更换,维护成本高,还难以满足 “终身免维护” 的场景需求。为此,我们设计了一款专为 1V~3V 低电压小型太阳能板优化的微功率太阳能电源管理模块,结合 USB 备用充电路径,实现了低功耗传感器的长期自主供电。

不脱发的程序猿 444

介绍和推荐AGG

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

lionzl的专栏 1883

C# 与欧姆龙 PLC 实战:通过 Ethernet/IP 协议进行设备控制与监控

本文介绍了如何通过C#和Ethernet/IP协议实现与欧姆龙PLC的通信。Ethernet/IP是基于以太网的工业协议,适用于工业设备间的实时数据交换。文章详细讲解了使用EthernetIPSharp库建立连接、读写数据的步骤,并提供了示例代码。此外,还探讨了实时监控、报警系统等高级功能,为工业自动化控制系统开发提供了实用指导。该方法简化了PLC通信开发,提高了系统可靠性和智能化程度。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 811

Python 爬虫实战:爬虫与 ECharts 结合 —— 前端可视化展示

本文介绍了爬虫技术与ECharts可视化结合的完整实现流程。首先使用Python爬取京东商品数据(价格、评价数等),通过BeautifulSoup解析和pandas处理转换为JSON格式。然后构建前端页面,利用ECharts实现价格分布柱状图、价格-评价数散点图和店铺占比饼图三种可视化效果。文章详细解析了爬虫数据提取、格式转换和前端图表配置等关键技术点,并提供了完整的代码示例。最后提出了基于API接口、数据库存储等扩展方向,为数据采集到可视化展示提供了完整的解决方案。

2503_91057718的博客 631

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

本文上接《用AGG实现高质量图形输出(一)》,分别介绍了AGG显示流程中的各个环节。 上次讲了AGG的显示原理并举了一个简单的例子,这一篇文章开始讲AGG工作流程里的每个环节。为了方便对照,再放一次AGG显示流程 图 另外,上一篇文章里的例程也很重要,后面的例子都将基于这个代码。 下面,我们来考察AGG显示流程中的每个环节。理解每个环节最好的方法是编写实验代码,建议先参照这里建 立一个可...

weixin_30260399的博客 233

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 173

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

来自http://www.cppprog.com/2009/0816/146.html AGG是一个开源、高效的跨平台2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 使用前AGG的准备工作下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5

bitasd的专栏 3437

把机器学习“搬进”数据库:SAP HANA PAL 快速上手与 ABAP AMDP 实战

摘要:本文探讨了SAP HANA PAL(Predictive Analysis Library)在企业数据分析中的实践应用。PAL通过将机器学习算法下推到数据库内部执行,有效解决了大数据量场景下的数据搬运瓶颈和治理成本问题。文章详细介绍了PAL的核心功能(包括聚类、分类、回归等10类算法)、使用前提(版本、组件和权限要求)以及通过AMDP实现ABAP与PAL集成的技术方案。重点阐述了参数表设计理念和两个典型应用场景:利用PageRank算法分析企业权限网络关系,以及通过PAL_SCALE进行特征预处理。文

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5736

相位偏折PMD全栈技术拆解 | 四步相移解算+梯度积分形貌重建,助力镜面工件微米级缺陷高精度稳定检测

工业精密检测领域中,高反光镜面类工件长期存在检测瓶颈,涵盖汽车高亮车漆、半导体抛光晶圆、光学透镜、精密抛光模具、玻璃盖板等主流产品。传统2D机器视觉仅能识别表面明显污渍、大尺寸破损,完全无法捕捉微米级划痕、凹坑、橘皮、曲面微形变等微观缺陷;常规线激光3D、普通结构光3D检测设备,面对镜面材质会产生严重镜面反射杂光,激光条纹、结构光图案完全失真,必须喷涂显影粉辅助检测,不仅破坏工件表面完整性,还无法适配自动化量产产线,检测效率与良率极低。

getusushu的博客 539

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

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

bitasd的专栏 2060

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

bitasd的专栏 1778

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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实现高质量图形输出(一)
下一篇: 开源2D图形库AGG研究(一)
bitasd
博客等级 码龄19年 11粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值