package com.app.tools; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLEncoder; import android.content.ContentResolver; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.net.Uri; import android.os.Environment; import android.os.StatFs; public class BitmapUtil { /** * 读取本地资源的图片 * * @param context * @param resId * @return * @throws FileNotFoundException */ public static Bitmap ReadBitmapById(Context context, Uri uri) throws FileNotFoundException { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; ContentResolver cr = context.getContentResolver(); InputStream is = cr.openInputStream(uri); return BitmapFactory.decodeStream(is, null, opt); } /*** * 根据资源文件获取Bitmap * * @param context * @param drawableId * @return * @throws FileNotFoundException */ public static Bitmap ReadBitmapById(Context context, Uri uri, int screenWidth, int screenHight) throws FileNotFoundException { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Config.ARGB_8888; options.inInputShareable = true; options.inPurgeable = true; ContentResolver cr = context.getContentResolver(); InputStream is = cr.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is, null, options); return getBitmap(bitmap, screenWidth, screenHight); } /*** * 等比例压缩图片 * * @param bitmap * @param screenWidth * @param screenHight * @return */ public static Bitmap getBitmap(Bitmap bitmap, int screenWidth, int screenHight) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scale = (float) screenWidth / w; float scale2 = (float) screenHight / h; scale = scale < scale2 ? scale : scale2; // 保证图片不变形. matrix.postScale(scale, scale); // w,h是原图的属性. return Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); } /*** * 保存图片至SD卡 * * @param bm * @param url * @param quantity */ private static int FREE_SD_SPACE_NEEDED_TO_CACHE = 1; private static int MB = 1024 * 1024; public final static String DIR = "/sdcard/hypers"; public static void saveBmpToSd(Bitmap bm, String url, int quantity) { // 判断sdcard上的空间 if (FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) { return; } if (!Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) return; String filename = url; // 目录不存在就创建 File dirPath = new File(DIR); if (!dirPath.exists()) { dirPath.mkdirs(); } File file = new File(DIR + "/" + filename); try { file.createNewFile(); OutputStream outStream = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.PNG, quantity, outStream); outStream.flush(); outStream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { e.printStackTrace(); } } /*** * 获取SD卡图片 * * @param url * @param quantity * @return */ @SuppressWarnings("deprecation") public static Bitmap GetBitmap(String url, int quantity) { InputStream inputStream = null; String filename = ""; Bitmap map = null; URL url_Image = null; String LOCALURL = ""; if (url == null) return null; try { filename = url; } catch (Exception err) { } LOCALURL = URLEncoder.encode(filename); if (Exist(DIR + "/" + LOCALURL)) { map = BitmapFactory.decodeFile(DIR + "/" + LOCALURL); } else { try { url_Image = new URL(url); inputStream = url_Image.openStream(); map = BitmapFactory.decodeStream(inputStream); // url = URLEncoder.encode(url, "UTF-8"); if (map != null) { saveBmpToSd(map, LOCALURL, quantity); } inputStream.close(); } catch (Exception e) { e.printStackTrace(); return null; } } return map; } /*** * 判断图片是存在 * * @param url * @return */ public static boolean Exist(String url) { File file = new File(DIR + url); return file.exists(); } /** * 计算sdcard上的剩余空间 * @return */ private static int freeSpaceOnSd() { StatFs stat = new StatFs(Environment.getExternalStorageDirectory() .getPath()); @SuppressWarnings("deprecation") double sdFreeMB = ((double) stat.getAvailableBlocks() * (double) stat .getBlockSize()) / MB; return (int) sdFreeMB; } }