1. 旋转角度

当我们从手机读取图片时候发现其图片旋转了90或者其他度数,比如三星拍照后的照片就是个例子.这时候我们读取出来判断角度然后在逆向回转为正向的图片

  1. 所需类 ExifInterface
    Exif是 Exchangeable Image File 缩写
/*** 读取图片属性:旋转的角度* * @param path 图片绝对路径* @return degree 旋转角度*/public static int readPictureDegree(String path) {int degree = 0;try {ExifInterface exifInterface = new ExifInterface(path);int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);switch (orientation) {case ExifInterface.ORIENTATION_ROTATE_90:degree = 90;break;case ExifInterface.ORIENTATION_ROTATE_180:degree = 180;break;case ExifInterface.ORIENTATION_ROTATE_270:degree = 270;break;}} catch (IOException e) {e.printStackTrace();}return degree;}
/*** 旋转图片* * @param angle 旋转角度* @param bitmap 原图* @return bitmap 旋转后的图片*/public static Bitmap rotateImage(int angle, Bitmap bitmap) {// 图片旋转矩阵Matrix matrix = new Matrix();matrix.postRotate(angle);// 得到旋转后的图片Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,bitmap.getWidth(), bitmap.getHeight(), matrix, true);return resizedBitmap;}

2. 调用系统的剪切图片软件

当我们某个图片过大 想让用户自行选择剪切区域

  1. 意图Intent的action “com.android.camera.action.CROP”
  2. 意图Intent的data类型 文件地址Uri 如Uri.fromFile(new File(fileSrc))
  3. 意图intent的type类型(mime) “image/*”

以下是可以传入到intent的数值 (putExtra)

数值名(字符串类型) 传入值类型 作用 案例
crop String 设置true才能出剪辑的小方框,不然没有剪辑功能,只能选取图片 intent.putExtra(“crop”, “true”);
aspectX int 放大缩小比例的X intent.putExtra(“aspectX”, 1);
aspectY int 放大缩小比例的Y intent.putExtra(“aspectY”, 1);
outputX int //这个是限制输出图片x方向大小(最大限制) intent.putExtra(“outputX”, 320);
outputY int //这个是限制输出图片y方向大小(最大限制) intent.putExtra(“outputY”, 320);
return-data boolean 是否返回数据图(后面有案例) intent.putExtra(“return-data”, true);
scale和scaleUpIfNeeded boolean 切图大小不足输出,边缘出现类似毛边或者锯齿等 innerIntent.putExtra(“scale”, true);innerIntent.putExtra(“scaleUpIfNeeded”, true);
/**** 裁剪图片* @param activity Activity* @param uri 图片的Uri*/public static void cropPicture(Activity activity, Uri uri) {Intent innerIntent = new Intent("com.android.camera.action.CROP");innerIntent.setDataAndType(uri, "image/*");innerIntent.putExtra("crop", "true");// 设置true才能出剪辑的小方框,不然没有剪辑功能,只能选取图片innerIntent.putExtra("aspectX", 1); // 放大缩小比例的XinnerIntent.putExtra("aspectY", 1);// 放大缩小比例的X   这里的比例为:   1:1innerIntent.putExtra("outputX", 320);  //这个是限制输出图片大小innerIntent.putExtra("outputY", 320); innerIntent.putExtra("return-data", true);// 切图大小不足输出,无黑框innerIntent.putExtra("scale", true);innerIntent.putExtra("scaleUpIfNeeded", true);File imageFile = new File(getImagePath(activity.getApplicationContext()));innerIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));innerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());activity.startActivityForResult(innerIntent, REQUEST_CROP_IMAGE);}
//回调:activityforresult
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){
// 获取返回数据
Bitmap bmp = data.getParcelableExtra("data");}

3. 拍照获取图片

  1. intent 的action: MediaStore.ACTION_IMAGE_CAPTURE
    直接案例:
// 设置相机拍照后照片保存路径File mPictureFile = new File(Environment.getExternalStorageDirectory(), "picture" + System.currentTimeMillis()/1000 + ".jpg");// 启动拍照,并保存到临时文件Intent mIntent = new Intent();mIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPictureFile));mIntent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);startActivityForResult(mIntent, REQUEST_CAMERA_IMAGE);

回调acativityforesult


protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_OK) {return;}if (!mPictureFile.exists()) {showTip("拍照失败,请重试");return;}fileSrc = mPictureFile.getAbsolutePath();}

4.更新画册

当你更新一张图片在手机中时不会立即出现在图册中,需要重启手机或者通知系统去扫描

private void updateGallery(String filename) {MediaScannerConnection.scanFile(this, new String[] {filename}, null,new MediaScannerConnection.OnScanCompletedListener() {@Overridepublic void onScanCompleted(String path, Uri uri) {}});}

5.从手机相册获取

直接案例

Intent intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_PICK);startActivityForResult(intent, REQUEST_PICTURE_CHOOSE);

回调:


@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_OK) {return;}
if ("file".equals(data.getData().getScheme())) {// 有些低版本机型返回的Uri模式为filefileSrc = data.getData().getPath();} else {// Uri模型为content//选择数据地址字段String[] proj = {MediaStore.Images.Media.DATA};Cursor cursor = getContentResolver().query(data.getData(), proj,null, null, null);cursor.moveToFirst();//获取字段在第几列int idx = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//获取所在地址fileSrc = cursor.getString(idx);cursor.close();}}

转载于:https://www.cnblogs.com/muyuge/p/6152133.html

安卓高级6 拍照或者从相册获取图片 并检测旋转角度或者更新画册扫描相关推荐

  1. 第三节 适配Android10的拍照、从相册获取代码,包括完整的权限申请和图片地址获取

    专栏目录 第一节 自定义轮播图的制作 第二节 底部导航栏菜单,炫酷菜单动画,背景变暗.按钮焦点获取 第三节 适配Android10的拍照.从相册获取代码,包括完整的权限申请和图片地址获取 第四节 百度 ...

  2. 微信小程序-从相册获取图片,视频 使用相机拍照,录像上传+服务器(nodejs版)接收

    在本文 微信小程序-从相册获取图片 使用相机拍照 本地图片上传之前需要看看 微信小程序-获取用户session_key,openid,unionid - 后端为nodejs 代码封装是在上文添加的. ...

  3. 微信小程录制视频上传服务器,微信小程序-从相册获取图片,视频使用相机拍照,录像上传+服务器nodejs版接收-微信小程序视频上传功能-微信小程序视频上传...

    在本文微信小程序-从相册获取图片使用相机拍照本地图片上传之前需要看看微信小程序-获取用户session_key,openid,unionid-后端为nodejs代码封装是在上文添加的.本文知识点:1. ...

  4. android开发 获取相册名称_android通过拍照、相册获取图片并显示 实例完整源码下载(亲测通过)...

    [实例简介]其中也包含了 将图片保存至 sd卡功能 [实例截图] [核心代码] public class MainActivity extends Activity{ private static f ...

  5. Android 拍照、从相册选择图片

    在做Android图片上传功能的时候,获取图片的途径一般都有两种:拍照.从相册选择. 一.拍照 调用相机拍照有两种方法: 直接返回图片. 在调用相机的时候,传入uri,拍照后通过该uri来获取图片. ...

  6. iOS 从相机或相册获取图片并裁剪

    /load user image - (void)UesrImageClicked { UIActionSheet *sheet; // 判断是否支持相机 if([UIImagePickerContr ...

  7. 从相机相册获取图片裁剪后用于评论晒图或更换背景图

    这是我人生中写的第一篇博客,是否要纪念一下这一刻(2016.09.01 16:52).其实关于写博客,老早就有这种写法,首先觉得他能够帮我总结我学到的和用过的技术,其次还能帮助那些和我有一样需求的人, ...

  8. pictureselector 压缩_Android 拍照、从相册选择图片之PictureSelector

    仿微信实现在Android平台下的图片选择器,支持从相册获取图片.视频.音频&拍照,支持裁剪(单图or多图裁剪).压缩.主题自定义配置等功能,支持动态获取权限&适配Android 5. ...

  9. Android 调用系统打开相机,打开相册获取图片路径

    我们在开发中经常遇到一些功能需要调取系统相机拍照获取图片,或者有的时候直接打开图库获取图片,那我们怎么获取呢,今天分享下, 第一步,打开相机 public static final int CAMER ...

最新文章

  1. MySQL主从同步机制及同步中的问题处理
  2. 四种方式主导你的第一个敏捷项目
  3. Hadoop分布式集群安装配置
  4. 一本关于HTTP的恋爱日记
  5. Android动画类型
  6. tomcat memory setting
  7. 对“最大子序列和问题”的一点思考
  8. MD9 入门 制作衣服 笔记
  9. live555作为RTSP客户端对接大华的某款球机RTSP流时不能预览问题的解决方案
  10. Win10 新机,这些必装软件你拥有了吗?美化、写作、下载、效率神器...这篇攻略请收藏...
  11. 网易云信发送短信工具类
  12. C++-源代码调试-Visual Studio-X64dbg-WinDbg-插件开发
  13. vue生命周期,组件,slot替换,tab切换,简易留言板
  14. React Native-6.React Native Text组件,多组件封装实战之凤凰资讯页面
  15. 联想Lico+singularity容器制作+anaconda3安装教程
  16. 2015去哪儿网校园招聘笔试题:寻找字符串的差异
  17. 安全大数据的7个V——大数据基础问题与信息安全的交叉探究
  18. 程序员如何在业余时间接单月入过万
  19. ipscan怎么用?ipscan使用方法
  20. 华为程序员:加班6天,加班费一万四,网友:加到它破产!!!

热门文章

  1. 再见了, VS Code!
  2. 直接拿来用!VS Code 最强插件指南
  3. 电商那些年,我摸爬打滚出的高并发架构实战精髓(续)
  4. Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
  5. 框架:Hibernate和Mybatis的区别
  6. springboot com.mysql.cj.exceptions.CJException: Access denied for user 'root'@'localhost
  7. 33.向vector里面添加数字,换行敲下输入结束
  8. com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name ‘d
  9. 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
  10. Google 首次引入数据中心液体冷却