Android关于有些机型拍摄的照片在代码里调用图库照片显示翻转问题

2017-07-24 11:10:20来源:CSDN作者:cheweilol人点击

有些机型我现在发现的有小米6和三星的机子,调用系统图库照片出现了翻转,但是在相册里却不会翻转,用户上传的图片显得很不友好,所以要想办法解决一下,查看了诸多的材料,下面的是我调用的工具类(代码里的注释写的很明显了,希望能帮到有用到的吧):

package com.tr.ui.widgets;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.media.ExifInterface;import android.os.Environment;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;/** * Created by ${chewei} on 2017/7/21. * params:2017/7/21 * 集合一些图片工具 */public class PhotoBitmapUtils {    /**     * 存放拍摄图片的文件夹     */    private static final String FILES_NAME = "/MyPhoto";    /**     * 获取的时间格式     */    public static final String TIME_STYLE = "yyyyMMddHHmmss";    /**     * 图片种类     */    public static final String IMAGE_TYPE = ".png";    // 防止实例化    private PhotoBitmapUtils() {    }    /**     * 获取手机可存储路径     *     * @param context 上下文     * @return 手机可存储路径     */    private static String getPhoneRootPath(Context context) {        // 是否有SD卡        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)                || !Environment.isExternalStorageRemovable()) {            // 获取SD卡根目录            return context.getExternalCacheDir().getPath();        } else {            // 获取apk包下的缓存路径            return context.getCacheDir().getPath();        }    }    /**     * 使用当前系统时间作为上传图片的名称     *     * @return 存储的根路径+图片名称     */    public static String getPhotoFileName(Context context) {        File file = new File(getPhoneRootPath(context) + FILES_NAME);        // 判断文件是否已经存在,不存在则创建        if (!file.exists()) {            file.mkdirs();        }        // 设置图片文件名称        SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault());        Date date = new Date(System.currentTimeMillis());        String time = format.format(date);        String photoName = "/" + time + IMAGE_TYPE;        return file + photoName;    }    /**     * @Description 保存图片到指定路径     * @param bitmap 要保存的图片     * @param filePath 目标路径     * @return 是否成功     */    public static boolean saveBmpToPath(final Bitmap bitmap, final String filePath) {        if (bitmap == null || filePath == null) {            return false;        }        boolean result = false; //默认结果        File file = new File(filePath);        OutputStream outputStream = null; //文件输出流        try {            outputStream = new FileOutputStream(file);            result = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); //将图片压缩为JPEG格式写到文件输出流,100是最大的质量程度        } catch (Exception e) {            e.printStackTrace();        } finally {            if (outputStream != null) {                try {                    outputStream.close(); //关闭输出流                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return result;    }    /**     * 把原图按1/10的比例压缩     *     * @param path 原图的路径     * @return 压缩后的图片     */    public static Bitmap getCompressPhoto(String path) {        BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = false;        options.inSampleSize = 10;  // 图片的大小设置为原来的十分之一        Bitmap bmp = null;        try {            bmp = BitmapFactory.decodeFile(path, options);            options = null;        }catch (Exception e){            try {                bmp = BitmapFactory.decodeStream(new FileInputStream(new File(path)),null, options);            } catch (Exception e1) {                e1.printStackTrace();            }            options = null;        }        return bmp;    }    /**     * 处理旋转后的图片     * @param originpath 原图路径     * @param context 上下文     * @return 返回修复完毕后的图片路径     */    public static boolean amendRotatePhoto(String originpath, Context context) {        // 取得图片旋转角度        int angle = readPictureDegree(originpath);        // 把原图压缩后得到Bitmap对象        Bitmap bmp = getCompressPhoto(originpath);;        // 修复图片被旋转的角度        Bitmap bitmap = rotaingImageView(angle, bmp);        // 保存修复后的图片并返回保存后的图片路径//        return savePhotoToSD(bitmap, context);        return saveBmpToPath(bitmap,originpath);    }    /**     * 读取照片旋转角度     *     * @param path 照片路径     * @return 角度     */    public static int readPictureDegree(String path) {        int degree = 0;        try {            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 angle 被旋转角度     * @param bitmap 图片对象     * @return 旋转后的图片     */    public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {        if(angle == 0){            return bitmap;        }        Bitmap returnBm = null;        // 根据旋转角度,生成旋转矩阵        Matrix matrix = new Matrix();        matrix.postRotate(angle);        try {            // 将原始图片按照旋转矩阵进行旋转,并得到新的图片            returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);        } catch (OutOfMemoryError e) {        }        if (returnBm == null) {            returnBm = bitmap;        }        if (bitmap != returnBm) {            bitmap.recycle();        }        return returnBm;    }}
在调用ContentResolver获取系统相册时,需要遍历获取每一张图片的具体路径时,可以调用以下方法检测是否图片被翻转了,被翻转然后再给它转过来,地址还是原来的地址

if(PhotoBitmapUtils.readPictureDegree(path)>0){                            if(!PhotoBitmapUtils.amendRotatePhoto(path,context)){                                continue;                            }                        }

调用系统相机拍照也是同样的道理


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台