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(API 14)之后支持,无损和透明在Android4.3(API18)之后支持

采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小

Android中Bitmap所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数

1、Bitmap的Compress方法(质量压缩):

public boolean compress(CompressFormat format, int quality, OutputStream stream)

参数format:表示图像的压缩格式,目前有CompressFormat.JPEG、CompressFormat.PNG、CompressFormat.WEBP。

参数quality: 图像压缩率,0-100。 0 压缩100%,100意味着不压缩。

参数stream: 写入压缩数据的输出流。

常用的用法:

public static Bitmap compress(Bitmap bitmap){

 ByteArrayOutputStream baos = new ByteArrayOutputStream();

 bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);

 byte[] bytes = baos.toByteArray();

 return BitmapFactory.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。

常用用法:

public static Bitmap inSampleSize(Bitmap bitmap,int reqWidth,int reqHeight){

 final BitmapFactory.Options options = new BitmapFactory.Options();

 options.inJustDecodeBounds = true;

 BitmapFactory.decodeByteArray(data, 0, data.length, options);

 options.inSampleSize = calculateInSampleSize(options, reqWidth,

   reqHeight);

 options.inJustDecodeBounds = false;

 return BitmapFactory.decodeByteArray(data, 0, data.length, options);

}

public static int calculateInSampleSize(BitmapFactory.Options options,

          int reqWidth, int reqHeight) {

 final int picheight = options.outHeight;

 final int picwidth = options.outWidth;

 int targetheight = picheight;

 int targetwidth = picwidth;

 int inSampleSize = 1;

 if (targetheight > reqHeight || targetwidth > reqWidth) {

  while (targetheight >= reqHeight

    && targetwidth >= reqWidth) {

   inSampleSize += 1;

   targetheight = picheight / inSampleSize;

   targetwidth = picwidth / inSampleSize;

  }

 }

 return inSampleSize;

}
}

inSampleSize方法中先将inJustDecodeBounds设置为false,在通过BitmapFactory的decodeXXXX方法解码图片,返回空(null)的Bitmap对象,同时获取了bitmap的宽高,再通过calculateInSampleSize方法根据原bitmap的 宽高和目标宽高计算出合适的inSampleSize,最后将inJustDecodeBounds设置为true,通过BitmapFactory的decodeXXXX方法解码图片(使用场景:比如读取本地图片时,防止Bitmap过大导致内存溢出)。

3、通过Matrix压缩图片

Matrix matrix = new Matrix();

matrix.setScale(0.5f, 0.5f);

bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),bit.getHeight(), matrix, true);

}

使用场景:自定义View时,对图片进行缩放、旋转、位移以及倾斜等操作,常见的就是对图片进行缩放处理,以及圆角图片等。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解android 通过uri获取bitmap图片并压缩

    详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onActivityResult中用Media.getBitmap来获取返回的图片,如下: Uri mImageCaptureUri = data.getData(); Bitmap photoBmp = null; if (mImageCaptureUri != null) { photoBmp = MediaStore.Images.Media.getBitmap(ac.getContentResolve

  • 浅析Android 快速实现图片压缩与上传功能

    由于最近项目更新功能比较的忙,也没时间去整理自己的知识点和管理自己的博客.在Android对手机相册中的图片的压缩和上传到服务器上,这样的功能在每个app开发中都会有这样的需求.所以今天就对android端怎么快速实现图片压缩和上传进行简单的分析. 首先需要对图片进行压缩,这方面可以使用第三方的库,我在实际的开发中使用的是 compile 'top.zibin:Luban:1.0.9'使用也比较的方便,代码如下: /** * * @param path 代表的是图片的uri路径 */ priva

  • Android LuBan与Compressor图片压缩方式

    1,LuBan压缩问题    https://github.com/Curzibn/Luban 之前选择压缩图片库,在github上找的这个star最多的,使用方法是传入图片数组,在异步线程中回调返回的结果.接下来就出现问题了,压缩的图片质量模糊,虽然可以设置多少KB一下不压缩,在正常手机屏幕压缩没太大问题.但是在平板,同一张图片,压缩就会模糊. Luban.with(this) .load(photos) // 传人要压缩的图片列表 .ignoreBy(100) // 忽略不压缩图片的大小 .

  • Android图片压缩以及优化实例

    前言 图片压缩在Android技术中已经属于烂大街,上周看了2个开源库然后对自己项目的压缩做了对比,发现一些新东西,记录与此. 为何要压缩 1.体积的原因 如果你的图片是要准备上传的,那动辄几M的大小肯定不行的,况且图片分辨率大于设备分辨率的话毫无意义. 2.内存原因 如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和: bitmap内存大小 = 图

  • Android开发之图片压缩工具类完整实例

    本文实例讲述了Android图片压缩工具类.分享给大家供大家参考,具体如下: 这里共享一个图片压缩工具类: package com.sanweidu.TddPay.util2; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class Im

  • Android图片压缩方法并压缩到指定大小

    一.图片质量压缩 /** * 质量压缩方法 * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

  • android递归压缩上传多张图片到七牛的实例代码

    最近遇到这样一个需求:要做一个仿微信朋友圈的功能,要求上传最多九张图到七牛.七牛有上传图片的接口,但是每次只能上传一张.如果是九张图片一齐上传,使用for循环的话肯定不行的,很容易出错.因为上传七牛的动作是在子线程完成的,for循环是在主线程的,这就相当于同时开启十个子线程来上传图片,而且都是耗时线程,很容易会ANR的. 最好的解决办法应该是先压缩图片,在200k-300k之间,保证图片不失真,然后一张一张上传,通过七牛的回调,来判断上一张图片是否上传完成,上传完成了,再上传下一张图片. 好了,

  • Android整理好的图片压缩工具类

    Android设备的内存有限,对于大图片,必须进行压缩后再进行显示,否则会出现内存溢出:OOM: 处理策略: 1.使用缩略图(Thumbnails): Android系统会给检测到的图片创建缩略图:可以操作Media内容提供者中的Image对图片进行操作: 2.手动压缩: (1)根据图片和屏幕尺寸,等比压缩,完美显示: (2)降低图片质量,压缩图片大小: 以下是自己整理的小工具类(对于按比例缩放后,在此并未再进行质量缩放,此时图片大小有可能超出我们期望的限制:假如我们有严格的大小限制需求,可先进

  • android 将图片压缩到指定的大小的示例

    从网上收集后自己写的一个方法: 1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 /** * 根据分辨率压缩图片比例 * * @param imgPath * @param w * @param h * @return */ private static Bitmap compressByResolution(String imgPath, int w, int h) { BitmapFactory.Options opts = new BitmapFactory.Options();

  • Android实现图片压缩(bitmap的六种压缩方式)

    Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式: 其中,A代表透明度:R代表红色:G代表绿色:B代表蓝色. ALPHA_8 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度 ARGB_4444 表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个

随机推荐