浅谈性能优化-图片优化

现在一线企业做开发,什么腾讯、网易、京东肯定都是要对于图片进行压缩的。比如我们平常用的QQ、微信,用了一个月之后,我们会发现内存空间会少个一两个G,我们要是不做压缩,空间的占用率就会越来越高。还是写一个小demo吧,主要是理解这种思想。

安卓的默认Bitmap图片格式是ARGB_8888,我们以后自己要选择RGB_565,腾讯所有的项目,全部是用的RGB_565.这样比较节省内存一些。RGB_4444已经不怎么用了,它处理的颜色比较少。

image.png

我现在有一张图片放在mipmap里面的,从代码log里面可以看出来图片大小是284X349,内存大小是396464.我写代码一般icon或者图标都喜欢放mipmap,如果这张图片放在drawble文件夹里面,安卓会自动做处理,这张图片可能有6M左右(我自己试过),那我多加载几张,岂不是就玩完了,当然了,不是说drawble里面不能放图片,根据业务需求来,闪屏什么的可以放drawble在里面,小图标放mipmap。刚刚只是做了个放不同文件夹的一个实验去看图片所占内存大小.

284*349像素点数量(默认格式是8888),每一个像素目前占四个字节的内存空间X4就为396464就能对应上了

比如微信上面,我们要加载很多用户的头像,这个头像是80X80,那我们可不可以把这张图片,很多地方不需要的像素点去压缩呢?然后再让我们的屏幕来自己进行缩放。我们稍后单独写一个类来处理调整它的尺寸。ImageResize

回过头来我们通过点击BitmapFactory.decodeResource进去看到源码(记得载入源码哦),可以看到它在解码的时候bm=decodeResourceStrem(res,value,is,null,opts),通过opts=new Options()它里面两个成员的值来进行缩放控制的,所以我们也可以自己去操纵它这个编码。
decodeResource代表解码控制参数
opts.inDensity表示像素密度,根据我们的drawble目录进行计算
opts.inTargetDensity 画到屏幕上的像素密度

工具类:
public class ImageResize {
    public static Bitmap resizeBitmap(Context context, int id, int maxW, int maxH, boolean hasAlpha) {
        Resources resources = context.getResources();
        BitmapFactory.Options options = new BitmapFactory.Options();
        //需要拿得到系统处理的信息  比如解码出宽高,....
        options.inJustDecodeBounds = true;
        //我们把原来的解码参数改了再去生成bitmap
        //加了options.inJustDecodeBounds = true;
        //我们只能得到这张图片的解码信息,这里并不能直接生成bitmap的
        BitmapFactory.decodeResource(resources, id, options);
        //取到宽高
        int w = options.outWidth;
        int h = options.outHeight;
        //设置缩放系数
        //maxW,maxH是自己定义的尺寸,w,h是解码出来的宽高(我不一定要按照解码的宽高来,因此要缩放)他们的比例最接近2的多少倍
        options.inSampleSize = calcuteInSampleSize(w, h, maxW, maxH);

       //如果不需要Alpha通道,那么可以改成RGB_565进行压缩啊,上面之前说了,这里只占两个字节,比8888或者4444要好
        if(!hasAlpha){
            options.inPreferredConfig=Bitmap.Config.RGB_565;
        }
        options.inJustDecodeBounds=false;
        return BitmapFactory.decodeResource(resources,id,options);


    }

    //返回结果是原来解码的图片的大小  是我们需要的大小的   最接近2的几次方倍
    private static int calcuteInSampleSize(int w, int h, int maxW, int maxH) {
        int inSampleSize = 1;
        if (w > maxW && h > maxH) {
            inSampleSize = 2;
            while (w / inSampleSize > maxW && h / inSampleSize > maxH){
                inSampleSize*=2;
            }
        }
        inSampleSize/=2;
        return inSampleSize;
    }
}

calcuteInSampleSize这个方法的意义就计算最接近自己定义图片大小的2的几次方倍。打个比方,你自己定义的是8080,安卓加载的图片解析器解析出来的是10001000,那么要最接近8080就是要缩小2的3次方也就是8倍。最后成了125125的像素。我们就缩小了8倍。

处理前后对比以下log:
image.png

之前图片是284X349,内存大小是396464.大约0.3M
压缩之后是71X87, 内存大小:12354大约0.01M
所以压缩效果还是比较明显的。
在不同分辨率手机上面,图片宽高有可能不一样。

图片压缩还包含其他很多种方式,比如LIBJEPG,是用的NDK方式,里面也会涉及到哈夫曼编码格式和算法
这个再之后的NDK架构的学习中会讲到的。今天仅仅是在java层把图片压缩这个流程先理解,大概思路就是这样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容

  • 儿子还没出生时,就有人劝我:“孩子教育得提早,光听莫扎特是不够的,你得开展0岁教育,绝不能让孩子输在...
    一笑嫣然lr阅读 420评论 1 2
  • NMAP提供了ACK,RST,FIN或者SYN-ACK扫描。创建一个PortScanner()类对象,用这个对象完...
    KevinCool阅读 493评论 0 1
  • 麟涌青波荡 霞翻碧色迎 舟熹雪乱飞 风影水梵光 当忆郑子情 乃叹吾辈思 此悠悠 彼呦呦 且罢了 年与还来及时
    小灰灰虫虫阅读 223评论 0 0
  • 早起,没有阳光。看来昨夜下了一场适中的雨。今年开春以来,几乎没有下过一场像样的雨。每天在楼下的花园里遛狗,看着那些...
    一思瑶一阅读 317评论 0 4