美文网首页iOS菜鸟食谱编程二三事
解决某些机型调用系统相机照片旋转的问题

解决某些机型调用系统相机照片旋转的问题

作者: 萧文翰 | 来源:发表于2015-09-24 09:01 被阅读579次

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

    于是乎想到如下的解决办法:

    识别机型,获取手机型号,然后判断是否需要旋转;

    通过获取照片宽度和高度判断是否需要旋转;

    自己动手写一个照相机Activity,自己来获取摄像头数据,保存照片;

    分析发生旋转的照片数据,动态判断是否需要旋转,以及旋转正确的角度。

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

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

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

    最后说3:这种方法岂是我等“懒”程序员所能做到的?(PS:其实是需求所限啦,自己写照相APP,耗时+费精力+容易出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(),提醒大家一下,免得内存溢出。

    到此,无论是三星还是什么机型,利用这种通用的方法,即可解决照片旋转的问题了。

    相关文章

      网友评论

        本文标题:解决某些机型调用系统相机照片旋转的问题

        本文链接:https://www.haomeiwen.com/subject/kxnicttx.html