序言

在开发中,我们常常会遇到构造图片,加载显示图片的情况。我们可以使用BitMapFactory的decode xxx 方法来构造BitMap对象。但现在普遍照片的质量,像素都很高,如果直接把照片拿来使用,加载到内存,就会很容易造成内存泄漏。也有浪费的嫌疑,比如我程序中只需要,200*200的图像,却是用2048x1536的图加载进去,这就不很浪费,很没有必要么,下面就将说明,如何对BitMap进行压缩处理,得到想要的尺寸的图片。

未处理的图片大小

我们想来看一下没有经过压缩处理的图片的大小。

Bitmap bitmap = BitmapFactory.decodeFile(imagePath);//默认的图片格式是Bitmap.Config.ARGB_8888Log.e(TAG, "onActivityResult: 图片的宽:" + bitmap.getWidth() + "--图片的高:"+ bitmap.getHeight() + "--图片大小:" + bitmap.getWidth() * bitmap.getHeight() * 4 / 1024 / 1024 + "M");

这里默认是图片格式是ARGB_8888所以一个像素是占32位,8位等于1个字节,所以一个像素占4个字节内存。此时输出的log信息是:

E/MainActivity: onActivityResult: 图片的宽:1680--图片的高:1050--图片大小:6M

压缩处理成指定大小的图片

代码如下:

BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(imagePath, options);Log.e(TAG, "onActivityResult: 压缩之前图片的宽:" + options.outWidth + "--压缩之前图片的高:"+ options.outHeight + "--压缩之前图片大小:" + options.outWidth * options.outHeight * 4 / 1024 / 1024 + "M");options.inSampleSize = calculateInSampleSize(options, 200, 200);Log.e(TAG, "onActivityResult: inSampleSize:"+ options.inSampleSize);options.inJustDecodeBounds = false;Bitmap afterCompressBm = BitmapFactory.decodeFile(imagePath, options);//默认的图片格式是Bitmap.Config.ARGB_8888Log.e(TAG, "onActivityResult: 图片的宽:" + afterCompressBm.getWidth() + "--图片的高:"+ afterCompressBm.getHeight() + "--图片大小:" + afterCompressBm.getWidth() * afterCompressBm.getHeight() * 4 / 1024 / 1024 + "M");
private 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 = width / 2;while ((halfHeight / inSampleSize) >= reqHeight&& (halfWidth / inSampleSize) >= reqWidth) {inSampleSize *= 2;}}return inSampleSize;}

log输出结果如下:

E/MainActivity: onActivityResult: 压缩之前图片的宽:1680--压缩之前图片的高:1050--压缩之前图片大小:6M
E/MainActivity: onActivityResult: inSampleSize:4
E/MainActivity: onActivityResult: 图片的宽:420--图片的高:263--图片大小:0M

我们看到图片的大小就变得很小了,这样就不会占很大的内存导致内存泄漏问题。这里我们可以着重看一下calculateInSampleSize这个方法的逻辑。内部代码逻辑不难,就是通过我们传入的想要的图片宽高值来计算inSampleSize的大小。这里我们通过log发现输出的inSampleSize值为4。此刻就表示,图片的宽变为原来的四分之一,高变为原来的四分之一。整张照片的像素就变为原来的16分之一。这样就达到了压缩的效果。

显示效果对比

压缩前,原图:

压缩后,图片:

补充

这里默认的图片格式是Bitmap.Config.ARGB_8888,我们也可以改变图片格式来对图片进行减小。这里补充下各种格式对应的字节大小:
- ARGB_8888 ->一个像素点占32位->4个字节
- RGB_565 ->一个像素点占16位->2个字节
- ARGB_4444 ->占16位->2个字节
- RGBA_F16 ->64位->8个字节
- ALPHA_8 ->不存储颜色信息,只存储透明度->一个像素占1个字节

压缩指定大小的BitMap相关推荐

  1. PDF怎么压缩指定大小

    PDF是我们办公室常见的文件格式,因为其本身私密性比较高,而且可以保护文件,故编辑难度大.由于PDF文件比较好的私密性和兼容能力好,很多格式的文件都可以转为PDF,慢慢的PDF文件多了,内容也大了,我 ...

  2. JAVA图片压缩指定大小范围

    图片压缩指定大小范围 图片压缩之后存在上下误差,不影响使用 @RequestMapping(value="/compress",method=RequestMethod.POST) ...

  3. 图片压缩指定大小,让您的图片高效而优美

    在现代社会中,图片是我们不可或缺的一部分,在各行业中都有着非常重要的作用.但是,大尺寸的图片不仅会占用过多的存储空间,还会导致网页或应用程序的加载速度变慢.因此,将图片压缩到指定大小是一个必要的步骤. ...

  4. 如何快速图片压缩指定大小?图片压缩到200k以内的方法

    图片压缩到200k以内的介绍 在现代社交媒体和网页设计中,高质量的图片是必不可少的.但是,大型图像文件可能会导致页面加载时间过长,从而影响用户体验.这时就需要使用图片压缩技术来将图片文件大小减小到合理 ...

  5. 图片压缩到200k以内怎么操作?图片压缩指定大小工具推荐

    工作中经常出现图片太大无法发送或者是上传的情况,这时候就需要将图片压缩才能上传,那么怎么把图片压缩到200K以内呢?可以使用图片压缩指定大小(https://www.yasuotu.com/image ...

  6. 怎么把图片压缩100k?如果将图片压缩指定大小?

    很多时候想要把图片压缩大小到固定数值,这时候用压缩图的图片压缩到指定大小(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图)就非常方便,下面以图片压缩到100k以内为例子来讲解一下具体步骤. 1 ...

  7. 怎么把图片压缩指定大小?三步轻松解决

    网上有很多把图片压缩指定大小的方法,大家都觉得很难.学不会,要不就是需要下载安装各种软件,很麻烦,今天小编就给大家分享一个png图片压缩大小(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图)的 ...

  8. 图片大小如何调整到10k?图片压缩到指定大小怎么弄?

    在现代社交网络和在线平台上,上传的图片大小都会有限制,过大的图像会导致性能问题.加载时间延长和带宽消耗,所以图片压缩指定大小(https://www.yasuotu.com/imagesize)就成了 ...

  9. 如何压缩图片到500KB?怎么压缩图片到指定大小?

    如何压缩图片到500KB?这就需要用到压缩啦的图片压缩指定大小工具,只需三步就可以轻松压缩图片大小kb,具体操作步骤如下: 1.使用浏览器打开压缩啦,选择图片压缩指定大小功能. 2.上传需要压缩的图片 ...

最新文章

  1. python tts 保存_Python 文件和目录操作学习
  2. linux控制流程,Linux - Bash - 流程控制
  3. ae画面颜色一键选取替换修改插件Composite Brush for Mac 1.5.2
  4. 小汤学编程之MySQL(一)——基本概念、使用前的准备和了解SQL
  5. 小熊派折叠开发板Docker编译烧录安装HAP
  6. Linux系统编程 -- 信号及signal函数
  7. UVALive - 7147 (数学)
  8. Struts2+Spring4+Hibernate4项目整合
  9. springboot vue导出excel 使用easypoi
  10. linux查看设备网卡型号,linux查看网卡型号
  11. Unity 设置固定移动路线
  12. 经纬财富:沧州散户炒白银必读
  13. 网易互娱2022校园招聘在线笔试题 — 游戏测试开发工程师2021.8.28(回忆版)
  14. mysql roundup_五星评分系统,Excel也能做
  15. ksoftirqd内核线程
  16. win10进不了系统怎么强制进安全模式
  17. Firebird数据库及工具
  18. 无效的JSON Web令牌
  19. Robomongo简介
  20. 双馈风力发电机的matlab仿真模型,基于MATLAB_SIMULINK的并网型双馈风力发电机仿真模型的研究[1]...

热门文章

  1. vue使用vue-dplayer播放m3u8视频
  2. Discover the Web(找浏览器网页)
  3. HTML中的转义字符
  4. java项目中表格导入找到最近父类生成树形结构
  5. 【你好Resilience4j】一:Resilience4j之初体验
  6. 四 . LeetCode标签刷题——树/二叉树(一) 算法部分
  7. 当程序员5年,他从来不加班,工资居然还每年都在涨...
  8. Matplotlib多子图绘图后保存单个子图
  9. 苹果xr黑屏转圈圈解决方法_苹果xr黑屏转圈打不开也关不掉怎么办
  10. 初三计算机word 操作题,信息技术中考word操作题.doc