用AGG实现高质量图形输出(一)
AGG是一个开源、高效的跨平台2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+)
使用前AGG的准备工作
- 下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5
- 解压,后面以[AGG]表示AGG的解压目录.
- 把[AGG]\include加入到include搜索目录中
- 把[AGG]\src里所有cpp加入到项目中(或者用makefile一起编译)
- 另外,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图形显示原理见下图:
其中:
-
Vertex Source 顶点源,里面存放了一堆2D顶点以及对应的命令,如"MoveTo"、"LineTo"等。
-
Coordinate conversion pipeline 坐标转换管道,它可以变换Vertex Source中的顶点,比如矩阵变换,轮廓提取,转换为虚线等。
-
Scanline Rasterizer 把顶点数据(矢量数据)转换成一组水平扫描线,扫描线由一组线段(Span)组成,线段(Span)包含了起始位置、长度和覆盖率(可以理解为透明度)信息。AGG的抗锯齿(Anti-Aliasing)功能也是在这时引入的。
-
Renderers 渲染器,渲染扫描线(Scanline)中的线段(Span),最简单的就是为Span提供单一颜色,复杂的有多种颜色(如渐变)、使用图像数据、Pattern等。
-
Rendering Buffer 用于存放像素点阵数据的内存块,这里是最终形成的图像数据。
要理解AGG的工作原理,先看一段代码:
-
#include "agg_basics.h"
-
#include "agg_rendering_buffer.h"
-
#include "agg_rasterizer_scanline_aa.h"
-
#include "agg_scanline_u.h"
-
#include "agg_renderer_scanline.h"
-
#include "agg_pixfmt_rgb.h"
-
#include "platform/agg_platform_support.h"
-
#include "agg_ellipse.h"
-
#include "agg_conv_contour.h"
-
#include "agg_conv_stroke.h"
-
-
class the_application : public agg::platform_support
-
{
-
public:
-
the_application(agg::pix_format_e format, bool flip_y) :
-
agg::platform_support(format, flip_y)
-
{
-
}
-
-
virtual void on_draw()
-
{
-
-
agg::rendering_buffer &rbuf = rbuf_window();
-
agg::pixfmt_bgr24 pixf(rbuf);
-
-
-
typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;
-
renderer_base_type renb(pixf);
-
-
typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderer_scanline_type;
-
renderer_scanline_type rensl(renb);
-
-
-
agg::ellipse ell(100,100,50,50);
-
-
-
typedef agg::conv_contour<agg::ellipse> ell_cc_type;
-
ell_cc_type ccell(ell);
-
-
typedef agg::conv_stroke<ell_cc_type> ell_cc_cs_type;
-
ell_cc_cs_type csccell(ccell);
-
-
-
agg::rasterizer_scanline_aa<> ras;
-
agg::scanline_u8 sl;
-
-
-
renb.clear(agg::rgba8(255,255,255));
-
for(int i=0; i<5; i++)
-
{
-
ccell.width(i*20);
-
ras.add_path(csccell);
-
rensl.color( agg::rgba8(0,0,i*50));
-
agg::render_scanlines(ras,sl,rensl);
-
}
-
}
-
};
-
-
int agg_main(int argc, char* argv[])
-
{
-
the_application app(agg::pix_format_bgr24, false);
-
app.caption("AGG Example. Anti-Aliasing Demo");
-
-
if(app.init(600, 400, agg::window_resize))
-
{
-
return app.run();
-
}
-
return -1;
-
}
编译这段代码的方法是(以VC为例):
- 新建空白GUI项目(就是有WinMain的项目)
- 把[AGG]\src里所有*.cpp加入到项目中
- 把[AGG]\src\platform\Win32\*.cpp加入到项目中
- Ctrl+C/Ctrl+V 上面的代码
- 编译!
显示效果:
我们先不管agg_main及agg::platform_support的问题,实际上agg::platform_support只是AGG给我们方便显示AGG图形用的,真正应用时几乎不会用到(后面会讲到怎样把AGG图形画到HDC上)。
现在我们只需要知道这个框架可以生成一个窗体,当窗体重画时会调用virtual void on_draw()就行了。
现在直接从on_draw()开始看
- 通过rbuf_window()方法得到一个agg::rendering_buffer,它就是“Rendering Buffer”,是一块用于存放图像的内存块。通过pixfmt_bgr24包装,我们就可以以像素为单位存取图像。
-
agg::renderer_base和agg::renderer_scanline_aa_solid都属于"渲染器Renderer"。renderer_base为底层渲染器,它支撑起所有的高层渲染器。这里的renderer_scanline_aa_solid就是一个高层渲染器。
-
agg::ellipse是“顶点源Vertex Source”,这个顶点源呈现的是一个圆形。
-
agg::conv_contour和agg::conv_stroke作为“坐标转换管道Coordinate conversion pipeline”,conv_contour扩展轮廓线,conv_stroke只显示轮廓线(如果没有conv_stroke就会显示实心圆,可以去掉试试)。
-
agg::rasterizer_scanline_aa<>就是“Scanline Rasterizer”啦。
-
agg::render_scanlines函数执行这个AGG工作流程。
- 大小: 5.4 KB
- 大小: 22.7 KB
分享到:
相关推荐
2 AGG图形显示原理见下图: 1 3 要理解AGG的工作原理,先看一段代码: 2 4 顶点源(Vertex Source) 5 4.1 头文件 5 4.2 类型 5 4.3 画一条简单的箭头直线(基于此处代码) 6 4.4 自定义一个顶点源(基于此处代码) 7 5 ...
用AGG实现高质量图形输出.zip,AGG图像引擎介绍
agg为开源的高效跨平台2D图形开发库,内部包含了大量的GDI图形绘制源码和示例!
AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,包含在Windows、Wince、Linux台平。 agg的特点 1、支持...
AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 1.下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5 2.解压,后面以[AGG]表示AGG的...
AGG与GDI两种图形库在MFC下的图形绘制,开发工具是vc2005,实现了AGG下的各种属性设置,透明度的设置,以及在两种不同库下的编辑图形和显示图形。
保存&分享AGG图形库相关资料,文档+2.5源码
2d图形开发库AGG,跨平台渲染库,C源代码
它提供一套结合了亚像素(subpixel accuracy)技术与反走样(anti-aliasing)技术的图形算法,实现高效率、高质量的二维图形处理功能。AGG 的另一个特点在于它极大的灵活性。其作者将它描述为“创建其它工具的工具”...
AGG是一个开源、高效的跨平台2D图形库 这是它的离线文档
AGG测试,一个AGG的测试事例。一个GDI和AGG在MFC下使用的例子。
开源跨平台2d图形库,agg2.5源码+文档
一个很优秀的2D图形引擎. Anti-Grain Geometry (AGG) - Version 2.5 A high quality rendering engine for C++ Copyright (C) 2002-2006 Maxim Shemanarev
包括: 基于AGG算法库的通用图形接口设计.pdf AGG绝好资料.doc 介绍和推荐AGG.doc
AGG是一个开源的二维图形引擎,它提供了一个功能有限的SVG解析、渲染工具svg_viewer。我对svg_viewer做了如下改进: - 支持解析 、<ellipse> 元素,以及<rect> 的 rx、ry 属性(圆角矩形)。 - 支持格式为 rgb(ddd...
Agg在Windows下的编译与使用...AGG(Anti-Grain Geometry)是一个开源免费的图形库。 官网地址: www.antigrain.com 环境: Win10 x64 Visual Studio 2013 字符集 Unicode 主要是编译称为Lib库,然后提供给其他程序使用
学习agg的好文档,详细介绍了AGG的图形变换流程,很好的学习手册
agg二维绘图工具源码及入门例程及安装开发入门
AGG在windows系统visual studio 2013平台编译及开发;已经上传了编译成功的AGG.lib, 使用时将include文件夹添加到链接库即可。
反颗粒几何(AGG)是一个开放源代码的免费图形库,以工业标准C ++编写。 “许可”页面上描述了AGG的使用条款和条件。 AGG不依赖任何图形API或技术。 基本上,您可以将AGG视为一个渲染引擎,该引擎根据某些矢量数据在...