全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android部分手机拍照后获取的图片被旋转问题的解决方法

调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。其它品牌的手机都是正常的,就三星出现这个怪事。

在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊!

解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了。

具体思路:
1、首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个工具类)

String fileName = ""; 
/** 
 * 启动相机拍照 
 */ 
private void addBitmapShoots() { 
 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
 // 设置图片要保存的 根路径+文件名 
 fileName = PhotoBitmapUtils.getPhotoFileName(getContext()); 
 File file = new File(fileName); 
 if (!file.exists()) { 
  try { 
   file.createNewFile(); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
 } 
 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
 startActivityForResult(intent, OPEN_CAMERA); 
} 

2、在获取相机返回的回调方法onActivityResult()中,修复被旋转的图片并取得修复后的图片路径,有了这个路径后就可以展示出来了

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
 super.onActivityResult(requestCode, resultCode, data); 
 // 获取相机拍照返回 
 if (resultCode == Activity.RESULT_OK && requestCode == OPEN_CAMERA) { 
  // 得到修复后的照片路径 
  String filepath = PhotoBitmapUtils.amendRotatePhoto(fileName, getContext()); 
 } 
} 

PhotoBitmapUtils类:

/** 
 * 集合一些图片工具 
 * 
 * Created by zhuwentao on 2016-07-22. 
 */ 
public class PhotoBitmapUtils { 
 
 /** 
  * 存放拍摄图片的文件夹 
  */ 
 private static final String FILES_NAME = "/MyPhoto"; 
 /** 
  * 获取的时间格式 
  */ 
 public static final String TIME_STYLE = "yyyyMMddHHmmss"; 
 /** 
  * 图片种类 
  */ 
 public static final String IMAGE_TYPE = ".png"; 
 
 // 防止实例化 
 private PhotoBitmapUtils() { 
 } 
 
 /** 
  * 获取手机可存储路径 
  * 
  * @param context 上下文 
  * @return 手机可存储路径 
  */ 
 private static String getPhoneRootPath(Context context) { 
  // 是否有SD卡 
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 
    || !Environment.isExternalStorageRemovable()) { 
   // 获取SD卡根目录 
   return context.getExternalCacheDir().getPath(); 
  } else { 
   // 获取apk包下的缓存路径 
   return context.getCacheDir().getPath(); 
  } 
 } 
 
 /** 
  * 使用当前系统时间作为上传图片的名称 
  * 
  * @return 存储的根路径+图片名称 
  */ 
 public static String getPhotoFileName(Context context) { 
  File file = new File(getPhoneRootPath(context) + FILES_NAME); 
  // 判断文件是否已经存在,不存在则创建 
  if (!file.exists()) { 
   file.mkdirs(); 
  } 
  // 设置图片文件名称 
  SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault()); 
  Date date = new Date(System.currentTimeMillis()); 
  String time = format.format(date); 
  String photoName = "/" + time + IMAGE_TYPE; 
  return file + photoName; 
 } 
 
 /** 
  * 保存Bitmap图片在SD卡中 
  * 如果没有SD卡则存在手机中 
  * 
  * @param mbitmap 需要保存的Bitmap图片 
  * @return 保存成功时返回图片的路径,失败时返回null 
  */ 
 public static String savePhotoToSD(Bitmap mbitmap, Context context) { 
  FileOutputStream outStream = null; 
  String fileName = getPhotoFileName(context); 
  try { 
   outStream = new FileOutputStream(fileName); 
   // 把数据写入文件,100表示不压缩 
   mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
   return fileName; 
  } catch (Exception e) { 
   e.printStackTrace(); 
   return null; 
  } finally { 
   try { 
    if (outStream != null) { 
     // 记得要关闭流! 
     outStream.close(); 
    } 
    if (mbitmap != null) { 
     mbitmap.recycle(); 
    } 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
 
 /** 
  * 把原图按1/10的比例压缩 
  * 
  * @param path 原图的路径 
  * @return 压缩后的图片 
  */ 
 public static Bitmap getCompressPhoto(String path) { 
  BitmapFactory.Options options = new BitmapFactory.Options(); 
  options.inJustDecodeBounds = false; 
  options.inSampleSize = 10; // 图片的大小设置为原来的十分之一 
  Bitmap bmp = BitmapFactory.decodeFile(path, options); 
  options = null; 
  return bmp; 
 } 
 
 /** 
  * 处理旋转后的图片 
  * @param originpath 原图路径 
  * @param context 上下文 
  * @return 返回修复完毕后的图片路径 
  */ 
 public static String amendRotatePhoto(String originpath, Context context) { 
 
  // 取得图片旋转角度 
  int angle = readPictureDegree(originpath); 
 
  // 把原图压缩后得到Bitmap对象 
  Bitmap bmp = getCompressPhoto(originpath);; 
 
  // 修复图片被旋转的角度 
  Bitmap bitmap = rotaingImageView(angle, bmp); 
 
  // 保存修复后的图片并返回保存后的图片路径 
  return savePhotoToSD(bitmap, context); 
 } 
 
 /** 
  * 读取照片旋转角度 
  * 
  * @param path 照片路径 
  * @return 角度 
  */ 
 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 旋转后的图片 
  */ 
 public static Bitmap rotaingImageView(int angle, Bitmap bitmap) { 
  Bitmap returnBm = null; 
  // 根据旋转角度,生成旋转矩阵 
  Matrix matrix = new Matrix(); 
  matrix.postRotate(angle); 
  try { 
   // 将原始图片按照旋转矩阵进行旋转,并得到新的图片 
   returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
  } catch (OutOfMemoryError e) { 
  } 
  if (returnBm == null) { 
   returnBm = bitmap; 
  } 
  if (bitmap != returnBm) { 
   bitmap.recycle(); 
  } 
  return returnBm; 
 } 
} 

在调用修复图片角度方法的时候需要注意,现在的手机像素越来越大,拍完后一张照片有近10M,所以我们需要对图片进行压缩处理。不然在保存图片时会等待挺久的,屏幕会黑一会。
参考文档1
参考文档2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android手机拍照后图片被旋转  # Android拍照后图片被旋转  # Android三星图片被旋转  # Android实现屏幕旋转方法总结  # Android中利用matrix 控制图片的旋转、缩放、移动  # Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍  # Android开发 旋转屏幕导致Activity重建解决方法  # Android实现图片反转、翻转、旋转、放大和缩小  # Android编程中调用Camera时预览画面有旋转问题的解决方法  # Android开发之图形图像与动画(二)Animation实现图像的渐变/缩放/位移/旋转  # Android 图片缩放与旋转的实现详解  # Android编程实现RotateAnimation设置中心点旋转动画效果  # android实现icon动态旋转效果  # 给你  # 都是  # 文档  # 是在  # 旋转矩阵  # 你说  # 如果没有  # 不存在  # 设置为  # 配上  # 解决办法  # 完后  # 在手  # 需要注意  # 回调  # 上传图片  # 三星手机  # 到新  # 不透  # 干啥 


相关文章: 利用JavaScript实现拖拽改变元素大小  ,柠檬视频怎样兑换vip?  如何彻底卸载建站之星软件?  建站之星后台管理系统如何操作?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  代刷网站制作软件,别人代刷火车票靠谱吗?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何在Windows服务器上快速搭建网站?  如何在搬瓦工VPS快速搭建网站?  如何通过主机屋免费建站教程十分钟搭建网站?  Swift开发中switch语句值绑定模式  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何用已有域名快速搭建网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何彻底删除建站之星生成的Banner?  建站之星如何通过成品分离优化网站效率?  C#如何序列化对象为XML XmlSerializer用法  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  网站制作公司,橙子建站是合法的吗?  如何通过西部建站助手安装IIS服务器?  如何通过免费商城建站系统源码自定义网站主题与功能?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何在IIS中新建站点并解决端口绑定冲突?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  c# 在ASP.NET Core中管理和取消后台任务  微信小程序 input输入框控件详解及实例(多种示例)  Swift中switch语句区间和元组模式匹配  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何在景安服务器上快速搭建个人网站?  如何通过多用户协作模板快速搭建高效企业网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  建站之星伪静态规则如何正确配置?  模具网站制作流程,如何找模具客户?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  代购小票制作网站有哪些,购物小票的简要说明?  简单实现Android文件上传  如何注册花生壳免费域名并搭建个人网站?  如何快速查询网址的建站时间与历史轨迹?  济南专业网站制作公司,济南信息工程学校怎么样?  实例解析angularjs的filter过滤器  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  如何在IIS中配置站点IP、端口及主机头?  如何快速配置高效服务器建站软件?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  Python如何创建带属性的XML节点  微课制作网站有哪些,微课网怎么进?  独立制作一个网站多少钱,建立网站需要花多少钱?  行程制作网站有哪些,第三方机票电子行程单怎么开? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。