使用AGG里面的clip_box函数裁剪画布, 绘制裁剪后的图形

news2024/12/27 13:22:03
// 矩形裁剪图片, 透明
void agg_testImageClipbox_rgba32(unsigned char* buffer, unsigned int width, unsigned int height)
{
    // ========= 创建渲染缓冲区 =========
    agg::rendering_buffer rbuf;
    // BMP是上下倒置的,为了和GDI习惯相同,最后一个参数是负值。
    rbuf.attach(buffer, width, height, width * 4); // stride 是每行的字节数  
    //rbuf.attach(buffer, width, height, -width * 4); // stride 是每行的字节数, 可以上下翻转坐标
    // 提供了访问渲染缓存中的每一行每一个字节颜色的接口
    // 以前:unsigned char* p = rbuf.row(i);
    // 现在:unsigned char* p = rbuf.row_ptr(i);

    // 创建像素格式和像素映射  
    //agg::pixfmt_bgr24 pixf(rbuf);
    //agg::pixfmt_rgb24 pixf(rbuf);
    agg::pixfmt_rgba32 pixf(rbuf);

    // Renderers
    //typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;
    //typedef agg::renderer_base<agg::pixfmt_rgb24> renderer_base_type;
    typedef agg::renderer_base<agg::pixfmt_rgba32> renderer_base_type;
    renderer_base_type renb(pixf);

    typedef agg::renderer_scanline_aa_solid<renderer_base_type>renderder_scanline_type;
    renderder_scanline_type rensl(renb);

    agg::rasterizer_scanline_aa<> ras;
    agg::scanline_u8 sl;
    ras.reset();

    renb.clear(agg::rgba(1.0, 1.0, 1.0, 1.0));
    // =====================================================


    // 设置裁剪框  
    agg::rect_d gpClip(0, 0, 200, 200); // 裁剪框的位置和大小  


    // 在ras里画个裁剪矩形
    {
        // 创建pasth
        agg::path_storage ps;
        ps.move_to(0, 0);
        ps.line_to(0, 200);
        ps.line_to(200, 200);
        ps.line_to(200, 0);
        ps.close_polygon();

        agg::conv_stroke<agg::path_storage> stroke(ps);
        ras.add_path(stroke);
        // 把ras里的东东画到renb上,抗锯齿
        agg::render_scanlines_aa_solid(ras, sl, renb, agg::rgba8(0, 255, 0));
    }

    // 在ras里画个虚线三角形
    {
        agg::path_storage ps;
        ps.move_to(21, 34);
        ps.line_to(598, 123);
        ps.line_to(165, 302);
        ps.close_polygon();

        // 用dash包裹path
        agg::conv_dash<agg::path_storage>dash(ps);
        dash.add_dash(10, 10);
        // 再用stroke包裹dash
        agg::conv_stroke<agg::conv_dash<agg::path_storage>>stroke(dash);
        ras.add_path(stroke);
        // 把ras里的东东画到renb上,抗锯齿
        agg::render_scanlines_aa_solid(ras, sl, renb, agg::rgba8(255, 0, 0));
    }


    // 设置AGG裁剪框  
    ras.clip_box(gpClip.x1, gpClip.y1, gpClip.x2, gpClip.y2);

    // 在ras里画个填充三角形
    {
        agg::path_storage ps;
        ps.move_to(21, 34);
        ps.line_to(598, 123);
        ps.line_to(165, 302);
        ps.close_polygon();

        ras.add_path(ps);
        // 把ras里的东东画到renb上,抗锯齿
        agg::render_scanlines_aa_solid(ras, sl, renb, agg::rgba8(255, 255, 60));
    }



}

void main()
{
// 假设我们有一个 800x600 的画布  
    int width = 800;
    int height = 600;

    // 为像素数据分配内存(这只是一个示例,实际分配方式可能因平台而异)  
    unsigned char* buffer = new unsigned char[width * height * 4]; // 3 字节/像素(BGR)  
    memset(buffer, 255, width * height * 4);

if (1) {
        // 保存图像Buffer为PNG
        int result = png_utils_save_buffer_to_png("libagg.png", buffer, width, height, PNGColorSpace_RGBA); // PNGColorSpace_RGB, PNGColorSpace_RGBA
        if (result) {
            _agg_printf("Successfully saved agg_file_type_png image.\n");
        }
        else {
            _agg_printf("Failed to save agg_file_type_png image.\n");
        }
    }

}

裁剪后的效果图片:

绿色矩形框是: 裁剪区域.

红色虚线是: 被裁剪的三角形.

黄色的三角形是: 裁剪后的三角形. 

这个程序主要是测试了画布被裁剪的效果.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1853046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网吧管理系统带万字文档java项目基于springboot+vue的网吧管理系统java课程设计java毕业设计

文章目录 网吧管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 网吧管理系统 一、项目演示 网吧管理系统 二、项目介绍 基于springbootvue的网吧管理系统 系…

ENVI+SARscape操作:将tif DEM数据转换为SARscape可读写的格式

1、导入 tif DEM 数据 将下载的 tif DEM 数据&#xff08;ALOS DEM或SRTM DEM&#xff09;&#xff0c;直接将要导入的 tif DEM 数据拖入ENVI软件中&#xff0c;即可自动打开&#xff1b; 2、数据拼接 在 Toolbox 中&#xff0c;点击 Mosaicking->Seamless Mosaic&#xf…

任务调度SpringTask入门

任务调度简介 1.1什么是任务调度 在企业级应用中&#xff0c;经常会制定一些“计划任务”&#xff0c;即在某个时间点做某件事情&#xff0c;核心是以时间为关注点&#xff0c;即在一个特定的时间点&#xff0c;系统执行指定的一个操作。常见的任务调度框架有Quartz和SpringTa…

如何在Android中实现多线程与线程池?

目录 一、Android介绍二、什么是多线程三、什么是线程池四、如何在Android中实现多线程与线程池 一、Android介绍 Android是一种基于Linux内核的开源操作系统&#xff0c;由Google公司领导开发。它最初于2007年发布&#xff0c;旨在为移动设备提供一种统一、可扩展的操作系统。…

嵌入式实验---实验六 I2C传输实验

一、实验目的 1、掌握STM32F103I2C传输程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、本案例利用I/O端口通过KEY01按键来控制STM32F103R6向24C02写入“hello”&#xff0c;通过另外一个按键KEY02来控制STM32F103R6从24C02读取“hello”&#x…

机器学习:线性回归模型学习路线

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

乳腺癌患者的生存分析:从传统方法到DeepSurv

一、引言 乳腺癌作为全球女性中最常见的癌症之一&#xff0c;其早期诊断和治疗对于提高患者生存率至关重要。随着医学技术和数据分析方法的不断发展&#xff0c;乳腺癌患者的生存分析逐渐成为研究的热点。通过生存分析&#xff0c;我们可以更好地理解疾病进展、预测患者预后&am…

【Oracle】实验二 体系结构、存储结构与各类参数

【实验目的】 理解Oracle体系结构了解初始化参数文件以及初始化参数的含义掌握查看三类数据字典视图和动态性能视图的方法 【实验内容】 如何查看初始化参数&#xff1f;有哪几种方法&#xff1f;初始化参数文件有几种&#xff1f;默认的保存位置在哪里&#xff1f;在SQL*Pl…

L57---112.路径总和(广搜)---Java版

1.题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。叶子节点 是指…

DVWA 靶场 Weak Session IDs 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

https://curl.trillworks.com不能用的解决方法

gitee源码:https://gitee.com/Project0ne/curlconverter 首先打开上面的链接 然后下载文件 下载文件到本地 然后安装node.js(Node.js official website.)不会的自行百度,这里不做过多赘述。 在curlconverter文件夹下面打开终端(在文件夹下面右键-在终端打开) 输入 npm…

文本分析-中文停用词集合(结合百度停用词表、哈工大停用词表、四川大学机器智能实验室停用词库、中文停用词表等)

将这4个停用词表进行组合并去重。 # _*_coding:utf-8 _*_import os #得到当前文件路径 current_pathos.getcwd() #获取文件列表 list_fileos.listdir(current_path) #用来存储停用词 temp_stopwords[] for file in list_file:file_tailfile.split(.)[-1]#只要txt格式的文件if f…

Kylin系列:架构和高级功能详解

目录 一、Kylin的架构 1.1 总体架构概述 1.2 数据源 1.3 元数据存储 1.4 构建引擎 1.5 存储引擎 1.6 查询引擎 1.7 用户接口 二、Kylin的高级功能 2.1 多维立方体(Cube) 2.1.1 Cube的定义 2.1.2 Cube的构建 2.2 查询优化 2.3 数据模型和星型模式 2.3.1 数据模…

我做了个Hexo博客

最近花了两个周末的时间边学变做Hexo博客&#xff0c;最终成品地址如下&#xff1a; https://blog.mybatis.io 下面先说说做博客的经过&#xff0c;想做Hexo博客一开始是因为看到了 hexo-theme-icarus 主题&#xff0c;这个主题样式如下&#xff1a; 首页 内容页 这个主题是…

字节豆包全新图像Tokenizer:生成图像最低只需32个token,最高提速410倍

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 在生成式模型的迅速发展中&#xff0c;Image Tokenization 扮演着一个很重要的角色&#xff0c;例如Diffusion依赖的VAE或者是Transformer依赖的VQGAN。这些Tokenizers会将图像编码至一个更为紧凑的隐…

AI味太重怎么办?1个超简单的方法就能解决

我们知道随着GPT技术的迅速发展&#xff0c;解决了我们大部分写作的难题。但是很多小伙伴想必都会遇到同样的问题&#xff0c;就是写出来的文章太正式-我们叫这“AI味”。 这AI味让人感觉内容虽然条理清楚&#xff0c;但就是缺了点人情味&#xff0c;读起来不够亲切。 其实&a…

獭崎酱酒:传承百年酱香,品味经典之选

在中国白酒文化中&#xff0c;酱香型白酒以其独特的风味和精湛的酿造工艺&#xff0c;一直受到广大酒友的青睐。而在众多酱香型白酒品牌中&#xff0c;獭崎酱酒以其传承百年的酱香工艺和高品质的产品&#xff0c;成为了众多酒友心中的经典之选。    | | | |–|–| | | | 百…

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子&#xff0c;介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm1001.2014.3001.5501文章浏览阅读323次&#xff0c;点赞4次&#xff0c;收藏2次。搞3D几何内核算法研究&#xff0c;必须学习NURBS样条曲线…

L56---226.翻转二叉树(广搜)---Java版

1.题目描述 2.思路和知识点 &#xff08;1&#xff09;按照每层来划分&#xff0c; 第一层是2^0&#xff08; 1&#xff09; 第二层是2^1&#xff08;2&#xff0c;3&#xff09; 第三层是2^2 &#xff08;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff09; 第n层是2^(n-…

栅格数据重心迁移变化分析

目前网络上大多是针对矢量重心迁移进行计算&#xff0c;或把栅格转矢量在进行计算&#xff0c;可以不用怎么麻烦&#xff0c;可以直接利用栅格进行得出多期数据的重心&#xff0c;然后进行变化分析等方面的分析。 矢量数据可以通过下面方式进行重心计算&#xff1a; 使用ArcGIS…