前言

Android提供了原生的裁剪方式,并输出裁剪后的资源到相应的目录。主要有两种方式,下面我们来看看这两种方式。

由于Android10提出分区储存,我们这里为了方便暂不使用分区储存,通过使用 android:requestLegacyExternalStorage="true"这样的配置来使用原有的存储方式,另外Android7.0对限制了对访问逻辑需要以Uri的方式,需要配置Provider并且创建uri使用FileProvider.getUriForFile()。

一、获取图片的方式

1.使用相机方式即时拍照

/** * 从相机获取图片 */ private void getPicFromCamera() { //用于保存调用相机拍照后所生成的文件 tempFile = new File(Environment.getExternalStorageDirectory().getPath(), System.currentTimeMillis() + ".jpg"); //跳转到调用系统相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //判断版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //如果在Android7.0以上,使用FileProvider获取Uri intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(MainActivity.this, this.getPackageName() + ".fileprovider", tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri); } else { //否则使用Uri.fromFile(file)方法获取Uri intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile)); } startActivityForResult(intent, CAMERA_REQUEST_CODE); }1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

2.使用相册方式选择照片

/** * 从相册获取图片 */ private void getPicFromAlbm() { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, ALBUM_REQUEST_CODE); }1

2

3

4

5

6

7

8

9

二、获取到选择的照片进行裁剪

1.获取到相机拍摄到的照片

代码如下:

case CAMERA_REQUEST_CODE: //调用相机后返回 if (resultCode == RESULT_OK) { //用相机返回的照片去调用剪裁也需要对Uri进行处理 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri contentUri = FileProvider.getUriForFile(MainActivity.this, this.getPackageName() + ".fileprovider", tempFile); cropPhoto(contentUri); } else { cropPhoto(Uri.fromFile(tempFile)); } } break;1

2

3

4

5

6

7

8

9

10

11

12

2.获取到选择的照片

代码如下:

case ALBUM_REQUEST_CODE: //调用相册后返回 if (resultCode == RESULT_OK) { Uri uri = intent.getData(); cropPhoto(uri); } break;1

2

3

4

5

6

3.调用裁剪后返回

代码如下:

case CROP_REQUEST_CODE: //调用剪裁后返回 if (intent == null) { return; } Bundle bundle = intent.getExtras(); if (bundle != null) { //在这里获得了剪裁后的Bitmap对象,可以用于上传 Bitmap image = bundle.getParcelable("data"); //设置到ImageView上 mHeader_iv.setImageBitmap(image); //也可以进行一些保存、压缩等操作后上传 // String path = saveImage("head_output", image); // Log.d("dsadsadsa",path); } break;1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

4.调用系统裁剪图片后返回

代码如下:

/** * 裁剪图片 * * https://www.jianshu.com/p/3b92a0e30828 */ private void cropPhoto(Uri uri) { //在7.0以上系统裁剪完毕之后,会提示“无法保存经过裁剪的图片” //这是因为,我们在7.0以上跨文件传输uri时候,需要用FileProvider,但是这里需要用 //Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile //intent.putExtra("set-as-wallpaper",true); 默认是false,当你弄成true的时候,你就会发现打开不是裁剪的,而是设置为壁纸的操作。 // intent.putExtra("return-data", true);下面就可以获取到该bitmap // if (data != null && data.getParcelableExtra("data") != null) { // mStream = new ByteArrayOutputStream(); // mBitmap = data.getParcelableExtra("data"); // mBitmap.compress(Bitmap.CompressFormat.PNG, 100, mStream); // /**图片可以应用了*/ // /**接下来就是上传到服务器*/ // File files = creatFile(mBitmap);//变成文件 // ...后续根据需要来... //} Uri contentUri = Uri.fromFile(new File(getPhotoPath())); Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //Android 7.0需要临时添加读取Url的权限, 添加此属性是为了解决:调用裁剪框时候提示:图片无法加载或者加载图片失败或者无法加载此图片 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true");//发送裁剪信号,去掉也能进行裁剪 intent.putExtra("scale", true);// 设置缩放 intent.putExtra("scaleUpIfNeeded", true);// 去黑边 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); //上述两个属性控制裁剪框的缩放比例。 //当用户用手拉伸裁剪框时候,裁剪框会按照上述比例缩放。 intent.putExtra("outputX", 300);//属性控制裁剪完毕,保存的图片的大小格式。 intent.putExtra("outputY", 300);//你按照1:1的比例来裁剪的,如果最后成像是800*400,那么按照2:1的样式保存, intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());//输出裁剪文件的格式 intent.putExtra("return-data", true);//是否返回裁剪后图片的Bitmap intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);//设置输出路径 startActivityForResult(intent, CROP_REQUEST_CODE); }1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

5.保存裁剪后返回的图片到指定文件

###如果裁剪时没有设置输出路径,并且返回Bitmap这时就可以输出Bitmap到指定文件

代码如下:

public String saveImage(String name, Bitmap bmp) { File appDir = new File(指定路径); if (!appDir.exists()) { appDir.mkdir(); } String fileName = name + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); return file.getAbsolutePath(); } catch (IOException e) { Log.d("dsadsadsa", e.getLocalizedMessage()); e.printStackTrace(); } return null; }1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

三、注意事项

其中有以下几点需要注意:

outputX和outputY不能为0,有些手不支持为0的情况。

outputX和outputY不能设置太大,我的demo中仅仅设置了300,但部分手机设置600之后系统层出现OOM现象。

return-data属性值只能是true,否则不会返回数据。

URI对象的获取必须是以下代码

Uri.fromFile(new File(crop_path))1

如果写成

Uri.parse(crop_path)1

则可能没有数据返回。

总结

以上就是关于Android系统裁剪的内容,如有错误,烦请指正!!!

参考优秀文章:

文章来源: blog.csdn.net,作者:Jason_Julie,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Jason_Julie/article/details/111831767

android 华为裁剪全图,调用Android原生裁剪方式裁剪图片并保存相关推荐

  1. h5前端调用android拍照功能,H5调用Android拍照和摄像以及选取相册

    之前一直认为H5调用Android,H5不需要Android配合能直接实现功能.前段时间,自己做这个功能,才发现不是这么回事. H5编写 html文件里只需要标签即可实现代码,代码如下所示: 拍照 ο ...

  2. 华为路由器 android,华为智能路由器亮相 Android系统很强大

    http://roll.sohu.com/20140108/n393146771.shtml 在CES 2014开幕之前,华为就在其MediaLife(终端家庭产品线)官方微博上打出预告,称将在该展会 ...

  3. android 华为开发权限管理,android开发 华为 点击跳转到权限管理页面

    private void goHuaWeiSetting()  { try { //HUAWEI H60-l02 P8max测试通过 Log.d(MainActivity.class.getSimpl ...

  4. ubuntu for android华为荣耀,ubuntu for android - 华为荣耀2上跑ubuntu

    文章是转自某米的 本文链接:http://blog.catjia.com/note/tech/2013_01_1030/ 如今,ubuntu也推出ubuntu for phone版,当然,还在开发中. ...

  5. android音频开发6,Android 音视频开发(一) : 通过三种方式绘制图片

    想要逐步入门音视频开发,就需要一步步的去学习整理,并积累.本文是音视频开发积累的第一篇. 对应的要学习的内容是:在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView ...

  6. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决

    多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...

  7. Android手机调用系统相机拍照、裁剪以及获取Url上传图片

    前言 最近一个人在公司搞独立开发,遇到问题只能自己解决,虽然过程比较坎坷,但是收获还是颇多的,一个人也是要坚强滴,最近弄用户的头像遇到了一些小问题,虽然上一款应用有头像上传,但是发现了其中的一些小问题 ...

  8. android 调用系统的剪切功能,Android实现图片的裁剪(不调用系统功能)

    上一篇文章提及了通过调用系统相册或拍照来实现图片的缩放\裁剪.不过这对于笔者项目的要求同样不适合,笔者需要的是通过对手机屏幕整个进行一个截图,并对这个截图进行裁剪操作. 依靠系统功能确实可以实现图片的 ...

  9. Android多媒体功能开发(4)——调用系统Activity拍照、选择图片、查看图片、裁剪图片

    一.拍照 拍照界面就是调用系统照相机,动作为MediaStore.ACTION_IMAGE_CAPTURE.生成的照片有三种返回方式: 在调用拍照应用的Intent中通过EXTRA_OUTPUT属性设 ...

最新文章

  1. Linux中防火墙(二)
  2. 汇编语言 在存储单元中显示字符串
  3. HTML5 CSS3的新交互特性
  4. matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀
  5. Android studio 使用SVN需要忽略的文件
  6. NAR再版 | 人类长非编码RNA知识库LncRNAWiki 2.0
  7. android webview 下载视频播放 206,Android webview+Html5 video
  8. docker 日志_Filebeat 采集 Docker 日志
  9. GB28181系统设计(四)-横向扩展和纵向扩展
  10. SAP License:SAP顾问如何写运维报告
  11. python爬虫cookie池搭建_爬虫——cookies池的搭建
  12. DELMIA人机工程 ---- 二次开发 第一篇:开发指南
  13. matlab 三维图像 叠加,利用 Matlab构建“波的叠加”图样
  14. SNF快速开发平台2019-权限管理模型-记录级-字段级权限实践
  15. 用键盘控制鼠标移动的Python脚本
  16. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.8 域和指示器概述...
  17. c语言程序由什么开头和结尾,一个完整的C程序由什么组成?
  18. Kafuka面试(整合Kafka两种模式区别)
  19. 社交、工具类应用继续领跑手机app榜单
  20. Unity DC优化技巧

热门文章

  1. RustDesk 搭建一个自己的远程桌面中继服务器
  2. 推荐两款提高效率的软件:clover和autohotkey
  3. PMS-Net: Robust Haze Removal Based on Patch Map for Single Images(基于单幅图像贴图的稳健除雾)
  4. Promise用法及理解
  5. 四维超体运动在三维空间的表现(使用three.js)
  6. 基于JAVA在线家教预约系统计算机毕业设计源码+系统+lw文档+部署
  7. Tegra_Multimedia API 例程学习之--00_video_decode
  8. uni-app上传图片或者说照片(调用相册或者摄像头)
  9. 温度信号波形c 语言,基于CC2530的温度报警器的应用实现
  10. 我的世界java版如何装mod_Java版 Mod(模组)API下载 | Mod安装教程 [1.13.2-1.2.5]