在Android开发中,图片的处理很长用到,网上图片的三级缓存的工具有很多,但是很多时候会对图片进行处理,比如说上传的时候需要控制图片的大小,这就不得不说到图片的压缩。图片处理的方法有很多,前两天在使用图片压缩的时候遇到很多问题,在这里记录一下。
首先,在项目中图片是处理成字节流然后转成字符串和数据一块上传到服务器的,所以在选择图片的时候有流对图片进行了处理,读取图片,将图片转成字节流再保存成字符串。图片的压缩的方式如下:
public staticBitmap compressBySize(String pathName,inttargetWidth,
inttargetHeight) {
BitmapFactory.Options opts =newBitmapFactory.Options();
opts.inJustDecodeBounds=true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等;
Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);
// 得到图片的宽度、高度;
intimgWidth = opts.outWidth;
intimgHeight = opts.outHeight;
// 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数;
intwidthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);
intheightRatio = (int) Math.ceil(imgHeight / (float) targetHeight);
if(widthRatio >1|| heightRatio >1) {
if(widthRatio > heightRatio) {
opts.inSampleSize= widthRatio;
}else{
opts.inSampleSize= heightRatio;
}
}
// 设置好缩放比例后,加载图片进内容;
opts.inJustDecodeBounds=false;
bitmap = BitmapFactory.decodeFile(pathName, opts);
returnbitmap;
}
使用这种方式压缩图片就会遇到一个问题,因为图片压缩是制定宽高的,也就是压缩完了的图片等额大小就固定了,当在不同分辨率的手机上显示就会有问题了,于是就找了另外一个图片压缩的方法
public staticBitmap compressByQuality(Bitmap bitmap,intmaxSize) {
ByteArrayOutputStream baos =newByteArrayOutputStream();
intquality =100;
bitmap.compress(CompressFormat.JPEG, quality, baos);
System.out.println("图片压缩前大小:"+ baos.toByteArray().length+"byte");
booleanisCompressed =false;
while(baos.toByteArray().length/1024> maxSize) {
quality -=10;
baos.reset();
bitmap.compress(CompressFormat.JPEG, quality, baos);
System.out.println("质量压缩到原来的"+ quality +"%时大小为:"
+ baos.toByteArray().length+"byte");
isCompressed =true;
}
System.out.println("图片压缩后大小:"+ baos.toByteArray().length+"byte");
if(isCompressed) {
Bitmap compressedBitmap = BitmapFactory.decodeByteArray(
baos.toByteArray(),0, baos.toByteArray().length);
recycleBitmap(bitmap);
returncompressedBitmap;
}else{
returnbitmap;
}
}
这种方法压缩的优点是可以压缩图片到制定大小范围(某些高清图片可能会压缩不到制定大小),但时候这种压缩方式的压缩效率真的是不敢恭维,一张手机拍的照片压缩到500k需要十几秒,另外这种压缩方式压缩完的图片得到的bitmap还是原图的大小,只是存储的大小变小了。
另外也试了其他的方式,最后效果都不理想,最终使用的是第一种方式,图片的压缩大小是屏幕宽高的80%。
结语:这篇文章纯粹是记录个人在开发过程中遇到的问题,如果哪位大神有好的方法或者思路的话,欢迎指导。
网友评论