部分Android手机拍照后照片被旋转的解决方案

在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,可以在onActivityResult方法中,获取到照片数据后,读取它的旋转信息,如果不是0,说明这个照片已经被旋转过了,那么再使用android.graphics.Matrix将照片旋转回去即可。

1、读取图片的旋转属性

/**

 * 读取图片的旋转的角度

 *

 * @param path

 *            图片绝对路径

 * @return 图片的旋转角度

 */

private int getBitmapDegree(String path) {

    int degree = 0;

    try {

        // 从指定路径下读取图片,并获取其EXIF信息

        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;

}

2、将图片按照某个角度进行旋转

/**

 * 将图片按照某个角度进行旋转

 *

 * @param bm

 *            需要旋转的图片

 * @param degree

 *            旋转角度

 * @return 旋转后的图片

 */

public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {

    Bitmap returnBm = null;

 

    // 根据旋转角度,生成旋转矩阵

    Matrix matrix = new Matrix();

    matrix.postRotate(degree);

    try {

        // 将原始图片按照旋转矩阵进行旋转,并得到新的图片

        returnBm = Bitmap.createBitmap(bm, 00, bm.getWidth(), bm.getHeight(), matrix, true);

    catch (OutOfMemoryError e) {

    }

    if (returnBm == null) {

        returnBm = bm;

    }

    if (bm != returnBm) {

        bm.recycle();

    }

    return returnBm;

}

OK,用上面两个方法,就能搞定了!

时间: 2024-08-09 10:43:48

部分Android手机拍照后照片被旋转的解决方案的相关文章

部分Android或IOS手机拍照后照片被旋转的问题

1.我们平时手机拍的照片,传到电脑后,使用Photoshop或者其它图片浏览工具打开时,发现图片是被转过的.可是Windows上预览却是正的.其实原因是部分Android或IOS手机拍照后,将图片角度信息存到了Exif信息中.我们只需要读取出来,再做相应的重绘,即可. 2.代码送上. class ImageNormal { public void NormalImageDegree(string imagePath) { var bitmap = (Bitmap)Bitmap.FromFile(

解决android有的手机拍照后上传图片被旋转的问题

转至 http://blog.csdn.net/walker02/article/details/8211628 需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重. 解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜

android手机拍照或选取相册里面的图片

three.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"

android 手机拍照返回 Intent==null 以及intent.getData==null

手机拍照第一种情况:private void takePicture(){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");String filename = timeStampFormat.format(new Date());ContentValues v

android 相机拍照后选择照片编辑,相片编辑界面直线形状会显示锯齿状

因为 decode 出来的图片太小,小于屏幕.所以,显示的时候 会把图片略微放大,导致直线形状会显示锯齿状. 能够改动getScreenImageSize 方法中的size 的大小,比方能够把133 ,变大. 详细改动例如以下: Please modify getScreenImageSize function in FilterShowActivity.java file about lines 507. private int getScreenImageSize() { DisplayMe

解决三星手机拍照后,图片旋转。

最近项目中遇到用三星手机拍照,图片会自动旋转,应该是三星内部系统的功能,然后需要是不让他旋转,找到了方法. 原理就是,获取到图片,判断它的旋转角度,然后相应的旋转回来. 在拍照的返回结果中,获取到图片的路径. path = filePath + fileName;  //path 为拍照返回的路径 File file = new File(path); int degree = readPictureDegree(file.getAbsolutePath()); Bitmap smallBitm

Android手机拍照功能的实现

一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

Android手机拍照

参考的这个视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html和官方API档file:///D:/Android/androidstudio/sdk/docs/guide/topics/media/camera.html java程序 package com.example.x_yp.system_camera; import android.content.Context; import android.content.Intent; imp

Android 手机进入不了fastboot模式的解决方案

本方案仅针对linux terminal下刷手机img文件的情况: fastboot的通常流程如下: 1 cd out/target/product/XXX/   //进入.img文件的目录2 adb reboot bootloader  //进入bootloader 模式3 fastboot devices  //检测手机是否进入fastboot模式4 fastboot flash boot boot.img5 fastboot flash system system.img6 fastboo