需要图片集和源码请点赞关注收藏后评论区留言~~~

所谓抠图神器,就是从一副图片中扣出用户想要的某块区域

一、需求描述

美图的修图功能如此强大,离不开专业的图片加工技术,抠图便是其中重要的一项功能。在App界面底部点击抠图按钮,再选择下方的形状按钮就会出现等待抠图的目标区域,然后通过手指触摸挪动方框,也可两指并用缩放或者旋转方框,调整方框大小以及角度后,再点击右下角的三点按钮,选择弹出菜单中的存为贴纸,就可以在贴纸功能中查看已经扣好的图片。

示意图如下

二、功能分析

抠图工具通过对图像进行平移,缩放,旋转等操作把图像的某个区域扣下来,抠图工具要提供打工图片和保存图片两种操作,其中打开图片支持从手机相册选取待加工的原始图片,保存图片支持把抠出来的图像保存到存储卡

打开原始图片后 工具界面进入抠图模式 主界面上没有任何控制按钮,抠哪个区域完全靠手势操作 需要实现的手势处理有以下五种

1:挪动高亮区域的手势

2:调整高亮区域边界的手势

3:挪动图片的手势

4:缩放图片的手势

5:旋转图片的手势

三、效果展示

演示视频如下

美图秀秀

点击右上角的三角按钮 可以打开和保存图片

下面用我们熟知的足坛巨星C罗举例

可以对图像进行放缩 旋转等操作

四、代码

java类

package com.example.event;import com.example.event.util.BitmapUtil;
import com.example.event.util.DateUtil;
import com.example.event.widget.BitmapView;
import com.example.event.widget.MeituView;
import com.example.event.widget.MeituView.ImageChangetListener;import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;public class MeituActivity extends Activity implements ImageChangetListener {private final static String TAG = "MeituActivity";private int CHOOSE_CODE = 3; // 只在相册挑选图片的请求码private MeituView mv_content; // 声明一个美图视图对象private BitmapView bv_content; // 声明一个位图视图对象private TextView tv_hint; // 声明一个文本视图对象@Overrideprotected void onCreate(Bundle savedInstanceState) {private void initView() {Toolbar tl_head = findViewById(R.id.tl_head);tl_head.setTitle("抠图工具");setSupportActionBar(tl_head); // 替换系统自带的ActionBar// 设置工具栏左侧导航图标的点击监听器tl_head.setNavigationOnClickListener(view -> finish());mv_content = findViewById(R.id.mv_content);mv_content.setImageChangetListener(this); // 设置美图视图的图像变更监听器bv_content = findViewById(R.id.bv_content);bv_content.setDrawingCacheEnabled(true); // 开启位图视图的绘图缓存tv_hint = findViewById(R.id.tv_hint);}private void setSupportActionBar(Toolbar tl_head) {}// 刷新图像展示private void refreshImage(boolean is_first) {Bitmap bitmap = bv_content.getDrawingCache(); // 从绘图缓存获取位图对象mv_content.setOrigBitmap(bitmap); // 设置美图视图的原始位图if (is_first) { // 首次打开int left = bitmap.getWidth() / 4;int top = bitmap.getHeight() / 4;// 设置美图视图的位图边界mv_content.setBitmapRect(new Rect(left, top, left * 2, top * 2));} else { // 非首次打开// 设置美图视图的位图边界mv_content.setBitmapRect(mv_content.getBitmapRect());}}// 在图片平移时触发@Overridepublic void onImageTraslate(int offsetX, int offsetY, boolean bReset) {bv_content.setOffset(offsetX, offsetY, bReset); // 设置位图视图的偏移距离refreshImage(false); // 刷新图像展示}// 在图片缩放时触发@Overridepublic void onImageScale(float ratio) {bv_content.setScaleRatio(ratio, false); // 设置位图视图的缩放比率refreshImage(false); // 刷新图像展示}// 在图片旋转时触发@Overridepublic void onImageRotate(int degree) {bv_content.setRotateDegree(degree, false); // 设置位图视图的旋转角度refreshImage(false); // 刷新图像展示}// 在图片点击时触发@Overridepublic void onImageClick() {}// 在图片长按时触发@Overridepublic void onImageLongClick() {}// 在创建选项菜单时调用@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_meitu, menu);return true;}// 在选中菜单项时调用@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.menu_file_open) { // 点击了“打开文件”// 创建一个内容获取动作的意图(准备跳到系统相册)Intent albumIntent = new Intent(Intent.ACTION_GET_CONTENT);albumIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false); // 是否允许多选albumIntent.setType("image/*"); // 类型为图像startActivityForResult(albumIntent, CHOOSE_CODE); // 打开系统相册} else if (item.getItemId() == R.id.menu_file_save) { // 点击了“保存文件”Bitmap bitmap = mv_content.getCropBitmap(); // 获取美图视图处理后的位图// 生成图片文件的保存路径String path = String.format("%s/%s.jpg",getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(),DateUtil.getNowDateTime());BitmapUtil.saveImage(path, bitmap); // 把位图保存为图片文件BitmapUtil.notifyPhotoAlbum(this, path); // 通知相册来了张新图片Toast.makeText(this, "已保存抠好的图片 "+path, Toast.LENGTH_SHORT).show();}return super.onOptionsItemSelected(item);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);if (resultCode == RESULT_OK && requestCode == CHOOSE_CODE) { // 从相册返回if (intent.getData() != null) { // 从相册选择一张照片Uri uri = intent.getData(); // 获得已选择照片的路径对象// 根据指定图片的uri,获得自动缩小后的位图对象Bitmap bitmap = BitmapUtil.getAutoZoomImage(this, uri);bv_content.setImageBitmap(bitmap); // 设置位图视图的位图对象refreshImage(true); // 刷新图像展示tv_hint.setVisibility(View.GONE);}}}}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.appcompat.widget.Toolbarandroid:id="@+id/tl_head"android:layout_width="match_parent"android:layout_height="50dp"android:background="@color/blue_light"app:navigationIcon="@drawable/icon_back" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"><com.example.event.widget.BitmapViewandroid:id="@+id/bv_content"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:scaleType="centerCrop" /><com.example.event.widget.MeituViewandroid:id="@+id/mv_content"android:layout_width="match_parent"android:layout_height="match_parent" /><TextViewandroid:id="@+id/tv_hint"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="请点击右上角的三点图标,先打开图片文件,再开始抠图操作"android:textColor="@color/black"android:textSize="17sp" /></RelativeLayout>
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)相关推荐

  1. 【Android App】实战项目之仿微信的附近的人(附源码和演示 超详细)

    需要全部源码请点赞关注收藏后评论区留言私信~~~ 艺术家常说"距离产生美",其实距离近才是优势,谁不希望自己的工作事少钱多离家近呢?不光是工作,像租房买房.恋爱交友,大家都希望找个 ...

  2. 【Android App】实战项目之仿拼多多的直播带货(附源码和演示 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 近年来电商业态发生了不小的改变,传统的电商平台把商品分门别类,配上精美的图文说明供消费者挑选,新潮的电商平台则请来明星网红,开启直播秀向广大粉丝推销商品, ...

  3. Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.帧动画 Android的动画分为三类,帧动画,补间动画和属性动画.其中帧动画是实现原理最简单的一种,跟现实生活中的电影胶卷类似,都是在短时间内连续 ...

  4. Android App开发实战项目之购物车(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.需求描述 电商App的购物车可谓是司空见惯了,可以知道购物车除了底部有一个结算行,其余部分主要是已加入购物车的商品列表,然后每个商品左边是商品小图,右边是 ...

  5. Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 动感影集就是只要用户添加一张图片,动感影集就能给每张图片渲染不同的动画效果,让原本静止的图片变得活泼起来,辅以各种精致的动画特效,营造一种赏心悦目的感 ...

  6. Android App开发实战项目之仿喜马拉雅的听说书App实现(超详细 附源码和演示视频)

    需要全部源码请点赞关注收藏后评论区留下QQ~~~ 一.需求分析 用户不仅能在平台上收听音频,还能成为内容创作者,总之长音频分享平台需要满足两种角色的使用:一种是作为内容创作者发布自己的音频,另一种是作 ...

  7. Android App开发实战项目之大头贴App功能实现(附源码和演示 简单易上手)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.需求描述 大头贴App有两个特征,第一个是头要大,拿来一张照片后把人像区域裁剪出来,这样新图片里的人头才会比较大,第二个是在周围贴上装饰物,而且装 ...

  8. 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)

    需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影,都是把三维的物体投影到平面上,其实仍旧呈现二维的模拟画面. 随着科技的发展,传统的成像手段越来越凸显出局限性,缘由在于人们需要一种更逼 ...

  9. 【Android App】实战项目之实现你问我答的智能语音机器人(超详细 附源码和演示视频)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.需求描述 想必大家都见过商场里的智能语音机器人,你对它提问时它可以自动回答你的问题,接下来我们也实现这样一个机器人,它依靠语音技术完成问询服务 基 ...

最新文章

  1. LiveVideoStackCon 音视频技术大会 2022 上海站日程发布啦!
  2. metrics-server最新版本有坑,慎用
  3. 农贸自由化对话国际农民丰收节贸易会:东北粮食贸易对策
  4. 京东价格情报员 比价是假 砸场子是真
  5. [No0000E6]C# 判断与循环
  6. 数组排序最小复杂度_进行排序的最小缺失数
  7. volatile关键字的使用
  8. 通过代码生成机制实现强类型编程-CodeSimth版
  9. linux主机设备acl,linux上的终端类型、ACL、PAM模块
  10. 管理感悟:方案能力与解决问题能力
  11. Rust : 如何use本地化crate与 dependencies 和 path
  12. 负载均衡软件LVS分析四(测试)
  13. android word分页,word文档如何设置分页以及取消分页
  14. HTML5基础基础练习题
  15. 会议纪要模板----邮件
  16. 2011不同阶层理财大盘点
  17. 阿里90后运营的工作总结,细致而深刻!
  18. 理解Kotlin密封类Sealed
  19. Oracle- imp/impdp导入dmp文件
  20. 博弈论(Game Theory)

热门文章

  1. Apache Tomcat UTF-8编码漏洞[转载至邪恶八进制]
  2. VC正则表达式的使用(《VC知识库》)
  3. java爬虫抓取漫画,一二三部下载到本地
  4. 粒子群算法和遗传算法求多元函数的最大值、最小值对比
  5. java数据结构之数组
  6. matlab 取点画图,matlab绘图小技巧-图像光滑数据取点
  7. 百度推广计划改为计算机端,百度推广怎么样搭建一个优秀的推广计划
  8. PAL制式视频信号的处理
  9. ArcGIS中做一张新闻1+1演播厅背景图(附世界矢量地图.shp下载)
  10. ros笔记 URDF仿真 3.joint