-------------------------------------------------------------------------------------------

作者:Alien

链接:https://www.baidufe.com/item/4bb733d9999c53cb8fed.html

-------------------------------------------------------------------------------------------

在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,可以在onActivityResult方法中,获取到照片数据后,读取它的旋转信息,如果不是0,说明这个照片已经被旋转过了,那么再使用android.graphics.Matrix将照片旋转回去即可。

1、读取图片的旋转属性

/*** 读取图片的旋转的角度** @param path*            图片绝对路径* @return 图片的旋转角度*/
private int getBitmapDegree(String path) {int degree = 0;try {// 从指定路径下读取图片,并获取其EXIF信息ExifInterface exifInterface = new ExifInterface(path);// 获取图片的旋转信息int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);//NORMAL 为0,即不旋转switch (orientation) {case ExifInterface.ORIENTATION_ROTATE_90://右旋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;
}

2、将图片按照某个角度进行旋转

/*** 将图片按照某个角度进行旋转** @param bm*            需要旋转的图片* @param degree*            旋转角度* @return 旋转后的图片*/
public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {Bitmap returnBm = null;// 根据旋转角度,生成旋转矩阵Matrix matrix = new Matrix();matrix.postRotate(degree);try {// 将原始图片按照旋转矩阵进行旋转,并得到新的图片returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);} catch (OutOfMemoryError e) {}if (returnBm == null) {returnBm = bm;}if (bm != returnBm) {bm.recycle();}return returnBm;
}

3、将旋转后返回的bitmap以文件形式进行存储

    /*** 保存bitmap到sd卡filePath文件中 如果有,则删除* @param bitmap* @param filePath :图片绝对路径* @return boolean :是否成功*/public static boolean saveBitmap2file(Bitmap bitmap,String filePath){if (bitmap==null){return false;}//压缩格式CompressFormat format = CompressFormat.JPEG;int quality =100;OutputStream stream=null;File file=new File(filePath);File dir=file.getParentFile();if (!dir.exists()){dir.mkdirs();//创建父目录}if (file.exists()){file.delete();}try {stream = new FileOutputStream(filePath);} catch (FileNotFoundException e) {e.printStackTrace();}return  bitmap.compress(format,quality,stream);}
}

4、剪切

首先通过图片文件的路径获取图片的uri,然后开始截图图片

Uri uri=Uri.fromFile(new File(PhotoUtils.getPhotoPath(pic_name)));
cropImageUri(uri,250,250, CameraActvity.ActivityResult_CROP_SMALL_PICTURE);

图片截取方法 cropInageUri()

    /*** 图片截取* @param uri :图片文件的Uri* @param outputX   :裁剪图片的宽* @param outputY   :裁剪图片的高* @param requestCode   :int*/private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode) {Intent intent=new Intent("com.android.camera.action.CROP");//调用系统裁剪功能intent.setDataAndType(uri,"image/*");//在开启的Intent中设置显示的VIEW可裁剪intent.putExtra("crop","true");// aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)intent.putExtra("aspectX",1);intent.putExtra("aspectY",1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX",outputX);intent.putExtra("outputY",outputY);//裁剪时是否保留图片的比例,这里的比例是1:1intent.putExtra("scale",true);intent.putExtra(MediaStore.EXTRA_OUTPUT,PhotoUtils.getPhotoPath(pic_name));//是否将数据保留在Bitmap中返回intent.putExtra("return-data",true);//设置输出的格式intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection",true);intent.putExtra("scaleUpIfNeeded", "true");startActivityForResult(intent,requestCode);}

接收处理:

    @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode){/*** 裁剪返回*/case CameraActvity.ActivityResult_CROP_SMALL_PICTURE:if (resultCode==RESULT_OK){Bitmap bitmap= (Bitmap) data.getExtras().get("data");if (PhotoUtils.saveBitmap2file(bitmap,PhotoUtils.getPhotoPath(pic_name))){//bitmap存储成filesetResultBack();//数据返回并关闭页面}}break;default :break;}}

学习资料:

Android大图片裁剪终极解决方案(中:从相册截图)

------------------------------------问题-------------------------------------

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)

源码解析:

Returns an immutable bitmap from subset of the source bitmap, transformed by the optional matrix. The new bitmap may be the same object as source, or a copy may have been made. It is  initialized with the same density as the original bitmap.  If the source bitmap is immutable and the requested subset is the same as the source bitmap itself, then the source bitmap is returned and no new bitmap is created.

利用源位图的子集,通过矩阵变换,生成不可变的位图bitmap 。新的位图可能与源位图是相同的对象,或可能是源位图的一个副本。它的初始化密度与原始位图一致。如果源位图是不可变的,并且请求的子集是与源位图一致,那么则返回源位图,而不会创建新的位图。【也即图片的裁剪】

  • source :源位图,用来剪裁的图片源;
  • x :在源位图中第一个像素点的x坐标/剪裁x方向的起始位置
  • y :在源位图中第一个像素点的y坐标
  • width :每一行像素点的数量/ 剪裁的宽度
  • height :列数目/裁剪的高度
  • Matrix m :可选矩阵
  • filter :true 原图片也会被裁剪,false原图片不会。true if the source should be filtered. Only applies if the matrix contains more than just translation.
需要注意的是:必须满足条件:x+width<=bitmap.width()(图片源的原始宽度)否则会抛出IllegalArgumentException异常。

android-照片旋转/图片裁剪相关推荐

  1. Android第三方开源图片裁剪截取:cropper

     Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...

  2. android 固定比例图片裁剪插件,移动端添加图片裁剪的坑

    本文关键:阻止冒泡.canvas压缩.canvas裁剪.生成黑色图片. 最近项目需要在添加图片时实现裁剪功能,虽然 github 上开源的裁剪插件不少,试了好几个插件,在移动端体验好的寥寥无几.躺了几 ...

  3. Android 7.0图片裁剪问题

    现在的App上都会有用户头像或商品图片等,而这些图片一般都是正方形且大小特别小的,要想得到此类的图片就要用到Android系统自带的图片裁剪功能,蒋拍照后的图片选择用户想要的地方进行裁剪.图片裁剪在不 ...

  4. Android 头像、图片裁剪

    ClipView 头像.图片裁剪 预览 裁剪圆形 裁剪圆角 裁剪矩形 资源 名字 资源 AAR clip_view.aar Gitee ClipView GitHub ClipView Maven 1 ...

  5. 【Android】Bitmap图片裁剪(91/100)

    自定义裁剪类CropImageView: package top.lc951.myandroid.views;import android.content.Context; import androi ...

  6. android 图片自动裁剪图片大小,android调用原生图片裁剪后图片尺寸缩放的解决方法...

    在安卓开发中,如果对拍照后的图片进行图片裁剪,如果是调用系统的裁剪,如下: /* * 裁剪图片 */ private void cropPhoto() { Intent intent = new In ...

  7. android 照片旋转并保存

    /*** 读取图片属性:旋转的角度* @param path 图片绝对路径* @return degree旋转的角度*/public int readPictureDegree(String path ...

  8. android+照片合成,图片合成修图神器手机版

    图片合成修图神器手机版由西西给大家带来,这款软件也是一个非常好用的修图软件,可以帮助大家制作各种的图片,而且模板滤镜也非常的多,喜欢的朋友赶紧来下载图片合成修图神器手机版吧! 图片合成修图神器介绍 [ ...

  9. Android高效旋转图片的方式

    文章目录 背景 renderscript方式的优缺点 代码 结束 背景 在项目开发中涉及到比较多的图片处理,如摄像头预览图片的旋转,送入人脸识别sdk的图片数据,上传到后台识别记录的抓拍图片等等,以前 ...

最新文章

  1. 云计算设计模式(十)——守门员模式
  2. 精美的电路图都是怎么画出来的?
  3. java json 长度限制_[原创]Java中字符串、数组、集合及JSONArray的长度属性
  4. 资源 | 5月Python好文TOP 10新鲜出炉,你都看了吗?
  5. PyQt5 简易计算器
  6. 【C】——如何用线程进行参数的传递
  7. 2021年春季学期-信号与系统-第九次作业参考答案-第六小题
  8. 区块链研习 | 什么是区块链的链外交易和链内交易
  9. CompletableFuture API用法介绍(二)
  10. 测试Servlet生命周期例子程序
  11. 英语期末复习unit 1-2课后习题第一题及背诵段落
  12. PowerBuilder调用.Net编译好的DLL
  13. 基于前端javascript的搜索功能
  14. 深搜和广搜--原理彼此的优缺点
  15. APUE代码运行环境的搭建
  16. php变异测试工具,科学网—两种突变检测的matlab代码 - 张凌的博文
  17. 天河区办理水电、管道煤气、有线电视过户手续所需资料及地址 ...
  18. 过采样算法之SMOTE
  19. 富士胶片集团发布2021财年上半年度财报;罗克韦尔自动化推出新的远程访问解决方案 | 全球TMT...
  20. 通过拼音模糊搜索汉字的功能实现

热门文章

  1. 多多情报通:拼多多三级处罚以后对店铺还有影响吗?拼多多三级处罚原因介绍
  2. vs2017+pangolin的配置教程
  3. 数模国赛备赛(3)优化模型与历年国赛B题讲解
  4. unittest框架里面---verbosity设置
  5. 上海尼奥计算机系统有限公司,超前想象力的圆形屏电脑诞生!“MAGNEO 尼奥放大镜 ”品牌暨新品发布...
  6. IDEA 报错These modules have been removed from Maven stucture
  7. 基于Delphi+MySQL的大学生竞赛发布及组队系统
  8. IPv6网络配置LVS的DR模式
  9. python读取.mat文件,python将变量存为.mat文件详细介绍
  10. 如何翻译整篇PPT文档?PPT文档翻译还可以这样做