Android小知识之图片的3种压缩方式小结
设置图片格式
Android目前常用的图片格式有png,jpeg和webp,
png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式
jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的大图压缩,不适合logo
webp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从谷歌官网来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有损webp在Android4.0(API14)之后支持,无损和透明在Android4.3(API18)之后支持
采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小
Android中Bitmap所占内存大小计算方式:图片长度x图片宽度x一个像素点占用的字节数
1、Bitmap的Compress方法(质量压缩):
publicbooleancompress(CompressFormatformat,intquality,OutputStreamstream)
参数format:表示图像的压缩格式,目前有CompressFormat.JPEG、CompressFormat.PNG、CompressFormat.WEBP。
参数quality:图像压缩率,0-100。0压缩100%,100意味着不压缩。
参数stream:写入压缩数据的输出流。
常用的用法:
publicstaticBitmapcompress(Bitmapbitmap){ ByteArrayOutputStreambaos=newByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,90,baos); byte[]bytes=baos.toByteArray(); returnBitmapFactory.decodeByteArray(bytes,0,bytes.length); }
上面方法中通过bitmap的compress方法对bitmap进行质量压缩,10%压缩,90%不压缩。
图片的大小是没有变的,因为质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,这也是为什么该方法叫质量压缩方法。图片的长,宽,像素都不变,那么bitmap所占内存大小是不会变的。
quality值越小压缩后的baos越小(使用场景:在微信分享时,需要对图片的字节数组大小进行限制,这时可以使用bitmap的compress方法对图片进行质量压缩)。
2、BitmapFactory.Options的inJustDecodeBounds和inSampleSize参数(采样压缩率):
inJustDecodeBounds:当inJustDecodeBounds设置为true的时候,BitmapFactory通过decodeXXXX解码图片时,将会返回空(null)的Bitmap对象,这样可以避免Bitmap的内存分配,但是它可以返回Bitmap的宽度、高度以及MimeType。
inSampleSize:当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1/inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为,width=50,height=50,宽高降为1/2,像素数降为1/4。
常用用法:
publicstaticBitmapinSampleSize(Bitmapbitmap,intreqWidth,intreqHeight){ finalBitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds=true; BitmapFactory.decodeByteArray(data,0,data.length,options); options.inSampleSize=calculateInSampleSize(options,reqWidth, reqHeight); options.inJustDecodeBounds=false; returnBitmapFactory.decodeByteArray(data,0,data.length,options); } publicstaticintcalculateInSampleSize(BitmapFactory.Optionsoptions, intreqWidth,intreqHeight){ finalintpicheight=options.outHeight; finalintpicwidth=options.outWidth; inttargetheight=picheight; inttargetwidth=picwidth; intinSampleSize=1; if(targetheight>reqHeight||targetwidth>reqWidth){ while(targetheight>=reqHeight &&targetwidth>=reqWidth){ inSampleSize+=1; targetheight=picheight/inSampleSize; targetwidth=picwidth/inSampleSize; } } returninSampleSize; } }
inSampleSize方法中先将inJustDecodeBounds设置为false,在通过BitmapFactory的decodeXXXX方法解码图片,返回空(null)的Bitmap对象,同时获取了bitmap的宽高,再通过calculateInSampleSize方法根据原bitmap的宽高和目标宽高计算出合适的inSampleSize,最后将inJustDecodeBounds设置为true,通过BitmapFactory的decodeXXXX方法解码图片(使用场景:比如读取本地图片时,防止Bitmap过大导致内存溢出)。
3、通过Matrix压缩图片
Matrixmatrix=newMatrix(); matrix.setScale(0.5f,0.5f); bm=Bitmap.createBitmap(bit,0,0,bit.getWidth(),bit.getHeight(),matrix,true); }
使用场景:自定义View时,对图片进行缩放、旋转、位移以及倾斜等操作,常见的就是对图片进行缩放处理,以及圆角图片等。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。