今天在项目中做拍照上传头像相关, 但调用系统相机拍照得到的图片总是旋转90度, 在网上找到了两种答案:

  • 第一种如下, 无奈得到的旋转角度总是 0 度 , 无法解决旋转问题
 //读取图片旋转角度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);LogW.out("readPictureDegree : orientation = " + orientation);if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {degree = 90;} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {degree = 180;} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {degree = 270;}} catch (IOException e) {e.printStackTrace();}return degree;}//旋转图片public static Bitmap rotateBitmap(int angle, Bitmap bitmap) {Matrix matrix = new Matrix();matrix.postRotate(angle);Bitmap rotation = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),matrix, true);return rotation;}
  • 第二种如下 , 通过比较图片宽高来旋转图片 , 可惜虽然竖着牌的照片能正常显示, 可一旦将相机横向拍摄, 展示到界面就多旋转了 90 度 , 故方法二无效
int width = bitmap.getWidth();int height = bitmap.getHeight();if(width < height) {bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getWidth());}else {Matrix matrix = new Matrix();matrix.postRotate(90);bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getHeight(),bitmap.getHeight(),matrix,true);}

万般无奈之下, 我无意之间使用方法一中的 ExifInterface 打印了拍照后压缩前角度信息, toast 打印结果是 6 , 对应常量 ExifInterface.ORIENTATION_ROTATE_90 , 可我记得之前获取到的旋转角度是0 , 仔细一想发现获取角度为0那次操作的是压缩后的图片, 我怀疑是不是压缩将图片旋转信息抹掉了.

于是我在压缩前获取图片旋转信息:

ExifInterface exifInterface = new ExifInterface(finalUserIcon.getAbsolutePath());//finalUserIcon为压缩前图片
final int degree = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
UIUtil.debugToast(String.valueOf(degree));

压缩后将原图旋转信息保存替换现有旋转信息:

try {ExifInterface endEI = new ExifInterface(imgPath);//imgPath为压缩后图片路径endEI.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(degree));endEI.saveAttributes();
} catch (IOException e) {e.printStackTrace();
}

然后采用方法一的方式获取旋转信息并纠正旋转角度:

 int degree = readPictureDegree(imgPath);Bitmap bitmap = rotateBitmap(degree, BitmapFactory.decodeFile(imgPath));saveBitmap(imgPath);/** 保存方法 */public static void saveBitmap(String path, Bitmap bm) {File f = new File(path);if (f.exists()) {f.delete();}try {FileOutputStream out = new FileOutputStream(f);bm.compress(Bitmap.CompressFormat.PNG, 90, out);out.flush();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

至此问题得到解决, 无论横着拍照还是竖着拍照都能正确展示.

解决Android 拍照图片被旋转问题相关推荐

  1. javascript H5解决手机拍照图片被旋转问题

    网络上有许多的实现图片预览功能的案例,这些案例大部分都存在一个问题就是在手机等移动数码设备上,拍照成像后的预览图居然会被旋转. 实现预览的大概有以下几个过程: 监听 文件选择框 的 onchange  ...

  2. 解决ios横屏拍照图片自动旋转90度问题

    解决ios横屏拍照图片自动旋转90度问题 参考文章: (1)解决ios横屏拍照图片自动旋转90度问题 (2)https://www.cnblogs.com/lanshengzhong/p/900856 ...

  3. android 部分手机Camera 拍照 图片被旋转90度的解决方法

    部分手机拍照完后 图片旋转角度90度,目前解决方法普遍都是通过图片路径,获取图片信息判断角度,然后转换角度.如下: /*** 读取图片属性:旋转的角度* @param path 图片绝对路径* @re ...

  4. android camera 图片被旋转,android 部分手机Camera 拍照 图片被旋转90度的解决方法

    部分手机拍照完后 图片旋转角度90度,目前解决方法普遍都是通过图片路径,获取图片信息判断角度,然后转换角度.如下: /** * 读取图片属性:旋转的角度 * @param path 图片绝对路径 * ...

  5. android拍照图片如何存储空间不足,手机照相显示内存不足怎么办 解决方法【详解】...

    用手机来拍照,这已经成为手机不可或缺的一个重要功能.手机拍照时,显示内存不足,该怎么办?关键时刻怎么可以没有内存! 下面一起来学习手机照相显示内存不足的解决方法. 1.当去旅游或是出差的时候,原本打算 ...

  6. 一站式解决,Android 拍照 图库的各种问题

    在android开发中, 在一些编辑个人信息的时候,经常会有头像这么一个东西,就两个方面,调用系统相机拍照,调用系统图库获取图片.但是往往会遇到各种问题: 1.oom 2.图片方向不对 3.activ ...

  7. 彻底解决Android 拍照 内存溢出 Out of Memory的问题

    内存溢出相信做过编程的人都知道一二,这里说Android 内存溢出的问题:.问题描述:Android下的相机在独自使用时,拍照没有问题,通过我们的代码调用时,也正常,但是更换了不同厂商的平板,ROM由 ...

  8. android 拍照 图片剪切

    对于照片拍照上传应该有很多新手不是很清楚,这里我把我多方学习的代码分享给大家. 图片剪切代码 上传 这里是拍照不裁剪的代码 package com.rui.cameratest;import java ...

  9. android拍照图片如何存储空间不足,拍照时手机存储空间提示不足? OPPO云服务太贴心了...

    原标题:拍照时手机存储空间提示不足? OPPO云服务太贴心了 用手机来拍照,这已经成为手机不可或缺的一个重要功能.手机拍照时,显示内存不足,该怎么办?关键时间,怎么可以没有存储!今日上午,OPPO官微 ...

最新文章

  1. 图像特征点检测与匹配评价准则——量化
  2. antd table column 列表渲染
  3. 西人马聂泳忠:打造机器神经系统,成为中国的特斯拉
  4. 学会python之后-学会Python后,人生简直开挂了!
  5. openmv集成应用_使用OpenMV引导无人机飞行
  6. bzoj#3456. 城市规划
  7. 下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
  8. 即将到来的“分布式云”(DPaaS):分布式计算+ DB +存储即服务
  9. 剑指offer——圆圈中最后剩下的数字
  10. C++流水线的简易实现
  11. GridView日期列使用DataFormatString格式化技巧
  12. Magisk如何针对性隐藏Root避免被检测
  13. 微信个人名片H5生成器
  14. 程序员的奋斗史(三十二)——人在囧途之应聘篇(二)
  15. HTML5 progress进度条详解
  16. S7-1200能不能仿真通信?
  17. python取得两个文件的交集、并集和差集。
  18. 微信小程序流量主如何开通(个人小程序)
  19. 用文字描述神经网络的各个结构
  20. 海王PHP面试,海王满天飞,offer收割机遍地跑,从四非到985,双跨不易何其幸运...

热门文章

  1. java 子类属性覆盖_java子类和父类属性重复问题
  2. 最新、最全开心网钓鱼外挂下载_开心网001钓鱼外挂
  3. TypeWriter: Neural Type Prediction with Search-based Validation基于搜索的神经网络预测器
  4. 坚果O1S画面竟然出现折边?对比同价位当贝D3X,坚果O1S值得入手吗?
  5. cobbler集成服务器批量安装操作系统(无人值守)
  6. P3855 [TJOI2008]Binary Land
  7. 【题解】[Swerc2008]First Knight
  8. 使用 C++ 开发出 【飞机大战】
  9. python+vue 税务申报系统
  10. 在Word、WPS中插入AxMath公式导致行间距异常的解决办法