Bitmap有效的压缩方式

在Android开发中我们都会遇到在一个100*100的ImageView上显示一张过大的图片,如果直接把这张图片显示上去对我们应用没有一点好处反而存在OOM的危险,所以我们有必要采用一种有效压缩方式来显示上去。

private void calculateBitmapInSimpleSize() {
        Bitmap _bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage);
        getBitmapDatas(_bitmap);

        BitmapFactory.Options optioins = new BitmapFactory.Options();
        optioins.inJustDecodeBounds = true;
//        optioins.inPreferredConfig = Bitmap.Config.RGB_565;//11158560
        optioins.inPreferredConfig = Bitmap.Config.ARGB_8888;//22317120
        BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins);
        int reqWidth = optioins.outWidth;
        int reqHeight = optioins.outHeight;

        Log.w(TAG, "reqWidth = " + reqWidth);
        Log.w(TAG, "reqHeight = " + reqHeight);

        int inSampleSize = 1;
        final int widthRatio = Math.round((float)reqWidth / 100f);
        final int heigthRatio = Math.round((float) reqHeight / 100f);
        // 取最小值 这将保证压缩出来的图片大于或者等于请求的宽度或者高度
        inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;
        Log.w(TAG, "first inSampleSize = " + inSampleSize);

        final int totalPixel = 100 * 100;
        final int totalReqPixel = reqWidth * reqHeight * 2;

        Log.w(TAG, "totalReqPixel = " + totalReqPixel);

        while (totalPixel / (inSampleSize * inSampleSize) > totalReqPixel) {
            Log.w(TAG, "totalPixel = " + (totalPixel / (inSampleSize * inSampleSize)));
            inSampleSize ++;
        }

        Log.w(TAG, "LastInSampleSize = " + inSampleSize);

        optioins.inJustDecodeBounds = false;

        Bitmap lastBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins);
        getBitmapDatas(lastBitmap);

        mImageView.setImageBitmap(lastBitmap);

    }

通过打印log我们可以清楚发现一张原始的图片占有22317120字节,经过压缩后11158560(RGB_565)/ 22317120(RGB8888)明显所占用的内存都减少了,尽量降低这种情况带来的OOM。

做法:

1.optioins.inJustDecodeBounds = true设置为true可用于读取该bitmap的宽高且不会占用内存。

2.optioins.inPreferredConfig = Bitmap.Config.RGB_565设置在内存中以占用最少的方式,相比RGB_8888只有其一半的内存占有。

3.final int widthRatio = Math.round((float)reqWidth / 100f);

final int heigthRatio = Math.round((float) reqHeight / 100f);

inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;

计算压缩比例,取最小值 这将保证压缩出来的图片大于或者等于请求的宽度或者高度。

4.在要显示到ImageView的时候optioins.inJustDecodeBounds = false设回false这样就能正常显示了

// 计算bitmap所占内存值
 public void getBitmapDatas(Bitmap bitmap) {
         Log.w(TAG, "Bitmap size = " + bitmap.getByteCount());
    }

采用以上的压缩方式 我们就能避免一张过大的图片”浪费”的显示在ImageView上造成内存消耗过大。

时间: 2024-10-13 23:01:02

Bitmap有效的压缩方式的相关文章

转:Bitmap的六种压缩方式

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

bitmap的六种压缩方式,图片压缩

转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/51955467 android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式: 其中,A代表透明度:R代表红色:G代表绿色:B代表蓝色. ALPHA_8 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它

浅谈android中加载高清大图及图片压缩方式(二)

这一讲就是本系列的第二篇,一起来聊下关于android中加载高清大图的问题,我们都知道如果我们直接加载原图的话,一个是非常慢,需要等待一定时间,如果没有在一定的时间内给用户响应的话,将会极大影响用户的体验.另一个是如果你的手机内存小的话,可能会直接崩溃.这也就是直接加载高清原图问题.遇到这些问题很容易想到的一点就是图片压缩,本篇文章也就是讲述图片压缩方式来实现加载高清大图的效果.但是现在问题就来了,通过上篇博客我们知道,手机的分辨率有很多,如何保证我同一张图片在不同分辨率的手机上能适当的压缩比例

使用Snappy 压缩方式报错“java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path”

情况描述 其实这个问题已经困扰我很久了,最近在公司Linux上搭建hadoop 和 spark环境的时候,我就遇到 spark提交作业到yarn 集群就报错这个错,当时已经安装snappy环境了,任何关于snappy静态库都编译了,这是我提交到spark mail list上的http://apache-spark-user-list.1001560.n3.nabble.com/java-lang-UnsatisfiedLinkError-no-snappyjava-in-java-librar

Winform下压缩方式的选取

1. 压缩类型的选择 依据压缩方式的不同,压缩分为有损压缩和无损压缩.其中MP3一类的文件在一定程度的有损压缩下,人的感知不是十分明显而且还是MP3文件的体积相对减小.无损压缩就是类似于Zip,Rar一类的压缩方式,通过字典保存重复值并以一定的坐标映射方式制定对应的值,例如 重复字符串占20位,而映射的字符串仅仅占2位,这样就达到了压缩的目的,压缩率就是要看重复值出现的概率.这仅仅是压缩的一种方式,还有许多专门针对特定文件的压缩算法. 2. 7z压缩 7-Zip 是一款 开源 软件.大多数源代码

Inno Setup入门(三)——指定压缩方式

Setup段中的compression指定了采用的压缩方式,较高的压缩率需要较多的时间或者需要更大的内存空间,可用的值如下: zip zip/1到zip/9 bzip bzip/1 到bzip/9 lzma lzma/fast lzma/normal lzma/max lzma/ultra lzma/ultra64 lzma2 lzma2/fast lzma2/normal lzma2/max lzma2/ultra lzma2/ultra64 none 其中lzma2/max是编译器使用的默认

Impala实践之十二:impala压缩方式测试

前言 测一下parquet.snappy.gzip.textfile这些方式在hdfs中占用的存储大小. 在impala中直接建内部表. 测试 存储格式 压缩格式 文件大小 建表时间 textfile none 3.0 G 38.74s parquet none 1.5 G 32.33s parquet snappy 709.3 M 31.71s parquet gzip 471.5 M 48.23s snappy snappy的官方描述. Snappy is a compression/dec

从WAVE头文件里获取压缩方式

在解析WAV文件时.会从头文件里读取TAG值,表示当前文件的压缩格式,如该值为1,表示没有压缩,其他表示不同的压缩方式. 如当中为6时,表示压缩方式是alaw 列表例如以下: TAG值 音频描写叙述 0 0x0000 Unknown 1 0x0001 Microsoft PCM 2 0x0002 Microsoft ADPCM 3 0x0003 IEEE Float 4 0x0004 Compaq VSELP 5 0x0005 IBM CVSD 6 0x0006 Microsoft ALAW 7

(转)Inno Setup入门(三)——指定压缩方式

本文转载自:http://blog.csdn.net/augusdi/article/details/8564796 Setup段中的compression指定了采用的压缩方式,较高的压缩率需要较多的时间或者需要更大的内存空间,可用的值如下: zip zip/1到zip/9 bzip bzip/1 到bzip/9 lzma lzma/fast lzma/normal lzma/max lzma/ultra lzma/ultra64 lzma2 lzma2/fast lzma2/normal lz