1. 程式人生 > >Android 圖片壓縮的方法大全

Android 圖片壓縮的方法大全

方法 nal ons arr reset 註意 you 固定 .com

public static Bitmap revitionImageSize(String path) throws IOException {
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(
				new File(path)));
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeStream(in, null, options);
		in.close();
		int i = 0;
		Bitmap bitmap = null;
		while (true) {
			if ((options.outWidth >> i <= 1000)
					&& (options.outHeight >> i <= 1000)) {
				in = new BufferedInputStream(
						new FileInputStream(new File(path)));
				options.inSampleSize = (int) Math.pow(2.0D, i);
				options.inJustDecodeBounds = false;
				bitmap = BitmapFactory.decodeStream(in, null, options);
				break;
			}
			i += 1;
		}
		return bitmap;
	}

圖片按比例大小壓縮方法(依據路徑獲取圖片並壓縮)

public static Bitmap getimage(String srcPath)throws IOException{  
        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); return bitmap;//壓縮好比例大小後再進行質量壓縮 }

第三:圖片按比例大小壓縮方法(依據Bitmap圖片壓縮):

public static 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 bitmap;//壓縮好比例大小後再進行質量壓縮 }

依據路徑獲得突破並壓縮返回bitmap用於顯示

public static Bitmap getSmallBitmap(String filePath) throws IOException{
		
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, options);
		options.inSampleSize = calculateInSampleSize(options, 480, 800);
		options.inJustDecodeBounds = false;
		
		return BitmapFactory.decodeFile(filePath, options);
	}
	/**
	 * 計算圖片的縮放值
	 * 
	 * @param options
	 * @param reqWidth
	 * @param reqHeight
	 * @return
	 */
	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;
	}





Android 圖片壓縮的方法大全