AGG 色彩类线段生成器

Python音频波形生成器实战:从PCM解码到Matplotlib可视化 数字音频处理是现代多媒体应用的核心技术之一,其基础在于将连续的声波信号转换为离散的数字表示,即PCM(脉冲编码调制)数据。通过采样率、位深度和声道数等参数,PCM能够精确记录声音的振幅变化。将抽象的音频数据可视化,不仅能直观呈现声音的动态特性,还能为音频分析、编辑和诊断提供关键依据。在工程实践中,利用Python生态中的高效库(如NumPy进行向量化计算)可以快速处理海量音频样本,而Matplotlib等绘图工具则能生成高质量的波形图。这种技术组合广泛应用于音乐制作、播客编辑、语音分析等领域,帮助开发者与创 阅读详情

色彩类线段生成器

头文件
  1. #include <agg_span_solid.h>
  2. #include <agg_span_gradient.h>
  3. #include <agg_span_gradient_alpha.h>
  4. #include <agg_span_gouraud_gray.h>
  5. #include <agg_span_gouraud_rgba.h>
类型
  1. template<class ColorT>
  2.     class agg::span_solid;
  3. template<class ColorT, class Interpolator, class GradientF, class ColorF>
  4.     class agg::span_gradient;
  5. template<class ColorT, class Interpolator, class GradientF, class AlphaF>
  6.     class agg::span_gradient_alpha;
  7. template<class ColorT>
  8.     class agg::span_gouraud_[gray|rgba];

如果你是从上面的图案类线段生成器看到这里的话,那么色彩类的就相对简单得多了。同样,我们先写一个示例代码,也方便以后做实验。

示例代码

同样基于这个代码(http://www.cppprog.com/2009/0816/146.html),

//Rendering Buffer
    agg::rendering_buffer &rbuf = rbuf_window();
    agg::pixfmt_bgr24 pixf(rbuf);

    // Renderers
    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);
   
    // Vertex Source
    agg::ellipse ell(100,100,50,50);

    // Scanline Rasterizer
    agg::rasterizer_scanline_aa<> ras;
    agg::scanline_u8 sl;

 

 

加入下面的头文件

#include "agg_span_allocator.h"

#include "agg_span_gradient.h"

 

在on_draw()方法的最后加上下面这些代码

// 色彩类线段生成器demo
// 线段分配器
typedef agg::span_allocator<agg::rgba8> 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_mtx); // 插值器
// 渐变方式
typedef agg::gradient_radial_focus gradientF_type;
gradientF_type grF(1, 0.1, 0.5);
// 渐变颜色
typedef agg::gradient_linear_color<agg::rgba8> colorF_type;
colorF_type colorF(agg::rgba(1,1,1), agg::rgba(0,0,1));//白色到蓝色
// 线段生成器
typedef agg::span_gradient<agg::rgba8,
interpolator_type,
gradientF_type,
colorF_type> span_gen_type;
span_gen_type span_gen(ip,grF,colorF,0,50);
// 组合成渲染器
agg::renderer_scanline_aa<
renderer_base_type,
span_allocator_type,
span_gen_type
> my_renderer(renb, span_alloc, span_gen);
// 矩阵变换
img_mtx.translate(100,100);
img_mtx.invert(); //注意这里
// 使用我们的渲染器画圆
ras.add_path(ell);
agg::render_scanlines(ras,sl,my_renderer);

 

显示效果

  1. span_gradient是一个模板类(费话,AGG的大部分类都是),前两个模板参数ColorT和Interpolator一个是颜色类型一个是插值器没什么好说的了。关键是后面两个:GradientF用于指定渐变的方式,如水平渐变、垂直渐变、圆形渐变等;ColorF指定渐变的颜色。
  2. 渐变方式选择了agg::gradient_radial_focus,这是一个可指定焦点的圆形渐变方式。
  3. 渐变色使用agg::gradient_linear_color设置起始颜色和终止颜色。
  4. span_gradient的构造函数前三个分别是插值器、渐变方式、渐变颜色,后面两个数字表示渐变的起始和终止位置。不同的渐变方式起始和终止位置的意义是不同的,如在圆形填充里起始和终止表示中心和边缘;水平渐变则表示从左到右。
  5. 插值器的矩阵变换把这个渐变中心移到(100,100)点上,同样要记得调用invert()方法反转。

渐变颜色

前面说到span_gradient的模板参数ColorF指定渐变的颜色,我们使用的是gradient_linear_color,那么有哪些类可以作为ColorF呢?

AGG文档里说只要实现了“operator []()”和“size()”的类就可以作为ColorF,嗯,std::vector<rgba8>也行哈。

实验代码,使用std::vector<rgba8>实现多颜色渐变

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

...
// 渐变颜色
//typedef agg::gradient_linear_color<agg::rgba8> colorF_type;
//colorF_type colorF(agg::rgba(1,1,1), agg::rgba(0,0,1));//白色到蓝色
typedef std::vector<agg::rgba8> colorF_type;
colorF_type colorF(256);
agg::rgba begin_color(1,1,1), mid_color(1,0,0), end_color(0,0,1);
for(int i=0; i<128; i++) //前128从白到红
colorF[i] = begin_color.gradient(mid_color,i/128.0);
for(int i=0; i<128; i++) //后128从红到蓝
colorF[i+128] = mid_color.gradient(end_color,i/128.0);

显示效果  

这里指定的vector容量256指的是用于的颜色,想要更平滑过渡的话可以使用更多的颜色数。

除了用vector实现多种颜色的渐变外,我们还可以用AGG提供的一个gradient_lut类,用它可以方便很多。

gradient_lut的头文件是#include <agg_gradient_lut.h>

类声明为

template<class ColorInterpolator, unsigned ColorLutSize = 256>

class agg::gradient_lut

 

其中的ColorInterpolator负责生成两种颜色的中间色,直接使用AGG自带的agg::color_interpolator就行。

通过gradient_lut的add_color(double offset, color_type color)方法添加多种颜色,其中的offset表示添加的颜色所处的偏移位置,取值为0~1之间。

添加完所有颜色后调用build_lut()方法让gradient_lut内部生成颜色数组。

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

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

...
// 渐变颜色
//typedef agg::gradient_linear_color<agg::rgba8> colorF_type;
//colorF_type colorF(agg::rgba(1,1,1), agg::rgba(0,0,1));//白色到蓝色
typedef agg::gradient_lut<
agg::color_interpolator<agg::rgba8>
> 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 <agg_span_gradient.h>头文件之中。

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

...
// 渐变方式
//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_xgradient_ygradient_diamond
gradient_xygradient_conicgradient_radial

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

  • span_solid没什么好说的,实色填充而已
  • span_gradient_alpha是透明度渐变,参数和span_gradient差不多,区别是ColorF改成了AlphaF,“operator []()”返回值也由颜色结构变为的透明度数值。
  • span_gouraud_rgba 高氏三角着色,需指定三角形的三个顶点和三种颜色,用法见下例

// 色彩类线段生成器demo
// 线段分配器
typedef agg::span_allocator<agg::rgba8> span_allocator_type;//分配器类型
span_allocator_type span_alloc; // span_allocator

typedef agg::span_gouraud_rgba<agg::rgba8> 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);

显示效果


www.cppprog.com

http://hi.baidu.com/%E5%D4%E5%C6%B6%C0%D0%D0/blog/item/8b82c4f867a070d3b58f31f1.html

多线彗星图:动态数据可视化核心原理与Matplotlib实现 数据可视化是数据分析与呈现的关键技术,其核心在于将抽象数据转化为直观图形,以揭示数据内在的模式与趋势。在时间序列和实时数据流场景中,传统的静态图表难以展现数据的动态演变过程,而标准动画又常面临性能瓶颈与视觉连续性不足的问题。多线彗星图(Multi-line Comet Plot)作为一种先进的动态可视化技术,巧妙地解决了这些痛点。它借鉴了彗星的视觉隐喻,通过“增量绘制”与“视觉衰减”原理,为每条数据线维护一个由明亮头部和渐变尾巴构成的轨迹,在避免全量重绘的前提下,高效、连续地展示多条数据流的实时状态与相对关 阅读详情

相关推荐

AGG-SVG学习笔记 [2015-07-07]

河南洛阳 祝小鹰 2015-07-07 接触AGG一年多,积累了一些心得体会。现在贴出来与大家分享。 注1:学习笔记按记录时间的逆序排列。 注2:当初学习AGG的目的是为了绘制SVG图形文件,因此夹杂了一些SVG的内容。 注3:早期的笔记由于刚接触AGG,可能存在一些错误。 例程和库文件下载:http://pan.baidu.com/s/1o6OhqMQ ---------

zhawk的专栏 2518

AGG 成果

作为本文的结尾,这里放上一个用AGG生成不规则文字窗体的代码。它综合了我们之前学到的AGG字体引擎、坐标转换、颜色渐变等几大模 块。由于AGG的抗锯齿特性,使用生 成的窗体看上去边缘过渡非常自然,几乎看不到“毛边”。先放上最终生成的窗体的效果:貌似比网页左上角的logo还要好看那么一点点-_-     #define _WIN32_W

bitasd的专栏 1393

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1388

AGG 线段生成器(Span Generator)

线段生成器(Span Generator)我们前面举的例子使用的都是简单的单一实色,如蓝色的圆、黑色的线等。这是因为在例子里我们一直使用renderer_scanline_aa_solid或render_scanlines_aa_solid。在上篇文章(http://www.cppprog.com/2009/0821/150.html)的渲染器一节中除了renderer

bitasd的专栏 1666

【信息科学与工程学】【安全领域】第一百四十二篇 零信任网络解决方案中的算法04

对于节点 i, 有功和无功功率平衡方程为: Pi​=Vi​∑j=1N​Vj​(Gij​cosθij​+Bij​sinθij​), Qi​=Vi​∑j=1N​Vj​(Gij​sinθij​−Bij​cosθij​)。下风向某点 (x,y,z)的浓度 C为: C=2πuσy​σz​Q​exp(−2σy2​y2​)[exp(−2σz2​(z−H)2​)+exp(−2σz2​(z+H)2​)], 其中 Q是源强, u是风速, H是有效源高, σy​,σz​是水平和垂直扩散参数。

weixin_49199313的博客 1409

深入探索AGG开源2D图形绘制引擎

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

weixin_30356433的博客 1294

AGG学习之八----使用图案填充

装载bitmap文件,使用bitmap图案构建span生成器,对面进行填充。代码如下: #include "platform/agg_platform_support.h" #include "agg_basics.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgb.h" #include "agg_alpha_mask_u

ErikLiu的专栏 2468

从‘眼花缭乱’到‘心中有数’:rs-fMRI统计分析全流程避坑指南(附DPABI操作截图)

本文详细解析了rs-fMRI统计分析的全流程,从质量控制到统计模型选择,再到多重比较校正和结果解读。特别针对DPABI软件操作中的常见陷阱提供实用指南,帮助研究者避免FDR和GRF校正等关键环节的错误,实现从数据混乱到清晰分析的转变。

weixin_33686714的博客 397

Agg图形库学习笔记-实现任意方向圆角渐变矩形

直接贴代码了.... View Code 1 #include <stdio.h> 2 #include "agg_basics.h" 3 #include "agg_rendering_buffer.h" 4 #include "agg_rasterizer_scanline_aa.h" 5 #include "agg_scanline_...

weixin_30746117的博客 639

Ubuntu本地部署CodeX编程助手:CLI配置全指南

本地AI编程助手是当前开发者关注的核心技术趋势,指在不依赖云端API、保障代码隐私前提下,于本地环境运行具备代码理解、多语言补全与知识库检索能力的智能辅助工具。其技术原理涉及模型加载、API网关编排、向量数据库集成及系统级资源调度,关键价值在于可控性、低延迟与合规性。典型应用场景包括企业内网DevOps提效、边缘设备嵌入式开发支持,以及敏感代码场景下的离线编程增强。本文聚焦Ubuntu系统下基于CLI的手动配置路径,深入解析Ollama服务注册、Node.js版本锁定、API Key环境隔离及Qwen2.5

weixin_26804345的博客 593

在 CentOS7 下安装 Cadence IC验证平台 INCISIVE152

前言 本文所使用的软件 虚拟机软件:VMware Workstation 15 PRO 如何安装? 操作系统:CentOS-7, CentOS-7-x86_64-DVD-1810.iso 如何安装? 简介 INCISIVE Incisive是nc_verilog, nc_sim, nc_lauch,以及ABV,TBV的集合,用于仿真和验证。 InstallScape InstallSc...

沈醉不知的博客 2万+

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

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

bitasd的专栏 2060

生信入门(六)——单细胞分析(Seurat)

生信入门(六)——单细胞分析(Seurat) 文章目录生信入门(六)——单细胞分析(Seurat)一、数据导入1、数据来源2、数据导入二、标准预处理1、QC和选择细胞进行进一步分析2、规范化数据3、识别高度可变的特征(特征选择)4、缩放数据三、主成分分析(PCA)1、线性降维2、确定数据集的“维度”四、聚类细胞五、非线性降维(UMAP/tSNE)六、寻找差异表达的特征(簇生物标志物) 一、数据导入 1、数据来源 点击此处下载数据 数据说明:分析10X Genomics提供的外周血单细胞(PBMC)数据集,有

羊羊的博客 6万+

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

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

weixin_30371469的博客 259

基于FPGA的函数信号发生器设计

设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。

FPGA入门到跑路 5635

三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵可视化:绕x轴旋转90度。

weixin_43850909的博客 8227

AGG 组合类线段生成器

组合类线段生成器头文件#include 类型templateclass SpanGenerator, class SpanConverter> class agg::span_converter; span_converter的作用是组合两种生成器,比如先由图案类线段生成器产生图案,然后由色彩类线段生成器产生半透明色叠加在图案上。下

bitasd的专栏 1203

代数拓扑与AI架构:AI应用架构师深入探索数学研究如何分析复杂系统的结构特性

随着人工智能技术的飞速发展,AI系统变得越来越复杂。AI应用架构师需要有效的工具和方法来理解、设计和优化这些复杂系统。代数拓扑作为数学的一个分支,提供了独特的视角和技术来分析复杂系统的结构特性。本文旨在帮助AI应用架构师深入了解代数拓扑,以及如何将其应用于AI架构设计中,提升对复杂系统的分析能力。首先,我们会介绍代数拓扑和AI架构相关的核心概念及其联系,通过有趣的故事引入主题,让读者轻松理解复杂概念。接着,深入探讨代数拓扑的核心算法原理,结合具体的编程语言代码示例详细阐述。

大模型应用工坊 670

AGG 渲染器(Renderers)

Renderers 渲染器渲染器负责表现扫描线Scanline中的每个线段(span)。在渲染器之前,AGG图形中的线段是没有颜色值的,只是位置、长度和 覆盖率(透明度)。渲染器赋于线段色彩,最终成为一幅完整的图像。渲 染器被分成底中高三层。其中底层负责像素包装,由PixelFormat Renderer实现;中层是基础层,在PixelFormat Renderer的基础上提供更多方法

bitasd的专栏 1677

【深度学习新浪潮】李飞飞团队VAGEN框架深度解析:让VLM智能体学会“三思而后行“

VAGEN框架的真正价值,不仅在于性能指标的突破,更在于重新定义了VLM智能体的发展方向——人工智能的进步不应只追求"做得对",更要实现"想得清"。李飞飞团队通过强制显式思考、动态表示适配和精细化奖励三大创新,让智能体第一次具备了可解释的世界建模能力。正如人类通过"观察-预测-行动"认识世界,VAGEN为AI注入的这种思考范式,或许正是通往通用人工智能的关键一步。对于开发者而言,开源的VAGEN框架不仅提供了强大的工具,更揭示了一个重要理念:让AI学会思考,比让它学会执行更重要。

专注:太空算力、AI infra、异构调度、大模型成本工程 280

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

imgradientxy()是函数

计算x,y的梯度 例如: [Gx, Gy] = imgradientxy(img); grad = sqrt(Gx.^2+Gy.^2); Imgradientxy是函数,它返回一对矩阵,第一个是x方向的梯度,第二个是y方向的梯度。

jie的博客 1811

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【渲染引擎】agg画线介绍

对于agg的字体进行了一个很简单的介绍,下面就再对agg的画线进行一个简单的说明。 首先对于画线来说,有几种线条比如普通线, 虚实线,点阵状的线条。agg对于每种线条都有支持。另外对于线条的起始的结束样式也有几种,这个属性一般都是以linecap来标识。只有绘制较宽线段时,它才有效。这个属性的合法值如下表所示。默认值是:”butt”。 “butt” 这个默认值指定了线段应该没有线帽。线条的末点是

zwan0518的专栏 1880

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

AGG第五课 RGB颜色定义

混合器的存在是为了适应不同平台、不同需求下的不同像素格式。混合器有三种:agg::rgba,agg::rgba8和agg::rgba16,都是用来指定颜色的,rgba每个通道储存为double,rgba8为unsigned char,rgba16为int或long int;混合器起到的作用就像Win32API里的RGB和COLORREF宏。针对agg::rgba特别说...

weixin_33912445的博客 229

Agg学习笔记

<br />  官网: http://www.antigrain.com/<br />      很久前就听一大牛说起Agg,据说是一个架构极度牛B的2D引擎,沉寂了许久,最后花了两周时间走马观花地把它过了一遍。果然如那大牛所言,这家伙简直就是巧夺天工的艺术品。今天稍稍瞄了一下Google扔出来的,也宣称极度牛B的2D引擎Skia,不过个人感觉整体架构大不如Agg漂亮。至于两者的性能,没做过比较,只是听说skia性能表现优异。<br />      在啃这块骨头之前,有两点建议:<br />稍了解一点2D计

cpq37的专栏 3946
上一篇: AGG 图像访问器(Image Accessor)
下一篇: AGG 组合类线段生成器
bitasd
博客等级 码龄19年 11粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值