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

// 矩形裁剪图片, 透明
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");
        }
    }

}

裁剪后的效果图片:

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用API有效率地管理Dynadot域名,为文件夹中的域名统一设置whois信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

基于SSM+Vue+微信小程序的大学生就业平台系统+毕业论文

项目包含前台和后台两部分&#xff1a;多角色登录&#xff0c;功能完善&#xff0c;界面优美 前台主要功能实现&#xff1a;首页列表查看、求职信息管理、简历管理、面试邀请管理、个人中心等 后台主要功能实现&#xff1a;首页、个人中心、学生管理、企业管理、企业类型管理…

若依 ruoyi 显示隐藏搜索框 显示隐藏列

一、 显示隐藏搜索框 页面搜索关键字 showSearch&#xff0c;设置是否显示 隐藏&#xff1a; 显示&#xff1a; 二、自定义设置 显示隐藏列 1. 页面搜索关键字 right-toolbar&#xff0c;新增&#xff1a; :columns"columns" 2. js下 data(){return{}}中新增&am…

如何覆盖!important修饰的属性

最简单的方法 如果这个!important修饰的属性 是自己的写的&#xff0c;去掉这种写法&#xff0c;使用优先级的方式来写这个属性&#xff08;.outter .inner 的优先级就会比 。outter的优先级高&#xff09; 复杂的方法&#xff1a;用魔法打败魔法 但是这个样式来自于全局css&am…

【计算机毕业设计】185餐厅点餐微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

百度网盘的文件该怎么整理?不如试试这个整理工具

科学的文件架构 一键生成文件夹层级工具 极具妥帖的秩序感受 又是一周&#xff0c;好久不见&#xff0c;正琢磨着这次给大家带来点什么好东西&#xff0c;突然百度网盘的整理让我头疼不已&#xff0c;从我记事以来&#xff0c;这网盘已经整理过N遍了&#xff0c;总是乱了整理…

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称&#xff1a;WRHEES 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;…

day2-web安全漏洞攻防-基础-弱口令、HTML注入(米斯特web渗透测试)

day2-web安全漏洞攻防-基础-弱口令、HTML注入&#xff08;米斯特web渗透测试&#xff09; 1&#xff0c;漏洞2&#xff0c;弱口令3&#xff0c;爆破&#xff08;1&#xff09;Burpsuite&#xff08;2&#xff09;攻击类型 4&#xff0c;HTML针剂注入 1&#xff0c;漏洞 挖掘和利…

DataStructure.时间和空间复杂度

时间和空间复杂度 【本节目标】1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例3.4.1 示例13.4.2 示例23.4.3 示例33.4.4 示例43.4.5 示例53.4.6 示例63.4.7 示例7 4.空间复杂度4.1 示…

【Java】pcm 与 wav 格式互转工具类 (附测试用例)

文章目录 1. 前言1.1 背景1.2 目标1.3 亮点 2. 用例说明3. 补充验证4. 相关链接 1. 前言 git 仓库 https://github.com/ChenghanY/pcm-wav-converter 1.1 背景 系统新接入语音引擎。 语音引擎只认 pcm 格式数据。前端只认 wav 格式 。 需要后端对 pcm 和 wav 格式实现互转&a…

SpringCloud Alibaba Sentinel中@SentinelResource使用实践总结

Sentinel 提供了 SentinelResource 注解用于定义资源&#xff0c;并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。 注意&#xff1a;注解方式埋点不支持 private 方法。 【1】资源名称限流 ① controller方法 GetMapping("/byResource") Senti…

汽车网络安全 -- 漏洞该如何管理

目录 1.漏洞获取途径汇总 2.CAVD的漏洞管理规则简析 2.1 通用术语简介 2.2 漏洞评分指标 2.3.1 场景参数 2.3.2 威胁参数 2.3.3 影响参数 2.3 漏洞等级判定 ​3.小结 在汽车网络安全的时代背景下&#xff0c;作为一直从事车控类ECU基础软件开发的软件dog&#xff0c;…

openjudge_2.5基本算法之搜索_917:Knight Moves

题目 917:Knight Moves 总时间限制: 1000ms 内存限制: 65536kB 描述 Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast. Can you beat him? The Problem Your task is to wr…

利用MSSQL模拟提权

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 利用MSSQL模拟提权 在MS SQL数据库&#xff0c;可以使用EXECUTE AS语句&#xff0c;以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟&#xff08;Impers…

线程间通信方式(互斥(互斥锁)与同步(无名信号量、条件变量))

1通信机制&#xff1a;互斥与同步 线程的互斥通过线程的互斥锁完成&#xff1b; 线程的同步通过无名信号量或者条件变量完成。 2 互斥 2.1 何为互斥&#xff1f; 互斥是在多个线程在访问同一个全局变量的时候&#xff0c;先让这个线程争抢锁的资源&#xff0c;那个线程争抢…

学会python——对目录的操作(python实例十)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、遍历当前目录 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、删除目录中的文件 4.1 代码构思 4.2 代码示例 4.3 运行结果 5、总计 1、认识Python Python 是一个高层次的结合了解释性…

Linux-安装及管理程序

目录 一、Linux应用程序基础 1、应用程序与系统命令的关系 2、 典型应用程序的目录结构 3、常见的软件包封装类型 二、RPM包管理工具 1、RPM包管理器 2、RPM软件包 ​3、RPM的命令格式 4、RPM命令的常用选项 5、RPM安装 三、 yum安装 1、yum源介绍 1.1、本地yum源 …

ClosedXML

一、类库介绍 ClosedXML是一个用于读取、操作和写入Excel 2007 (.xlsx, .xlsm)文件的.NET第三方库。它基于OpenXML&#xff0c;但与OpenXML相比&#xff0c;ClosedXML具有更高的性能和更易于使用的API接口。 ClosedXML支持XML文档的解析和生成&#xff0c;可以处理复杂的XML结…

程序员如何高效读代码?

程序员高效读代码的技巧包括以下几点&#xff1a; 明确阅读目的&#xff1a;在开始阅读代码之前&#xff0c;先明确你的阅读目的。是为了理解整个系统的架构&#xff1f;还是为了修复一个具体的bug&#xff1f;或者是为了了解某个功能是如何实现的&#xff1f;明确目的可以帮助…

系统安全设计规范(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取&#xff1a;私信或者进主页。…