大图片处理

图片的存在形式

1.文件形式(即以二进制形式存在于硬盘上)
2.流的形式(即以二进制形式存在于内存中)
3.Bitmap形式

这三种形式的区别:文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 我试过500K文件形式的图片加载到内存,以Bitmap形式存在时,占用内存将近5M,当然这个增大的倍数并不是固定的。

检测图片三种形式大小的方法:
文件形式: file.length()
流的形式: 讲图片文件读到内存输入流中,看它的byte数
Bitmap: bitmap.getByteCount()

图片在不同形式下大小原理

文件形式:图片的文件形式,文件大小与图片格式有很大关系,因为不同的格式对图片信息的格式和压缩算法不同,所以改变压缩算法和编码算法就可以减小文件的大小;
Bitmap形式:Bitmap在内存中是以像素单元的形式存在,当图片的长宽固定时,那么它的总像素点数量固定,而每一个像素点占用的空间将决定这个Bitmap占用的内存大小,比如平常的ARGB_8888就是每个像素占用4个字节,RGB_565是每个像素占用2个字节等。

图片的尺寸压缩

尺寸压缩的原理很简单,即减小图片的长宽,即减少了图片的像素量,当然图片的Bitmap形式大小会同比例减少,同时保存为文件形式占用的大小也会减少。
但是这里需要注意,图片的尺寸压缩,不是把大图片加载到内存中,在压缩为小图片,因为这样做对内存占用无意义,加载大图时已经导致占用大内存,正确的做法是使用图片解码时采样的方式,比如java的实现代码如下:

private Bitmap compressImageFromFile(String srcPath) {  
        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        newOpts.inJustDecodeBounds = true;//只读边,不读内容,很快不会加载图片内容
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
        int w = newOpts.outWidth;  // 得到图片真实宽高,可以根据实际宽高计算采样率
        int h = newOpts.outHeight;  

        newOpts.inJustDecodeBounds = false;  
        int sampleValue = 4; // 此处直接固定采样率,宽高采样为原来1/4,只能是2的指数次方,否则会向下取为2的指数次方;
        newOpts.inSampleSize = sampleValue;//设置采样率  
          
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
        return bitmap;  
    }  

图片的质量压缩

图片质量压缩是指对图片保存到文件(或流)中的压缩编码方式进行调整,从而减小文件(或流)的大小,注意它不会减少图片的像素,比方说,,你的图片是300K的,1280700像素的, 经过该方法压缩后, File形式的图片是在100以下, 以方便上传服务器, 但是你BitmapFactory.decodeFile到内存中变成Bitmap时,它的像素仍然是1280700,当每个像素的ARGB值与原来Bitmap一样时,那么新的Bitmap占用内存大小和原来的未压缩Bitmap一样大。
Java的实现片段如下:

private void compressQuality() {
      int maxSize = (int)(500 * 1024);
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
      int options = 100;
      if (baos.toByteArray().length > maxSize) {
          while (baos.toByteArray().length > maxSize) {    // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
               baos.reset();// 重置baos即清空baos
               options -= 10;// 每次都减少10
               bm.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options,把压缩后的数据存放到baos中,注意要JPEG,PNG的格式无效
          }
      }
      bm.compress(Bitmap.CompressFormat.JPEG, options, bos);
}

具体质量压缩原理算法参考:https://www.cnblogs.com/Arvin-JIN/p/9133745.html

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

推荐阅读更多精彩内容