图片的工具类

// 压缩图片

public final class ImageTools {

    /**
     * 
     * */
    public static int computeSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) {
        int initialSize = computeInitialSampleSize(options, minSideLength,
                maxNumOfPixels);
        int roundedSize;
        if (initialSize <= 8) {
            roundedSize = 1;
            while (roundedSize < initialSize) {
                roundedSize <<= 1;
            }
        } else {
            roundedSize = (initialSize + 7) / 8 * 8;
        }
        return roundedSize;
    }

    private static int computeInitialSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) {
        double w = options.outWidth;
        double h = options.outHeight;
        int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
                .sqrt(w * h / maxNumOfPixels));
        int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(                 //128
                Math.floor(w / minSideLength), Math.floor(h / minSideLength));
        if (upperBound < lowerBound) {
            return lowerBound;
        }
        if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
            return 1;
        } else if (minSideLength == -1) {
            return lowerBound;
        } else {
            return upperBound;
        }
    }

    /**
     * 根据URI获取图片物理路径
     * 
     * */
    public static String getAbsoluteImagePath(Uri uri, Activity activity) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = activity.managedQuery(uri, proj, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

    // 根据路径,和压缩后宽高获取图片 , 
    public static Bitmap getImageBitmap(String path,int width,int height) throws FileNotFoundException,
            IOException {
        Bitmap bmp = null;
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, opts);
        opts.inSampleSize = ImageTools.computeSampleSize(opts, -1, width * height);// 得到缩略图
        opts.inJustDecodeBounds = false;
        try {
            bmp = BitmapFactory.decodeFile(path, opts);
        } catch (OutOfMemoryError e) {
            LogUtils.d(e.getMessage());
        }
        return bmp;
    }

}
// 路径  压缩到常见屏幕 800*480分辨率,  写到sd卡
    // 路径  压缩到常见屏幕 800*480分辨率,  写到sd卡
    private static File getimage(String srcPath) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 开始读入图片,此时把options.inJustDecodeBounds 设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空

        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
        float hh = 800f;// 这里设置高度为800f
        float ww = 480f;// 这里设置宽度为480f
        // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
        int be = 1;// be=1表示不缩放
        if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0)
            be = 1;
        newOpts.inSampleSize = be;// 设置缩放比例
        // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        
        bitmap = compressImage(bitmap);  //质量压缩
        File file=null;
        try {

            File rootFile = Environment.getExternalStorageDirectory();
            File tempFile = new File(rootFile, "guangyuanwang");
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }
            String[] split = srcPath.split("/");

             file = new File(tempFile, split[split.length - 1]);
            FileOutputStream outputStream = null;

            outputStream = new FileOutputStream(file);
            bitmap.compress(CompressFormat.PNG, 100, outputStream); //写到sd卡
            if (outputStream != null)
                outputStream.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return file;// 压缩好比例大小后再进行质量压缩
    }
    
    // 根据 压缩到常见屏幕 800*480分辨率
    private Bitmap comp(Bitmap image) { 
        ByteArrayOutputStream baos = new ByteArrayOutputStream();          
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);   
        if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出     
            baos.reset();//重置baos即清空baos   
            image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中   
        }   
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());   
        BitmapFactory.Options newOpts = new BitmapFactory.Options();   
        //开始读入图片,此时把options.inJustDecodeBounds 设回true了   
        newOpts.inJustDecodeBounds = true;   
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);   //读入图片
        newOpts.inJustDecodeBounds = false;   
        int w = newOpts.outWidth;   
        int h = newOpts.outHeight;   
        //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为   
        float hh = 800f;//这里设置高度为800f   
        float ww = 480f;//这里设置宽度为480f   
        //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可   
        int be = 1;//be=1表示不缩放   
        if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放   
            be = (int) (newOpts.outWidth / ww);   
        } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放   
            be = (int) (newOpts.outHeight / hh);   
        }   
        if (be <= 0)   
            be = 1;   
        newOpts.inSampleSize = be;//设置缩放比例   
        //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了   
        isBm = new ByteArrayInputStream(baos.toByteArray());   
        bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);   
        return compressImage(bitmap);//压缩好比例大小后再进行质量压缩   
  }  
原文地址:https://www.cnblogs.com/java-g/p/4598624.html