调用系统相机导致照片旋转问题的修复

如题,相信非常多开发人员在调用系统照相机接收拍好的照片时,发现照片被无故旋转了90度。这一问题反映在大部分的三星手机上,当然其它的机器还没试全然,总之是有问题。

于是乎想到例如以下的解决的方法:

  1. 识别机型,获取手机型号。然后推断是否须要旋转;
  2. 通过获取照片宽度和高度推断是否须要旋转;
  3. 自己动手写一个照相机Activity。自己来获取摄像头数据,保存照片;
  4. 分析发生旋转的照片数据。动态推断是否须要旋转,以及旋转正确的角度。

前三种方法均不是理想的解决方式。

首先说1:这样的相似于穷举的办法,总会有那些被遗忘的“角落”。维护这些机型会非常繁琐;

然后说2:假设这样的话,假设刚好用户要横屏照照片,还是会发生旋转;

最后说3:这样的方法岂是我等“懒”程序猿所能做到的?(PS:事实上是需求所限啦,自己写照相APP,耗时+费精力+easy出bug。优点就在于用户会感觉自己始终处于同一APP中。而不是发生了跳转。

那么第四种方案是怎样做到的呢?

首先通过分析,通常一张照片包括很多EXIF信息。

这些信息包括了拍照的设备,曝光度。是否使用了闪光灯种种内容。这当中包括了角度,也就是旋转问题的症结所在。

手机自身的照片查看器(某些机型)在显示照片的时候,会分析这些信息,当分析的角度的信息时。会自己主动旋转照片到合适的角度。比較常见的角度是90、180、270。

大部分的三星手机在竖屏拍照的时候会拍出角度为90度的照片,横屏为0度。因此,解决的思路就是依照EXIF中的角度信息进行旋转就可以。

主要用到安卓API中的Matrix。

关键代码可參考以下的代码片:

 ExifInterface exifInterface = new ExifInterface(APPCFG.IMAGE_FILE);
 int orientationDegree = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
 Matrix matrix = new Matrix();
 matrix.reset();
 if (orientationDegree == ExifInterface.ORIENTATION_ROTATE_90) {
    matrix.postRotate(90);
 }
 if (orientationDegree == ExifInterface.ORIENTATION_ROTATE_180) {
    matrix.postRotate(180);
 }
 if (orientationDegree == ExifInterface.ORIENTATION_ROTATE_270) {
    matrix.postRotate(270);
 }
 bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);

上述代码中,bitmap是Bitmap对象。我这里须要在后面显示,所以临时没有recycle()。提醒大家一下。免得内存溢出。

到此,不管是三星还是什么机型。利用这样的通用的方法,就可以解决照片旋转的问题了。

时间: 2024-10-29 19:08:38

调用系统相机导致照片旋转问题的修复的相关文章

Android调用系统相机功能

在常规应用开发过程中,我们经常会使用到手机的相机功能,通过调用系统相机方便快捷的帮助我们实现拍照功能,本篇我将带领大家实现一下,如何通过调用系统相机实现拍照. 第一种:调用系统相机拍照,通过返回的照片缩略图展示我们的拍照图片 打开系统相机: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, TAKE_PICTURE);// 如果用Activity.RESULT_O

Android7.0调用系统相机拍照、读取系统相册照片+CropImageView剪裁照片

Android手机拍照.剪裁,并非那么简单 简书地址:[我的简书–T9的第三个三角] 前言 项目中,基本都有用户自定义头像或自定义背景的功能,实现方法一般都是调用系统相机–拍照,或者系统相册–选择照片,然后进行剪裁,最终设为头像或背景. 而在Android6.0之后,需要动态获取权限,而且Android7.0之后,无法直接根据拍照返回的URI拿到图片,这是因为从安卓7.0开始,直接使用本地真实路径被认为是不安全的,会抛出FileUriExposedExCeption异常,本文就是基于这个功能去针

Android调用系统相机拍照保存照片很小解决方案

保存图片小的一般操作步骤: 1. 调用系统相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); 2. 保存照片 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {  // TODO Auto-generated method s

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

安卓 调用系统相机并裁剪

做程序猿已有一段时间,东西也做了挺多,今天刚开通了博客,把我之前做过的东西记录下来,今天先写安卓系统下调用系统照相机并裁剪 之前做调用系统相机的时候遇到过很多问题,现在贴代码,在代码中一点点提出 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent; String fileName = System.currentTimeMillis() + ".p

Android 调用系统相机以及相册源码

Android 调用系统相机拍照.以及相册.完成之后图片是上传到app上.前面的功能已经测试过了.没有上传到服务器,因为我没服务器测试.但项目里面有个类可以参考上传图片到服务器,我就没测试了.接下来看代码,虽然注释写得少,但其作用看英文单词意思,又在或是查看调用. 项目源码下载地址:http://download.csdn.net/detail/qq_16064871/8585169 转载请注明出处: http://blog.csdn.net/qq_16064871 package com.ex

调用系统相机,相册功能

一开始的思路是这一块的功能单独出去;这样处理又会碰见很多问题. 还是集成在Activity中可能效果更好些, 而且三星的手机调用系统相机会导致调用的Activity会重启生命周期,如果是在fragment中调用的,会碰见更多的问题,做外包的伤不起,想深入下这个问题都没时间,暂时记录下在Activity中解决问题的方法,方便后面使用时直接拿来用. 比如在Activity中点击某个按钮,弹出一个对话框,选择拍照还是选择图片 mButton.setOnClickListener(new OnClick

Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是“确定”图标,返回的resultCode = -1(Activity.RESULT_OK): 如果点击的是底部的“返回”键,返回的resultCode = 0(Activity.RESULT_CANCELED). 简单的调用系统相机的写法: //调用系统拍照 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String p

Android 调用系统相机拍照保存以及调用系统相册的方法

系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的.下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法. 首先看看调用系统相机的核心方法: Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera, CAMERA); 相机返回的数据通过下面的回调方法取得,并处理: public static final int CAMERA  = 0x01; @Over