android中使用Bitmp对象绘制图形

news2024/11/19 8:44:49

1、引言

       你是否还在因为不懂UI设计而不得不去借用别人的图片,甚至使用各种网图作为界面布局的一部分,那么今天就教你使用Bitmap对象去绘制自定义图形,并保存为png格式的图片,须知图片编辑软件本就是程序员开发出来的,我们又何必舍近求远呢,用代码生成岂不是更爽?

2、实现步骤

2.1、Bitmap对象创建

        使用下面的方法创建Bitmp对象,第一个参数代表创建的位图宽度,第二个是位图高度,宽度和高度的单位都是像素,第三个是设置为支持透明背景,这里要注意高度和宽度必须大于0,后面索引也是从零开始。

Bitmap customBitmap = Bitmap//通过控制每一个像素点生成bitmap对象,可以用这种方式生成图片
                        .createBitmap(501, 501, Bitmap.Config.ARGB_8888);//按像素设置

2.2、形状绘制

        这里我以绘制透明背景圆形图片为例,并提供两种方法,第一种方法不适合绘制圆形,但可以用来绘制多边形。由于是绘制圆形,需要使用函数计算位置,我这里提供了用于计算圆的坐标的函数。

2.1.1、圆的标准方程函数

        这个函数借助圆的标准方程计算圆的坐标。

    /**
     * 已知圆的半径,圆心坐标,x坐标,求圆的y坐标
     * @param r 圆的半径
     * @param rx 圆心x坐标
     * @param ry 圆心y坐标
     * @param x 圆的某个位置的x坐标或y坐标,默认是根据x坐标求y坐标,如果需要根据y坐标求x坐标,
     *          那么互换rx和ry位置,传入y坐标,返回的结果就是x坐标
     */
    public static double[] circle(double r,double rx,double ry,double x){
        double[] result;
        //因为是标准方程且一定有解,所以传入的第一个参数始终为1
        double b=-2*ry;
        double c=ry*ry+x*x-2*rx*x+rx*rx-r*r;
        result=quadratic_equation_one(1,b,c);
        return result;
    }

2.1.2、一元二次方程函数

        圆的计算过程中要用到一元二次方程,所以这里提供计算一元二次方程的方法。

    /**
     * 一元二次方程求解
     * @param a 二次项系数
     * @param b 一次项系数
     * @param c 常数
     * @return 计算结果返回数组
     */
    public static double[] quadratic_equation_one(double a,double b,double c){
        double[] result=null;//3、小于0:有两个复根,一般不考虑这种情况但为了完整都写好
        //三种情况
        double data=b*b-4*a*c;
        if (data>0){//1、大于0:有两个实根
            result=new double[2];
            result[0]=(-b+Math.sqrt(data))/(2*a);
            result[1]=(-b-Math.sqrt(data))/(2*a);
        }else if (data==0){//2、等于0:有一个实根
            result=new double[1];
            result[0]=(-b)/(2*a);
        }
        return result;
    }

3、绘制方法

3.1、方法一:直接绘制

                //方法一:直接绘制圆,部分区域会被错过
                int i,j;
                for (i = 0; i < 500; i++) {
                    //判断在圆的范围内才绘制
                    for (j = 0; j < 250; j++) {
                        result=UiMath.circle(250-j,250,250,i-j);
                        if (result!=null){
                            if (result.length==1){//传入的x和y值必须大于0
                                customBitmap.setPixel(i-j, (int) result[0],Color.parseColor("#ff0000"));
                                customBitmap.setPixel((int) result[0],i-j,Color.parseColor("#ff0000"));
                            }else if (result.length==2){
                                customBitmap.setPixel(i-j, (int) result[0],Color.parseColor("#ff0000"));
                                customBitmap.setPixel(i-j, (int) result[1],Color.parseColor("#ff0000"));
                                customBitmap.setPixel((int) result[0],i-j,Color.parseColor("#ff0000"));
                                customBitmap.setPixel((int) result[1],i-j,Color.parseColor("#ff0000"));
                            }
                        }
                    }
                }

3.2、方法二:反向绘制

        先把需要绘制的区域全部填充颜色,然后的圆形以外的区域设置为透明色。

//方法二:反向绘制
//1、先绘制背景色
for (i = 0; i < 500; i++) {
    //判断在圆的范围内才绘制
    for (j = 0; j < 500; j++) {
        customBitmap.setPixel(i,j,Color.parseColor("#ff0000"));
    }
}
//2、去除多余区域
for (i = 0; i < 500; i++) {
    result=UiMath.circle(250,250,250,i);
    if (result!=null){
        if (result.length==1){//传入的x和y值必须大于0
            for (j = 0; j < 500; j++) {
                if (j<result[0] || j>result[0]){
                    customBitmap.setPixel(i, j,Color.parseColor("#00000000"));
                }
            }
        }else if (result.length==2){
            for (j = 0; j < 500; j++) {
                if (j<result[1] || j>result[0]){
                    customBitmap.setPixel(i, j,Color.parseColor("#00000000"));
                }
            }
        }
    }
}

4、保存图片

        调用下面这个方法保存图片,如果保存为jpg格式是没有透明效果的。

    /**
     * 保存bitmap为图片
     */
    private void saveBitmap(Bitmap bitmap) {
        new Thread(){
            @Override
            public void run() {
                File file=new File(getExternalFilesDir(null),"now.png");
                try {
                    FileOutputStream fos=new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG,90,fos);
                    fos.flush();
                    fos.close();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(CreateBitmapActivity.this,"保存完成",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }.start();
    }

5、效果演示

5.1、方法一效果演示

5.2、方法二效果演示

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

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

相关文章

fast.ai 机器学习笔记(四)

机器学习 1&#xff1a;第 11 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-11-7564c3c18bbb 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续…

Frostmourne (霜之哀伤)日志告警系统部署安装

简介 Frostmourne(霜之哀伤)是汽车之家经销商技术部监控系统的开源版本&#xff0c;用于帮助监控几乎所有数据库数据(包括Elasticsearch, Prometheus, SkyWalking, MySql 等等)。如果你已经建立起了日志系统&#xff0c; 指标体系&#xff0c;却苦恼于没有一个配套监控系统&am…

【第二十三课】最小生成树:prime 和 kruskal 算法(acwing858,859 / c++代码 )

目录 前言 Prime算法--加点法 acwing-858 代码如下 一些解释 Kruskal算法--加边法 acwing-859 并查集与克鲁斯卡尔求最小生成树 代码如下 一些解释 前言 之前学最短路的时候&#xff0c;我们都是以有向图为基础的&#xff0c;当时我们提到如果是无向图&#xf…

二、Mybatis相关概念

1.对象/关系数据库映射&#xff08;ORM) ORM全称Object/Relation Mapping&#xff1a;表示对象-关系映射的缩写ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后&#xff0c;程序员既可以利用面向对象程序设计语言的简单易用性&#xff0c;又可以利用关系数…

Swift 隐藏宝藏:“逆天改命”调整方法重载(function overloading)优先级

概览 在 Swift 语言中有很多隐藏“宝藏”悄悄深埋在不为人知的角落&#xff0c;静静等待着有缘秃头码农们的大力挖掘。 而在这里&#xff0c;我们将介绍 Swift 语言中一个非常有用的秘技&#xff1a;方法重载优先级判断以及如何改变它。 在本篇博文中&#xff0c;您将学到如下…

巴尔加瓦算法图解:算法运用(上)

目录 树反向索引傅立叶变换 并行算法MapReduce函数 树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个…

7点原因,解密可视化大屏为啥要3D效果

真实感&#xff1a; 3D效果可以让用户感受到更真实的视觉效果&#xff0c;让用户更加身临其境&#xff0c;增强用户的参与感和沉浸感。 立体感&#xff1a; 3D效果可以给用户带来更强的立体感&#xff0c;让用户更加容易理解和感知物体的形状和大小。 美观性&#xff1a; 3D…

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…

【OrangePi Zero2 智能家居】阿里云人脸识别方案

一、接入阿里云 二、C语言调用阿里云人脸识别接口 三、System V消息队列和POSIX 消息队列 一、接入阿里云 在之前树莓派的人脸识别方案采用了翔云平台的方案去1V1上传比对两张人脸比对&#xff0c;这种方案是可行&#xff0c;可 以继续采用。但为了接触更多了云平台方案&…

8种基本类型的包装类(与String的转换)

java针对8种基本数据类型&#xff0c;定义了相应的引用类型&#xff1a;包装类(封装类)&#xff0c;有了类的特点&#xff0c;就能调用类中的方法&#xff0c;java才是真正的面向对象。 基本数据类型 包装类byte Byteshort Shortint Integerlong Longfloat Floa…

Infuse通过Alist添加115网盘资源

说明 通过Alist代理管理115网盘&#xff0c;Infuse再添加Alist代理的115网盘的WebDAV 准备一台Linux服务器安装Alist 我这里用的华为云CentOS7&#xff0c;使用Docker容器 安装Alist docker run -d --restartalways -v /etc/alist:/opt/alist/data -p 5244:5244 -e PUID0 …

SegmentAnything官网demo使用vue+python实现

一、效果&准备工作 1.效果 没啥好说的&#xff0c;低质量复刻SAM官网 https://segment-anything.com/ 需要提一点&#xff1a;所有生成embedding和mask的操作都是python后端做的&#xff0c;计算mask不是onnxruntime-web实现的&#xff0c;前端只负责了把rle编码的mask解…

[架构之路-275]:五张图向你展现软件开发不仅仅是编码,而是一个庞大的系统工程

目录 一、软件开发是组织架构的一部分&#xff0c;是为业务服务的 二、软件开发是一个系统工程&#xff0c;需要组织各种组织内的资源 三、目标软件是一个复杂的系统 四、软件开发过程本身是一个系统工程 五、目标软件的测试验证是一个系统工程 一、软件开发是组织架构的一…

MYSQL笔记:约束条件

MYSQL笔记&#xff1a;约束条件 主键约束 不能为空&#xff0c;值必须是不同的&#xff08;唯一性&#xff09; 一个表只能修饰一个主键 PRIMARY KEY自增约束 AUTO_INCREMENT唯一键约束 可以为空 unique非空约束 not null 默认值约束 default 外键约束 foreign key …

基于图像掩膜和深度学习的花生豆分拣(附源码)

目录 项目介绍 图像分类网络构建 处理花生豆图片完成预测 项目介绍 这是一个使用图像掩膜技术和深度学习技术实现的一个花生豆分拣系统 我们有大量的花生豆图片&#xff0c;并以及打好了标签&#xff0c;可以看一下目录结构和几张具体的图片 同时我们也有几张大的图片&…

Qt网络编程-ZMQ的使用

不同主机或者相同主机中不同进程之间可以借助网络通信相互进行数据交互&#xff0c;网络通信实现了进程之间的通信。比如两个进程之间需要借助UDP进行单播通信&#xff0c;则双方需要知道对方的IP和端口&#xff0c;假设两者不在同一主机中&#xff0c;如下示意图&#xff1a; …

【C语言】SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)

一、SYSCALL_DEFINE3与系统调用 在Linux操作系统中&#xff0c;为了从用户空间跳转到内核空间执行特定的内核级操作&#xff0c;使用了一种机制叫做"系统调用"&#xff08;System Call&#xff09;。系统调用是操作系统提供给程序员访问和使用内核功能的接口。例如&…

OnlyOffice-8.0版本深度测评

OnlyOffice 是一套全面的开源办公协作软件&#xff0c;不断演进的 OnlyOffice 8.0 版本为用户带来了一系列引人瞩目的新特性和功能改进。OnlyOffice 8.0 版本在功能丰富性、安全性和用户友好性上都有显著提升&#xff0c;为用户提供了更为强大、便捷和安全的文档处理和协作环境…

【Docker】02 镜像管理

文章目录 一、Images镜像二、管理操作2.1 搜索镜像2.1.1 命令行搜索2.1.2 页面搜索2.1.3 搜索条件 2.2 下载镜像2.3 查看本地镜像2.3.1 docker images2.3.2 --help2.3.3 repository name2.3.4 --filter2.3.5 -q2.3.6 --format 2.4 给镜像打标签2.5 推送镜像2.6 删除镜像2.7 导出…

React18原理: 渲染与更新时的重点关注事项

概述 react 在渲染过程中要做很多事情&#xff0c;所以不可能直接通过初始元素直接渲染还需要一个东西&#xff0c;就是虚拟节点&#xff0c;暂不涉及React Fiber的概念&#xff0c;将vDom树和Fiber 树统称为虚拟节点有了初始元素后&#xff0c;React 就会根据初始元素和其他可…