最近利用一周左右的业余时间,终于完成了一个Android图片剪裁库,核心功能是根据自己的理解实现的,部分代码参考了Android源码的图片剪裁应用。现在将该代码开源在Github上以供大家学习和使用,地址:https://github.com/Jhuster/ImageCropper,效果如下所示:

我的大致计划是首先介绍一下这个库的用法,然后再写几篇文章介绍一下其中的一些原理和关键技术,希望对Android开发新手有所帮助。

【特性】

  1. 支持通过手势移动和缩放剪裁窗口

  2. 支持固定剪裁窗口大小、固定窗口的长宽比率

  3. 支持设置最大的窗口长和宽

  4. 支持剪裁图片的旋转

  5. 易于集成和使用

【使用方法】

  1. 修改AndroidManifest.xml文件

<activity android:name="com.ticktick.imagecropper.CropImageActivity"/>

需要添加写SDcard的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 启动图片剪裁界面的方法

第一种方法,使用库中封装的CropIntent来构建Intent对象:

private void startCropImage() {// Create a CropIntentCropIntent intent = new CropIntent(); // Set the source image filepath/URL and output filepath/URL (Required)intent.setImagePath("/sdcard/source.jpg");intent.setOutputPath("/sdcard/cropped.jpg");// Set a fixed crop window size (Optional) intent.setOutputSize(640,480);// Set the max crop window size (Optional) intent.setMaxOutputSize(800,600);// Set a fixed crop window's width/height aspect (Optional) intent.setAspect(3,2);// Start ImageCropper activity with certain request code and listen for resultstartActivityForResult(intent.getIntent(this), REQUEST_CODE_CROP_PICTURE);
}

第二种方法,自定义Intent对象:

private void startCropImage() {// Create explicit intentIntent intent = new Intent(this, CropImageActivity.class);// Set the source image filepath/URL and output filepath/URL (Required)intent.setData(Uri.fromFile(new File("/sdcard/source.jpg")));intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File("/sdcard/cropped.jpg")));// Set a fixed crop window size (Optional) intent.putExtra("outputX",640);intent.putExtra("outputY",480);// Set the max crop window size (Optional) intent.putExtra("maxOutputX",800);intent.putExtra("maxOutputY",600);// Set a fixed crop window's width/height aspect (Optional) intent.putExtra("aspectX",3);intent.putExtra("aspectY",2);// Start ImageCropper activity with certain request code and listen for result
    startActivityForResult(intent, REQUEST_CODE_CROP_PICTURE);
}

3. 获取剪裁结果

剪裁结束后,如果用户点击了“Save”按钮,则可以通过MediaStore.EXTRA_OUTPUT得到保存的图片的URL地址;如果用户点击了“Cancel”,则Activity的返回值会被设置为 RESULT_CANCEL

protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_OK) {return;}if (requestCode == REQUEST_CODE_CROP_PICTURE ) {Uri croppedUri = data.getExtras().getParcelable(MediaStore.EXTRA_OUTPUT);   InputStream in = null;try {in = getContentResolver().openInputStream(croppedUri);Bitmap b = BitmapFactory.decodeStream(in);mImageView.setImageBitmap(b);} catch (FileNotFoundException e) {e.printStackTrace();}     }super.onActivityResult(requestCode, resultCode, data);
}

Android图片剪裁库相关推荐

  1. android图片适配到裁剪框,Android图片剪裁-调用系统实现,完美适配魅族等机型

    System-Photo-Cropper Android System Photo Cropper 使用系统原生的图片剪裁库,完美适配魅族等机型 Step 1 First you need a sys ...

  2. android 图片剪切组件,Android 图片裁剪库 uCrop

    软件介绍 uCrop 是[Yalantis](https://yalantis.com/) 组织开源的图片裁剪库, 支持缩放, 旋转图片, 支持各种比例的裁剪框, 非常强大的一个图片裁剪库. 使用 1 ...

  3. android 图片裁剪库,(译)uCrop介绍 —— 我们自己的Android图片裁剪库

    我们在 Yalantis 开发了许多不同的 Android 应用,经验告诉我们,几乎在所有的应用中,都需要图片裁剪的功能.图片裁剪的用途很广,从简单的用户头像调整到图片的比例裁剪.灵活变换等各种复杂的 ...

  4. Android图片压缩库——libjpeg-turbo

    为何Android图片压缩效率比IOS低质量差 为什么Android的图片压缩质量要比iPhone的压缩质量差很多,这是因为Android底层犯的一个小错误:libjpeg.并且这个错误一直持续到了今 ...

  5. Android 图片选择库美哭了

    转载: https://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650663107&idx=1&sn=a940514bc3 ...

  6. android调用系统裁剪功能,Android图片剪裁之调用系统剪裁

    参考: 一. 原理 通过Intent打开系统自带的剪裁Activity,通过Intent设置Extra参数,进行剪裁参数的设定.剪裁结果的缩略图会保存在返回的data中,而大图要通过Uri进行保存(其 ...

  7. android图片布局填冲满,Android图片裁剪库——cropper使用,完美解决图片填充不满布局问题...

    前些时间请了一个月假,远程办公,期间项目主要做图片裁剪,脑子里第一反应就是github上开源裁剪库,试了排名的前几个,其中不是UI定制度太低就是裁剪效果不怎么样.当然你也可以直接intent一下系统的 ...

  8. android开发怎么写图片,Android开发实践:自己动手编写图片剪裁应用(2)

    上篇文章主要介绍了我开源在Github上的图片剪裁库(ImageCropper)的基本特性和用法,从本文开始,慢慢介绍一些开发图片剪裁应用中涉及的知识点和技术. 其实Android系统本身也提供了图片 ...

  9. android知乎多图片选择,知乎开源图片选择库 Matisse

    原标题:知乎开源图片选择库 Matisse 我的引言 Matisse,知乎开源,简洁,易用,不错的图片选择库. 效果预览 项目简介 1.直接在 Activity 和 Fragment 中调用即可: 2 ...

最新文章

  1. 2.4G高频PCB天线设计
  2. pdb+ipdb 调试 Python代码
  3. dwarf tower
  4. System Center产品相关开发(1)-SCOM和SCVMM简介
  5. vue点击网页全屏_vue-cli点击实现全屏功能(两种方式)
  6. MySQL复制表-INSERT INTO SELECT
  7. Fotolog对memcached的应用
  8. 【分形算法】Jason带你飞之1——LS文法的java实现
  9. FPGA学习笔记---Modelsim使用技巧总结
  10. 商业有规律,赚钱有方法,不要在盲目努力了
  11. 自动驾驶攻破的难点在哪,何时能到Level 5?
  12. windows下github的使用心得
  13. 继承几近失传的经典吟诵-余觉中
  14. 神经网络模型怎么建立,如何选择神经网络模型
  15. 家用投影机预埋布线图_家庭影院装修如何布线(装修前必看·附图)
  16. 青海大学昆仑学院计算机机考,青 海 大 学 昆 仑 学 院 试 卷.doc
  17. 【问题解决】error: pathspec ‘XXX‘ did not match any file(s) known to git
  18. ADC 模数转换实验
  19. mysql建立序列相关操作 sequence
  20. 传感器与变送器的区别与联系

热门文章

  1. sap系统操作流程财务软件_金蝶财务软件的操作流程汇总
  2. SpringBoot开发案例之整合Dubbo提供者(二)
  3. 存储--盘古_阿里云飞天分布式存储系统设计深度解析
  4. 开源wkhtmltopdf使用心得 (一)
  5. J2EE和Java EE
  6. (转)Windows重启延迟删除,重命名技术原理
  7. Citrix XenApp Hotfix Rollup Pack部署最佳实践
  8. findfirst findnext 递归查找指定目录下所有子目录下所有文件,为什么总是死机?...
  9. JAVA操作Hadoop
  10. Socket编程(C语言实现)——UDP协议(进程间通信AF_UNIX)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【循环监听】