照片压缩保存工具

package com.bdkj.gmys.utils;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.bdkj.gmys.constant.ConstantValue;

import android.R.integer;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;

public class PhotoUtil {
    // 根据路径获得图片并压缩,返回bitmap用于显示
    public static Bitmap getSmallBitmap(String filePath) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, 480, 800);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;

        return BitmapFactory.decodeFile(filePath, options);
    }

    // 根据路径,指定宽高获得图片并压缩,返回bitmap用于显示
    public static Bitmap getSmallBitmapWH(String filePath, int width, int height) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, width, height);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;

        return BitmapFactory.decodeFile(filePath, options);
    }

    // 计算图片的缩放值
    public static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }

    // 把bitmap转换成String
    public static String bitmapToString(String filePath) {

        Bitmap bm = getSmallBitmap(filePath);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 40, baos);
        byte[] b = baos.toByteArray();
        return Base64.encodeToString(b, Base64.DEFAULT);
    }

    /**
     * 读取图片属性:旋转的角度
     *
     * @param path
     *            图片绝对路径
     * @return degree旋转的角度
     */
    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 Bitmap
     */
    public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
        // 旋转图片 动作
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        System.out.println("angle2=" + angle);
        // 创建新的图片
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        return resizedBitmap;
    }

    // 保存小图
    public static void saveMyBitmap(String from) {
        try {
            File file = new File(Environment.getExternalStorageDirectory()
                    + ConstantValue.ROOTPATH + "/tempmini.jpg");
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream(file));
            Bitmap resultbm = getSmallBitmap(from);
            int angle = readPictureDegree(from);
            Log.i("dgree", angle + "度");
            if (angle != 0)
                resultbm = rotaingImageView(angle * -1, resultbm);
            resultbm.compress(Bitmap.CompressFormat.JPEG, 100, bos);// 将图片压缩到流中
            bos.flush();// 输出
            bos.close();// 关闭
            resultbm.recycle();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    // 指定宽高保存
    public static String saveMyBitmapWH(String from, int width, int height) {
        String path = "";
        try {
            path = Environment.getExternalStorageDirectory()
                    + ConstantValue.ROOTPATH + "/" + System.currentTimeMillis()
                    + ".jpg";
            File file = new File(path);
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream(file));
            Bitmap resultbm = getSmallBitmapWH(from, width, height);
            int angle = readPictureDegree(from);
            Log.i("dgree", angle + "度");
            if (angle != 0)
                resultbm = rotaingImageView(angle * -1, resultbm);
            resultbm.compress(Bitmap.CompressFormat.JPEG, 100, bos);// 将图片压缩到流中
            bos.flush();// 输出
            bos.close();// 关闭
            resultbm.recycle();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return path;
    }
}

posted @ 2015-10-22 14:34  蜗牛眼里的世界  阅读(169)  评论(0编辑  收藏  举报