用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
分享到:
相关推荐
压缩包中的"用AGG实现高质量图形输出"可能包含示例代码、教程文档或者演示程序,这些内容可以帮助开发者更好地理解和使用AGG库。通过学习和实践,开发者能够掌握如何利用AGG来创建精细的图形,实现复杂的设计效果,...
在Windows编程领域,MFC(Microsoft ...GDI适合简单快速的图形输出,而AGG则适用于需要高质量和高性能的图形应用。开发者可以根据实际需求选择合适的图形库,结合MFC的强大功能,构建出高效且美观的Windows应用程序。
它的高效性和灵活性使得它在需要高质量2D图形输出的场景中尤其受欢迎。通过学习和使用AGG,开发者能够创建出具有专业品质的2D图形,同时享受高度自定义和性能优化带来的好处。无论是为了个人项目还是商业应用,深入...
4、支持高质量的图形处理,支持反走样插值等高级功能; 5、支持任意方式的惭变色处理; 6、支持所有颜色格式; 7、支持对位图的多种处理; 8、支持直线的多种处理,类似于GDI+; 9、支持GPC,即通用...
AGG(Anti-Grain Geometry)是一个开源的2D图形渲染引擎,主要用于生成高质量的矢量图形。在Windows平台上,如果你需要使用AGG库进行图形处理或开发项目,你可能会遇到如何在Visual Studio 2013环境下编译和集成AGG...
总结来说,AGG是一个专业且功能强大的2D图形库,对于那些需要高质量图形输出和精细控制的项目来说,是一个不可多得的工具。通过研究"copy-agg-jj-2.5.zip_JJ"中的源码和文档,开发者可以深入了解其工作原理,并将其...
在计算机图形学的世界里,高质量的2D渲染引擎是不可或缺的一部分,它们为各种应用程序、游戏以及用户界面提供了精细、流畅的视觉体验。Anti-Grain Geometry(AGG)正是这样一款强大的C++库,专为实现高保真2D图形而...
1. **矢量图形渲染**:Agg支持绘制各种矢量图形,如直线、曲线、圆弧、贝塞尔曲线等,并且能够进行平滑的抗锯齿处理,提供高质量的图形输出。 2. **高效的绘图算法**:采用先进的算法优化,Agg引擎能够在保持高画质...
虽然有人可能会说它目前没有维护,但它仍然提供了一个高质量的图形引擎,可以与 cairo 等项目相媲美。 AGG 大量使用 C++ 模板,这是一个主要的优点,也是一个潜在的缺点。 一方面,底层色彩空间和色彩存储模型的...
通过结合 AGG 库的强大图形能力以及 FreeType 字体引擎的支持,可以实现高质量的地图和图形输出。此外,通过 Python 绑定提供的接口,使得开发者能够更容易地集成到现有的应用程序和服务中,增加了项目的灵活性和可...
1. **AGG渲染引擎**:AGG是一个开源的2D图形渲染库,以其高质量的抗锯齿和几何变换而闻名。它支持矢量图形,可以生成高质量的图像,特别适合打印和屏幕显示。 2. **绘图对象**:aggdraw库提供了各种绘图对象,如Pen...
Matplotlib支持多种后端,例如PS用于生成PostScript文件,SVG用于创建可缩放矢量图形,Agg用于高质量PNG输出。Matplotlib还支持在不同的图形用户界面(如Gtk+、Tkinter等)中嵌入图形。 用户还可以自定义Matplotlib...
开发者可以利用matplotlib轻松地绘制出高质量的图形,这对于数据分析、科学计算以及任何需要将数据视觉化的项目都极其有用。 matplotlib的核心特性包括: 1. **可定制性**:matplotlib提供了大量的选项来调整图形的...
Agg(Anti-Grain Geometry)是一个高质量、快速的2D图形库。 - **知识点**: - **抗锯齿技术**:Agg以其出色的抗锯齿处理而闻名,能够提供平滑、清晰的线条和曲线。 - **几何变换**:Agg支持多种几何变换,如旋转...
它提供了一个高级接口用于创建静态、动态、交互式的图形,支持多种输出格式,如SVG、PDF、PNG等,使得在各种平台上展示和打印高质量图形成为可能。 二、matplotlib的特性 1. **丰富的图形类型**:matplotlib可以...
这表明 SCons-Man 中涉及了复杂的图形渲染和图像处理技术,为开发高性能的图形应用程序提供了支持。 ### 总结 SCons-Man 不仅是一份关于 SCons 构建工具的文档集合,更是一系列深入探讨 SCons 高级特性的资源。...
像素农场 硬件和软件2D渲染库 硬件渲染技术: 该库使用OpenGL ES2 +及其阴影着色(GLSL)作为其硬件渲染器后端。 从svg文件中读取下面的狮子杯=>镶嵌并使用GLES ... 基于Agg的Painter提供了高质量的图形输出。 P
用户可以通过savefig函数的参数来调整图形的分辨率和质量,以满足不同的输出需求。 7. Matplotlib配置和优化 Matplotlib允许用户通过配置文件matplotlibrc来定制图表的样式和行为。在进行大量数据可视化时,性能...
3. **多后端支持**:`matplotlib` 支持多种图形渲染后端,包括agg(用于非交互式输出)、GTK、GTKAgg、GTKCairo、GTK3Agg、MacOSX、Qt4Agg、Qt5Agg、TkAgg、WebAgg(用于Web应用)和WXAgg等,这意味着你可以根据需求...