AGG高质量图形输出 下载本文

内容发布更新时间 : 2024/12/23 16:21:48星期一 下面是文章的全部内容请认真阅读。

实验代码,使用gradient_lut实现多颜色渐变

把示例代码的渐变颜色部分改成这样: ?? ...

?? // 渐变颜色

?? //typedef agg::gradient_linear_color colorF_type;

?? //colorF_type colorF(agg::rgba(1,1,1), agg::rgba(0,0,1));//白色到蓝色 ?? typedef agg::gradient_lut<

?? agg::color_interpolator ?? > colorF_type; ?? colorF_type colorF;

?? colorF.add_color(0, agg::rgba(1,1,1)); ?? colorF.add_color(0.2, agg::rgba(1,0,0)); ?? colorF.add_color(0.4, agg::rgba(0,1,0)); ?? colorF.add_color(0.8, agg::rgba(0,0,1)); ?? colorF.build_lut(); ?? ... 显示效果

渐变方式

除本例中的gradient_radial_focus以外,AGG还提供了很多渐变方式,它们都定义在#include 头文件之中。

修改演示代码的渐变方式是很简单的,如: ?? ...

?? // 渐变方式

?? //typedef agg::gradient_radial_focus gradientF_type; ?? //gradientF_type grF(1, 0.1, 0.5); ?? typedef agg::gradient_x gradientF_type; ?? gradientF_type grF; ?? ...

这里是其中的一部分AGG自带渐变方式以及显示效果

gradient_x

gradient_y

gradient_diamond

gradient_xy

gradient_conic

gradient_radial

本节的最后,再介绍一下其它几个色彩类的线段生成器

? span_solid没什么好说的,实色填充而已

? span_gradient_alpha是透明度渐变,参数和span_gradient差不多,区别是ColorF改成了AlphaF,“operator []()”返回值也由颜色结构变为的透明度数值。

? span_gouraud_rgba 高氏三角着色,需指定三角形的三个顶点和三种颜色,用法见下例

?? // 色彩类线段生成器demo ?? // 线段分配器

?? typedef agg::span_allocator span_allocator_type;//分配器类型 ?? span_allocator_type span_alloc; // span_allocator ??

?? typedef agg::span_gouraud_rgba span_gen_type; ?? span_gen_type span_gen;

?? //三种颜色 ?? ?? ?? ??

span_gen.colors( agg::rgba(1,0,0), agg::rgba(0,1,0), agg::rgba(0,0,1)

?? );

?? //三角形三个顶点 ?? span_gen.triangle( ?? 100,50, ?? 130,125, ?? 70,125,0 ?? );

?? agg::renderer_scanline_aa< ?? renderer_base_type, ?? span_allocator_type, ?? span_gen_type

?? > my_renderer(renb, span_alloc, span_gen); ??

?? ras.add_path(ell);

?? agg::render_scanlines(ras,sl,my_renderer);

显示效果

组合类线段生成器

头文件

? #include 类型

? template ? class agg::span_converter;

span_converter的作用是组合两种生成器,比如先由图案类线段生成器产生图案,然后由色彩类线段生成器产生半透明色叠加在图案上。

下面的演示代码演示了怎样组合span_image_filter_rgb_bilinear_clip和span_gradient_alpha两种生成器

演示代码,同样基于这个代码,加入下面的头文件

? #include \

? #include \? #include \

? #include \在on_draw()方法的最后加上下面这些代码 ? agg::pixel_map pm_img;

? if(pm_img.load_from_bmp(\?? {

?? // pm_img里的图案作为填充来源 ?? agg::rendering_buffer rbuf_img( ?? pm_img.buf(),

?? pm_img.width(), pm_img.height(), ?? ?? ?? ?? ?? ?? ?? ?? ??

-pm_img.stride());

agg::pixfmt_bgr24 pixf_img(rbuf_img);// 我用的bmp是24位的 // 线段分配器

typedef agg::span_allocator span_allocator_type;//分配器类型 span_allocator_type span_alloc; // span_allocator // 插值器

typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型 agg::trans_affine img_mtx; // 变换矩阵

interpolator_type ip_img(img_mtx); // 插值器

??

?? agg::trans_affine alpha_mtx; // 变换矩阵 ?? interpolator_type ip_alpha(alpha_mtx); // 插值器 ??

?? // 渐变方式

?? typedef agg::gradient_x gradientF_type; ?? gradientF_type grF;

??

?? typedef std::vector alphaF_type; ?? alphaF_type alphaF(256);

?? for(int i=0; i<256; i++) alphaF[i] = i; ??

?? // Alpha线段生成器 ?? ?? ?? ??

typedef agg::span_gradient_alpha

alphaF_type> alpha_span_gen_type;

?? alpha_span_gen_type alpha_span_gen(ip_alpha,grF,alphaF,0,150); ??

?? // 图案线段生成器

?? typedef agg::span_image_filter_rgb_bilinear_clip pic_span_gen_type; ?? ?? ?? ??

pic_span_gen_type pic_span_gen(pixf_img, agg::rgba(0,1,0), ip_img);

// 使用span_converter组合成新的线段生成器

typedef agg::span_converter

span_gen_type;

?? span_gen_type span_gen(pic_span_gen,alpha_span_gen); ??

?? // 组合成渲染器

?? agg::renderer_scanline_aa< ?? renderer_base_type, ?? span_allocator_type,

?? span_gen_type

?? > my_renderer(renb, span_alloc, span_gen); ?? // 插值器的矩阵变换 ?? img_mtx.scale(0.5); ?? img_mtx.translate(40,40); ?? img_mtx.invert(); //注意这里 ??

?? // 用我们的渲染器画圆 ?? ras.add_path(ccell);

?? agg::render_scanlines(ras,sl,my_renderer); ?? } 显示效果