android 实现在照片上绘制涂鸦的方法
作者:雨幕青山 发布时间:2023-09-17 13:24:49
标签:android,绘制,涂鸦
这个应该是简易版的美图秀秀(小伙伴们吐槽:你这也叫简易版的??我们看着怎么不像啊……)。好吧,只是在图片上绘制涂鸦,然后保存。
一、选择图片
这个道长有必要说一下,在绘制涂鸦时,笔画会根据设置ImageView的大小和屏幕的尺寸(不是像素)产生误差。这个道长暂时还没有找到解决方法,只是规避了一下。
把ImageView设置为全屏,布局文件代码如下
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_draw_pic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_choose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:text="选择照片" />
<Button
android:id="@+id/btn_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_margin="5dp"
android:layout_weight="1"
android:text="保存照片" />
<Button
android:id="@+id/btn_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_margin="5dp"
android:layout_weight="1"
android:text="擦除笔迹" />
</RelativeLayout>
</FrameLayout>
根据机型设置缩放比例
switch (model){
case "MI 4LTE":
scale = 1.1f;
break;
case "HUAWEI NXT-AL10":
scale = 1.5f;
break;
}
效果图如下
二、绘制涂鸦
实现代码如下:
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_DOWN:
downX = motionEvent.getX() * scale;
downY = motionEvent.getY() * scale;
break;
case MotionEvent.ACTION_UP:
upX = motionEvent.getX() * scale;
upY = motionEvent.getY() * scale;
canvas.drawLine(downX, downY, upX, upY, paint);
iv_drawpicture.invalidate();
break;
case MotionEvent.ACTION_MOVE:
upX = motionEvent.getX() * scale;
upY = motionEvent.getY() * scale;
canvas.drawLine(downX, downY, upX, upY, paint);
iv_drawpicture.invalidate();
downX = upX;
downY = upY;
break;
default:
break;
}
return true;
}
效果图如下:
三、保存绘制涂鸦后的图片
实现代码如下:
try {
Uri imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
OutputStream os = getContentResolver().openOutputStream(imageUri);
//compress方法将图片转换成JPG或者PNG格式
drawBitmap.compress(Bitmap.CompressFormat.JPEG, 90, os);
Toast.makeText(this, "Saved:" + imageUri.toString(), Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
四、擦除涂鸦笔迹
实现代码如下:
drawBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
canvas = createCanvas(drawBitmap);
paint = createPaint();
canvas.drawBitmap(bmp, 0, 0, paint);
iv_drawpicture.setImageBitmap(drawBitmap);
iv_drawpicture.setOnTouchListener(this);
在照片上绘制涂鸦暂时就到这里,功能比较单一。
来源:https://blog.csdn.net/JJ583500596/article/details/72638595
0
投稿
猜你喜欢
- 本文实例为大家分享了Android端实现文件上传的具体代码,供大家参考,具体内容如下1)、新建一个Android项目命名为androidUp
- 在android中常用存储数据的基本就三种,sqlite,SharedPreferences,文件存储,其中针对于对象存储,使用sqlite
- 这篇文章主要介绍了Java实现顺序栈原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
- 文件夹,文件这是常见的,怎么创建?要不要先判断是否存在?非常非常基础的知识点using System;using System.Collec
- 配置文件概述:应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改
- Path接口1、Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路径,例如 / 或 C:\ ,而
- js和python是两种语言,js处理网页数据,python可作为服务端开发,两者通过websocket进行通信。websocket是soc
- 在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据
- transferTo(File file)的路径问题今天看到layui的文件上传的控件,就尝试了一下。简单创建了一个SpringMVC项目。
- 在没介绍正文之前,先给大家介绍下websocket的背景和原理:背景在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双
- 本文实例讲述了C#实现Excel导入sqlite的方法,是非常实用的技巧。分享给大家供大家参考。具体方法如下:首先需要引用system.da
- 目录前言整合swagger api自定义配置信息简单使用Swagger常用注解Api标记ApiOperation标记ApiParam标记Ap
- 一、JVM 内存模型根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。1、虚拟机栈:每个线程有一个
- 我们都知道mybatis在进行参数判断的时候,直接可以用<if test=""></if> 就可
- 大家可以自行百度下阿里分布式事务,在这里我就不啰嗦了。下面是阿里分布式事务开源框架的一些资料,本文是springboot+dubbo+fes
- 目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后
- 项目需要对接外部接口,将图片文件流发送到外部接口,下面代码就是HttpsURLConnection如何上传文件流:/** *
- 谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurren
- 这个导出网站功能指通过前台javascript触发进入ashx函数中,实现将服务器中某个文件夹(包含其子文件夹和文件)通通复制到服务器中另一
- 1. 概述官方JavaDocsApi: javax.swing.JButtonJButton,按钮。JButton 常用构造方法:// 创建