记一个使用系统相机拍照后照片被旋转的问题

最近在做项目的自定义相册时,遇到了这么一个问题:从 小米9 手机上面的拉起系统相机进行拍照,然后上传到服务器上面,发现图片莫名其妙就旋转了 90° ,这个并不符合业务方的需求,在仔细分析后,发现拍照后,系统保存到本地的照片已经给旋转过了

因此要解决这个问题,就只有在拍照后,判断图片是否给旋转,如果有,就将它旋转回去

要获取图片的旋转信息,就需要获取图片的 Exit 信息,它里面存储了图片的全部参数,我们可以通过 ExifInterface 来获取到这个数据:

/**
 * 读取图片的旋转的角度
 *
 * @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;
        default:
            break;
        }
    } catch (IOException ignore) {
    
    
    }
    return degree;
}

如果 degree 不为 0 ,那么就说明 图片已经给旋转了,那么就需要我们去旋转回去:

    /**
     * @param filePath 文件存储路径
     * @param degree 旋转角度
     * @param savePath 文件保管路径
     */
    private void rotateBitmapByDegree(String filePath, int degree, String savePath)  {
    
    
        try {
    
    
            Matrix matrix = new Matrix();
            // 根据旋转角度,生成旋转矩阵
            matrix.postRotate(degree);
            Bitmap bm = BitmapFactory.decodeFile(filePath);
            // 将原始图片按照旋转矩阵进行旋转,并得到新的图片
            final Bitmap bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
            //将新的图片保管到本地
            bitmap.compress(CompressFormat.JPEG, 85, new FileOutputStream(savePath));
        } catch (FileNotFoundException ignore) {
    
    
        }
    }

猜你喜欢

转载自blog.csdn.net/f409031mn/article/details/110787421
今日推荐