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;
	}
时间: 2024-12-20 16:43:08

Android 图片压缩的方法大全的相关文章

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 =

android图片压缩的3种方法实例

android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int options = 100

android图片压缩方法

第一:我们先看下质量压缩方法 private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteArra

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图.两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了.下面这个博客说的比较清晰: android图片压缩总结 总结来看,图片有三种存在形式:硬盘上时是fi

Android图片压缩技巧

请尊重他人的劳动成果,转载请注明出处:Android图片压缩技巧 http://blog.csdn.net/fengyuzhengfan/article/details/41759835 当需要将Android客户端的图片上传到服务器时,往往需要将图片进行压缩,关于图片的压缩方法,小编分享几种常用的方式: 第一种方式:裁切以达到压缩的目的 我曾在<Android开发之裁剪照片>一文中详细介绍过如何裁切照片,感兴趣的朋友可以去看一下. 第二种方式:将图片进行降质处理(即降低图片的质量)以达到压缩

android图片压缩总结

首先该文章是总结, 不是原创, 是通过看网上其他大神的文章和自己的一些实践总结出来的. 一.图片的存在形式 1.文件形式(即以二进制形式存在于硬盘上)2.流的形式(即以二进制形式存在于内存中)3.Bitmap形式 这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 我试过500K文件形式

android图片压缩上传系列-service篇

本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇.主要目的是:通过Service来执行图片压缩任务来讨论如何使用Service,如何处理任务量大的并发问题. 了解下Service 大家都知道如果有费时任务,这时需要将任务放到后台线程中执行,如果对操作的结果需要通过ui展示还需要在任务完成后通知前台更新.当然对于这种情况,大家也可以在Activity中启动线程,在线程中通过Handler和sendMessage来通知Activity并执行更新ui的操作,但是更好的方法是将这些操作

android图片压缩质量参数Bitmap.Config RGB_565等的含义

android图片压缩质量参数 在实用ImageLoader中,在配置DisplayImageOptions时,需要设置.bitmapConfig(Bitmap.Config.RGB_565) 那么这个 Bitmap.Config.RGB_565 是什么意思呢 ? 在android中的大图片一般都要经过压缩才能显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节. 打开Android.graphics.Bitmap类里有一个

Android图片压缩方法总结

本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 第一:质量压缩方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 private Bitmap compressImage(Bitmap image) {           ByteArrayOutputStream baos = new ByteArrayOutputStream();         image