文章目录

  • 一、图片的剪裁
    • 1.属性介绍
  • 二、图片压缩
    • 1.图片质量分类
    • 2.图片默认质量
    • 3.占用内存
    • 4.图片的尺寸压缩或者拉伸
  • 三、Bitmap压缩
    • 1.质量压缩
    • 2.采样率压缩
    • 3.缩放法压缩

一、图片的剪裁

ImageView默认的ScaleType
讲到图片的剪裁,我们首先要介绍一下ImageView默认的ScaleType设置效果

ImageView的ScaleType一共有8种属性:

matrix
center
centerInside
centerCrop
fitCenter(默认)
fitStart
fitEnd
fitXY

有些文章说默认是matrix,是不正确的,其实默认是FIT_CENTER
可以通过ImageView的源码看到默认设置

private void initImageView() {mMatrix = new Matrix();mScaleType = ScaleType.FIT_CENTER;if (!sCompatDone) {final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;sCompatAdjustViewBounds = targetSdkVersion <= Build.VERSION_CODES.JELLY_BEAN_MR1;sCompatUseCorrectStreamDensity = targetSdkVersion > Build.VERSION_CODES.M;sCompatDrawableVisibilityDispatch = targetSdkVersion < Build.VERSION_CODES.N;sCompatDone = true;}
}

1.属性介绍

(1)matrix
不缩放 ,图片与控件 左上角 对齐,当图片大小超过控件时将被 裁剪
(2)center
不缩放 ,图片与控件 中心点 对齐,当图片大小超过控件时将被 裁剪
(3)centerInside
以完整显示图片为目标, 不剪裁 ,当显示不下的时候将缩放,能够显示的情况下不缩放
(4)centerCrop
以填满整个控件为目标,等比缩放,超过控件时将被 裁剪 ( 宽高都要填满 ,所以只要图片宽高比与控件宽高比不同时,一定会被剪裁)
(5)fitCenter(默认)
自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,居中显示
(6)fitStart
自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠左(上)显示
(7)fitEnd
自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠右(下)显示
(8)fitXY
以填满整个控件为目标, 不按比例 拉伸或缩放(可能会变形), 不剪裁


二、图片压缩

这里会讲一下图片显示相关的基础知识,如果不关心的可以直接跳到第二点,不过建议是最好看一下

1.图片质量分类

安卓图片显示的质量配置主要分为四种:

ARGB_8888 :32位图,带透明度,每个像素占4个字节
ARGB_4444 :16位图,带透明度,每个像素占2个字节
RGB_565 :16位图,不带透明度,每个像素占2个字节
ALPHA_8 :32位图,只有透明度,不带颜色,每个像素占4个字节
(A代表透明度,RGB代表红绿蓝:即颜色)

2.图片默认质量

Picasso的默认质量是 ARGB_8888
Glide的默认质量则为 RGB_565

3.占用内存

加载一张4000 * 2000(一般手机拍摄的都超过这个像素)的图片

Picasso需要占用的内存为: 32MB

4000 * 2000 * 4 / 1024 / 1024 = 30 (MB)

Glide需要占用的内存为: 16MB

4000 * 2000 * 2 / 1024 / 1024 = 15 (MB)

也就是说只要同时加载几张图片,你的应用就会OOM(内存溢出了),最恐怖的是就算你的ImageView的宽高只有10px,同样会占用那么多内存,这就是为什么需要做图片压缩的原因了

4.图片的尺寸压缩或者拉伸

通过调用override,就可以把图片压缩到相应的尺寸来显示了,类似这些被处理过的图片,就是之前文章中提到的RESULT(处理图)

Glide.with(this).load(mUrl).override(300,300).into(mIv)

三、Bitmap压缩

1.质量压缩

用到的方法是Bitmap 的compress()方法

在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的:

1、bitmap图片的大小不会改变

2、bytes.length是随着quality变小而变小的

2.采样率压缩

int inSampleSize = getScaling(bitmap);
bitmap = samplingRateCompression(path,inSampleSize);

设置inSampleSize的值(int类型)后,假如设为n,则宽和高都为原来的1/n,宽高都减少,内存降低

3.缩放法压缩

Android中使用Matrix对图像进行缩放、旋转、平移、斜切等变换的

例如:

private Bitmap ScalingCompression(Bitmap bitmap) {Matrix matrix = new Matrix();matrix.setScale(0.25f, 0.25f);//缩放效果类似于方法2Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);Log.i("wechat", "压缩后图片的大小" + (bm.getByteCount() / 1024 / 1024)+ "M宽度为" + bm.getWidth() + "高度为" + bm.getHeight());return bm;
}

Android中图片的裁剪与压缩相关推荐

  1. android 不压缩保存图片格式,Android中图片的压缩方法

    Bitmap Android中图片是以Bitmap(位图)形式存在,位图常见的文件格式有:.bmp .jpg .png .gif . Bitmap的大小计算 = 图片的长度图片的宽度单位像素所占用的字 ...

  2. Android 中自定义View 裁剪扇形图片

    Android 中自定义View 裁剪扇形图片 当需要裁剪图片为扇形区域时,使用Canvas.clipPath(path)方法可以裁剪为扇形区域 ps:此方法会导致绘制图片边缘有锯齿,暂无解决方法(知 ...

  3. Android 系统(173)---Android中图片的三级缓存

    Android中图片的三级缓存 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量 ...

  4. android图片分割点击,Android中图片切割成多个图片的实现方法

    系统手机总是有很多不是很完美的时候,比如逐帧播放图片的时候产生的效果,今天爱站技术频道小编为大家整理了Android中图片切割成多个图片的实现方法,大家一起来了解一下吧! 以下是封装好的两个类,可以实 ...

  5. android怎么用代码调图像,浅谈android中图片处理之图形变换特效Matrix(四)(示例代码)...

    今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的.改变它的颜色主要通过ColorMatrix类来实现. 现在今天所讲的图片变形的特效主要 ...

  6. 浅谈android中图片处理之图形变换特效Matrix(四)

    今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的.改变它的颜色主要通过ColorMatrix类来实现. 现在今天所讲的图片变形的特效主要 ...

  7. android中图片适配器,Android UI适配总结之图片适配(1)

    由于Android的屏幕尺寸的碎片化,时至今日Android的UI适配依然是开发中必不可少的步骤. UI适配的适配,是通过dp.权重,通配符等方式使View能按我们意愿的准确的显示在不同手机上.除了对 ...

  8. Android中图片的左右滑动(带小点点)

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布 ...

  9. Android中图片压缩分析(上)

    此文章首发:https://mp.weixin.qq.com/s/QZ-XTsO7WnNvpnbr3DWQmg 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种: ...

最新文章

  1. R语言case_when函数和cases函数实战
  2. 理解“==”和“equals()”
  3. 基于hsv的亮度调整算法_基于手绘工程图离线识别的预处理研究精品论文推荐
  4. Skype for Business Server 2015-09-测试-基本功能(建议:看PDF!)
  5. 【uniapp】3d轮播图/堆叠轮播图/层叠轮播图
  6. creatdep oracle_Oracle数据库自带表
  7. dism++封装系统使用教程_客栈管理系统“订单来了”客房订单盒子使用教程
  8. java响应很慢排插_服务响应时间慢:Java SecureRandom和/ dev / random - java
  9. pyppeteer:比 selenium 更高效的爬虫利器
  10. webpack的五个核心概念---webpack工作笔记002
  11. logisim输出变成红色的e_新款E刚出就被骂最丑,却销量可观,梅赛德斯:都是小事儿,上AMG...
  12. java中数组操作常见的三个错误
  13. sakai mysql_开源网络教学平台SAKAI开发环境的搭建 | 学步园
  14. 随笔--你该如何利用自己的“暗时间”?
  15. ckplayer网页播放器简易教程
  16. Excel随机 除法 打印版下载
  17. PS抠图之单色背景图片
  18. 万物Linux皆可刷安卓,万物皆可Win,开发者成功在安卓手机刷入Win10系统
  19. python手机编程软件-手机上Python编程的软件分享
  20. 计算某年某月某日是该年中的第几天

热门文章

  1. Spring-初识Spring框架-IOC控制反转(DI依赖注入)
  2. RabbitMQ(三)发布确认 Publisher Confirms
  3. Spring事务报错Transaction synchronization is not active
  4. php中怎么设计出生日期,php – 将出生日期添加到数据库
  5. Guava-Utilites学习测试类
  6. vant Webapp 快速使用
  7. 2022-iOS个人开发者账号申请流程
  8. unity 模拟抛物线 1
  9. 计算机编程常用的英语,100916计算机编程常用的英语
  10. struct和typedef struct彻底明白了,引用自https://www.cnblogs.com/qyaizs/articles/2039101.html