您的位置:首页 > 移动开发 > Android开发

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

2014-10-31 18:25 537 查看
博客为 有时个哥 原创,如需转载请标明出处:/article/11171954.html

采样率压缩:

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

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异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: