Android应用开发之图片(Bitmap)压缩(三)---------采样率压缩

博客为 有时个哥 原创,如需转载请标明出处:http://blog.csdn.net/ls703/article/details/40617465

采样率压缩:

采样率压缩是改变了图片的像素,他是通过先读取图片的边,然后在自己设定图片的边,然后根据设定,读取图片的像素。在读取的时候,并不是所有的像素都读取,而是由选择的。所以这种方式减少了像素的个数,能改变图片在内存中的占用大小。大体的用法如下面。我们用下面的简单实例代码来了解一下。

package com.example.bitmapdemo.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.text.TextUtils;

public class ImageUtils3 {
	
	public static Bitmap compressImageToBitmap(String imagePath){
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);
		if(bitmap != null){
			System.out.println("bitmap=========1>>>>"+bitmap.getByteCount());
		}else{
			System.out.println("kong");
		}
		options.inJustDecodeBounds = false;
		options.inSampleSize = 2;
		
		bitmap = BitmapFactory.decodeFile(imagePath,options);
		System.out.println("bitmap=========2>>>>"+bitmap.getByteCount());
		
		return bitmap;
	}
	
}


 

package com.example.bitmapdemo;

import java.io.FileInputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;

import com.example.bitmapdemo.utils.ImageUtils;
import com.example.bitmapdemo.utils.ImageUtils2;
import com.example.bitmapdemo.utils.ImageUtils3;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
//		String imagePath = "/mnt/sdcard/image.png";
		String imagePath = "/mnt/sdcard/17.jpg";
		Bitmap bitmap = getBitmap(imagePath);
		getInputStreanm(imagePath);
//		getCompessImage(imagePath);
		getCompessImage(bitmap);
//		getCompess(imagePath);
		
	}

	public Bitmap getBitmap(String pathName){
		Bitmap bm = ImageUtils.getBitmapFromLocal(pathName);
//		Bitmap bm = ImageUtils2.getBitmapFromLocal(pathName);
//		System.out.println("bitmap:::"+bm.getRowBytes()*bm.getHeight());
		System.out.println("bitmap:::"+bm.getByteCount());
		System.out.println("bitmap的另一种求法:::"+bm.getWidth() * bm.getHeight()*4 ); 
		return bm;
	}
	
	public void getInputStreanm(String pathName){
		try {
			FileInputStream fis = new FileInputStream(pathName);
			System.out.println("inputStream:::"+fis.available());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void getCompess(String pathName){
		ImageUtils2.writeCompressImage2File(pathName,Environment.getExternalStorageDirectory()
				.getAbsolutePath()+"/oo", 60);
	}
	public void getCompessImage(String pathName){
		ImageUtils3.compressImageToBitmap(pathName);
	}
	public void getCompessImage(Bitmap bitmap){
		ImageUtils3.compressImageToBitmap(bitmap);
	}
}

然后下面是运行结果:

由运行结果我们可以看出前后的bitmap呗压缩了4倍。关于ImageUtils3中的BitmapFactory里面的一些方法的作用已经在Android应用开发之图片(Bitmap)压缩(一)中介绍过了。

options.inJustDecodeBounds = true;这一句话是允许读取图片的边,然后读取Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);图片,把图片的信息存入到了上面BitmapFactory.Options options = new BitmapFactory.Options();的options里面了。值得注意的是,当options.inJustDecodeBounds 的值是true,只是读取图片的边,而不是读取整个图片,所以Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);得到的bitmap是空的。获得图片的信息后,接下来为了能保证获得正常的bitmap,所以要关闭 options.inJustDecodeBounds ,即把他的值变为false;然后我们在根据自己的需求设置图片的大小。options.inSampleSize 这个参数就是来设置图片的压缩倍数,我这里测试时写的值是2,也就是说是原来的1/2,要注意,这里的1/2值得是宽和高分别是原图的1/2。所以图片是被压缩了四倍,从输出的结果我们也能看出。这里也可以通过options得到图片的高和宽,用高宽,来设定压缩的倍数。设置好压缩的倍数,则在运行Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);获得bitmap。由于此时options.inJustDecodeBounds = false,所以是得到的bitmap不是空了,此时得到是已经压缩好的bitmap。

 

采样率压缩,的的确确的改变了图片占用内存问题,但是由于像素改变,压缩容易造成失真问题。使用采样率压缩,不需要一开始把图片完全读取到内存,而是先读取图片的边,然后设置图片的尺寸,然后再根据尺寸,选择的读取像素。这种方法避免了一开始就吧图片读入内存而造成的oom异常。

你可能感兴趣的:(Android探索实验)