zoukankan      html  css  js  c++  java
  • 调用系统相机导致照片旋转问题的修复

    如题,相信非常多开发人员在调用系统照相机接收拍好的照片时,发现照片被无故旋转了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()。提醒大家一下。免得内存溢出。
    到此,不管是三星还是什么机型。利用这样的通用的方法,就可以解决照片旋转的问题了。

  • 相关阅读:
    前端自动化测试python+webdriver
    JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
    onpageshow 监听页面是否是缓存页面
    CSS完美实现iframe高度自适应(支持跨域)
    HTML5 简单归纳 -- 前端知识 (一)
    JavaScrip 概述 -- 前端知识
    CSS 简单归纳 -- 前端知识
    HTML 简单归纳 -- 前端知识
    解决vscode-insider连接不了远程服务器问题
    回首,只为再出发!
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7040235.html
Copyright © 2011-2022 走看看