美文网首页
android中如何压缩图片

android中如何压缩图片

作者: 金馆长说 | 来源:发表于2016-07-05 10:59 被阅读0次

为什么需要压缩?

android中的图片是以Bitmap形式存在的,bitmap的大小和数量会直接影响到手机内存情况。不同大小的手机显示的图片也会不一样,跟分辨率、手机内存、显示的大小都有关系,所以很多时候我们需要对位图进行一些压缩的操作。

质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片的长,宽,像素都不会改变,那么bitmap所占内存大小是不会变的。

计算bitmap大小
宽 * 高 * 一个像素点占用字节

四种压缩格式

[图片上传失败...(image-e55c37-1535879147605)]

ARGB代表的意思是

A(透明度)
R(red红色)
G(green绿色)
B(blue蓝色)

  • ALPHA_8
    8位Alpha位图一个像素占用一个字节,只有透明度。A=8
  • ARGB_4444
    16位的ARGB位图,ARGB各占用4位总共16位,2个字节。
  • ARGB_8888
    16位的ARGB位图,ARGB各占用8位总共36位,4个字节。
  • RGB_565
    16位RGB位图没有透明度,2个字节。

1. 质量压缩方式

质量压缩是在不改变图片大小的前提下,改变图片的位深以透明度,来达到压缩的目的。所以通过这种方式压缩的话,实际上我们内存加载进来的bitmap大小也是不会改变的。

但是这种方式会改变图片的文件大小,代码中可以看到通过了byteArray来判断大小,所以适合去传递二进制的图片数据,比如微信分享图片,要传入二进制数据过去,限制32kb之内。

 public static Bitmap compressByQuality(Bitmap src, long maxByteSize, boolean recycle) {
        if (isEmptyBitmap(src) || maxByteSize <= 0) {
            return null;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int quality = 100;
        src.compress(CompressFormat.JPEG, quality, baos);
        while (baos.toByteArray().length > maxByteSize && quality > 0) {
            baos.reset();
            src.compress(CompressFormat.JPEG, quality -= 5, baos);
        }
        if (quality < 0) {
            return null;
        }
        byte[] bytes = baos.toByteArray();
        if (recycle && !src.isRecycled()) {
            src.recycle();
        }
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

2. 采样率压缩
采样率压缩主要是通过BitmapFactory.Options类的inJustDecodeBunds标识为true,然后返回的bitmap就是一个Null对象,这样可以节约内存空间的开销。

但是这个bitmap的options是包含bitmap的宽高、MimeType参数。我们可以根据这些图片参数去设置options的 inSampleSize参数,通过这个参数我们可以实现图片大小的压缩。

主要压缩步骤

  1. BitmapFactory.Options的 inJustDecodeBunds为true并加载图片

  2. 从BitmapFactory.Options 中取出图片的原始宽高信息,对应outWidth和outHeight

  3. 根据采样率的规格并结合目标计算出View的所需大小计算出inSampleSize

  4. BitmapFactory.Options 的 inJustDecodeBunds 参数设置为false,然后重新加载图片

private Bitmap decodeSampleBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
   final BitmapFactory.Options options = new BitmapFactory.Options();
   options.inJustDecodeBounds = true;
   BitmapFactory.decodeResource(res, resId, options);
   options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
   options.inJustDecodeBounds = false;
   Bitmap bm = BitmapFactory.decodeFile(imagePath, options); 
   return bm;
}

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
   final int height = options.outHeight;
   final int width = options.outWidth;
   int inSampleSize = 1;
   if (height > reqHeight || width > reqWidth) {   
         final int halfHeight = height / 2;    
         final int halfWidth = height / 2;    
         while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {      
              inSampleSize *= 2;    
         }
   }
   return inSampleSize;
}

** 3. 缩放法压缩(martix)**

/**
     * 缩放图片
     *
     * @param src 源图片
     * @param scaleWidth 缩放宽度倍数
     * @param scaleHeight 缩放高度倍数
     * @param recycle 是否回收
     * @return 缩放后的图片
     */
    public static Bitmap scale(Bitmap src, float scaleWidth, float scaleHeight, boolean recycle) {
        if (isEmptyBitmap(src)) {
            return null;
        }
        Matrix matrix = new Matrix();
        matrix.setScale(scaleWidth, scaleHeight);
        Bitmap ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src
                .getHeight(), matrix, true);
        if (recycle && !src.isRecycled()) {
            src.recycle();
        }
        return ret;
    }

4. RGB_565压缩法

/**
     * rgb 565压缩
     * @param bm
     * @param path
     * @return
     */
    private Bitmap rgb565(Bitmap bm, String path) {
        BitmapFactory.Options options2 = new BitmapFactory.Options();
        options2.inPreferredConfig = Bitmap.Config.RGB_565;
        bm = BitmapFactory.decodeFile(path, options2);
        return bm;
    }

5 . createScaledBitmap方式压缩

 /**
     * 缩放图片
     *
     * @param src       源图片
     * @param newWidth  新宽度
     * @param newHeight 新高度
     * @param recycle   是否回收
     * @return 缩放后的图片
     */
    public static Bitmap scale(Bitmap src, int newWidth, int newHeight, boolean recycle) {
        if (isEmptyBitmap(src)) {
            return null;
        }
        Bitmap ret = Bitmap.createScaledBitmap(src, newWidth, newHeight, true);
        if (recycle && !src.isRecycled()) {
            src.recycle();
        }
        return ret;
    }

相关文章

  • Android:图片压缩的几种方式

    1、前言 在Android中,图片的压缩对于内存的优化很重要 通过这篇文章对Android中的几种图片压缩方式进行...

  • android中如何压缩图片

    为什么需要压缩? android中的图片是以Bitmap形式存在的,bitmap的大小和数量会直接影响到手机内存情...

  • Android NDK编译libjpeg-turbo压缩图片

    Android开发中,我们经常要面对图片压缩,大部分人使用Android Bitmap进行压缩,还有一些使用lib...

  • Bitmap图片压缩

    Android中图片是以bitmap形式存在的,这篇文章主要介绍了Android实现图片压缩(bitmap的六种压...

  • 图片压缩之优化篇

    之前曾经对Android中图片中的压缩方式进行分析和总结。详见图片压缩篇。基本涵盖了基础的压缩方法和思路。但是在实...

  • 图片压缩

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法、比例压缩法(根据路径获取图片并压缩)和比例压缩...

  • Android Apk 优化:PNG图片压缩对比分析

    第118期:Android Apk 优化:PNG图片压缩对比分析 [英] 深入理解 Android和Java中的引...

  • 说说在 Android 中如何压缩图片

    目前存在两种压缩图片方式: 质量压缩 - 不改变图片尺寸。 按比例压缩 - 相当于是在像素上进行压缩。 而图片有三...

  • 图片压缩

    Android图片压缩常用的有质量压缩、尺寸压缩、采样率压缩以及通过JNI调用libjpeg库来进行压缩(尺寸压缩...

  • 【Android开发基础系列】图片专题

    1 图片编辑处理 1.1 图片裁切 转载自:bitmap的六种压缩方式,Android图片压缩 http://bl...

网友评论

      本文标题:android中如何压缩图片

      本文链接:https://www.haomeiwen.com/subject/moshjttx.html