Bitmap压缩

来源:互联网 发布:出奇制胜软件 编辑:程序博客网 时间:2024/06/05 21:29
private File imageFile;
private File sdFile;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sdFile = Environment.getExternalStorageDirectory();
imageFile = new File(sdFile, "Chrysanthemum2.jpg");
}

/**
* 1.质量压缩
* 原理:通过算法抠掉(同化)了图片中的一些某个些点附近相近的像素,达到降低质量介绍文件大小的目的。
* 减小了图片质量
* 注意:它其实只能实现对file的影响,对加载这个图片出来的bitmap内存是无法节省的,还是那么大。
* 因为bitmap在内存中的大小是按照像素计算的,也就是width*height,对于质量压缩,并不会改变图片的真实的像素(像素大小不会变)。

* 使用场景:
* 将图片压缩后保存到本地,或者将图片上传到服务器。根据实际需求来。
*/
public void qualitCompress(View v){
// BitmapFactory.decodeFile(pathName)
// BitmapFactory.decodeResource(res, id)
// BitmapFactory.decodeStream(is)

BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);
//压缩图片
compressImageToFile(bitmap, new File(sdFile,"qualityCompress.jpeg"));
}
public void sizeCompress(View v){
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);
compressBitmapToFileBySize(bitmap, new File(sdFile,"sizeCompress.jpeg"));

}

/**
* 2.尺寸压缩
* 通过减少单位尺寸的像素值,正真意义上的降低像素。1020*8880--
* 使用场景:缓存缩略图的时候(头像处理)

* @param bmp
* @param file
*/
public static void compressBitmapToFileBySize(Bitmap bmp,File file){
//压缩尺寸倍数,值越大,图片的尺寸就越小
int ratio = 4;
Bitmap result = Bitmap.createBitmap(bmp.getWidth()/ratio, bmp.getHeight()/ratio, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(result);
RectF rect = new RectF(0, 0, bmp.getWidth()/ratio, bmp.getHeight()/ratio);
canvas.drawBitmap(bmp, null, rect , null);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}

}



public static void compressImageToFile(Bitmap bmp,File file){
//0~100
int quality = 50;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, quality , baos );
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
0 0
原创粉丝点击