Android tips(三)-->android拍照相片旋转问题

来源:互联网 发布:手机淘宝充值中心没有 编辑:程序博客网 时间:2024/06/03 02:12

转载请标明出处:一片枫叶的专栏  


最近项目中需要使用拍照选择图片功能,但是测试时发现部分机型拍照之后图片存在旋转问题,特记录此问题。。。

  android手机在拍照的时候竖屏拍摄,展示角度就是竖屏,如果是横屏拍摄,那么展示的时候已横屏的视角展示,此时旋转角度都是0(即总是展示水平方向的图片);

  android系统拍照完成之后会使用一个ExifInterface对象保存图片信息,包含:地理位置,旋转角度,大小,拍摄时间等等,如下图:

使用Camera拍照以后得到的照片可能会被旋转(90度,180度,270度),这个情况不太符合预期,一个解决思路是得到图片之后获取其旋转角度,若图片被旋转,则将图片在旋转回来;


首先读取图片的旋转角度:

/**     * 读取图片的旋转的角度     *     * @param path 图片绝对路径     * @return 图片的旋转角度     */    public static 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;    }

若图片被旋转,则将图片旋转回来:

/**     * 将图片按照某个角度进行旋转     *     * @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, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);        } catch (OutOfMemoryError e) {        }        if (returnBm == null) {            returnBm = bm;        }        if (bm != null && bm != returnBm) {            bm.recycle();        }        return returnBm;    }


2 0