• Android 图片压缩的方法大全


    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;
    	}





  • 相关阅读:
    在ASP.NET AJAX中防止用户多次提交页面
    谈谈对C#委托的理解,附代码实例
    如何用VS2005制作Web安装程序 (转)
    VS2005下BoundField的DataFormatString不起作用了?
    使用XMLHttp在页面间传送参数
    远程连接sql server 2000服务器的解决方案
    JavaScript获取元素在浏览器画布中的绝对位置
    旧神谱
    [转帖]IE经典故障写真
    希腊神话
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7241502.html
Copyright © 2020-2023  润新知