安卓的图片占用内存,图片分辨率,图片适配不同屏幕的研究
首先本文主要解决以下几个问题:
1.什么是DPI,什么是dp,什么是PX,什么是desity,这些干嘛用?
2.一张图片在安卓中到底占多少内存?
3.为什么安卓app的res目录下要用多个文件夹存放图片,有什么作用?
先聊聊屏幕分辨率相关的知识。
像素:由图像的小方格组成的,这些小方格的色彩数值和位置,决定了图像呈现的样子。
1像素就代表1px。
什么是屏幕尺寸? 屏幕对角线的长度
什么是屏幕分辨率 ? 屏幕分辨率=屏幕的宽有多少个像素*屏幕高有多少个像素。指显示器能显示的像素有多少。
屏幕大概分以下几种分辨率:
1920*1080 =2073600像素,俗称1080p屏幕。
2k屏,屏幕横向像素达到2000以上。主流是2560*1440,还有2048×1536(QXGA)、2560×1600(WQXGA)、2560×1440(Quad HD),也是2k屏家族的。
4K屏,名称来源于其横向解析度约为4000像素.屏幕分2种,有4096×2160和3840*2160。
什么是DPI? 每英寸中的像素数。比如设备分辨率是320*240,屏幕的长2英寸,宽1.5英寸,dpi=320/2=240/1.5=160
什么是density?每平方英寸的像素数。
但是在安卓中定义如下:
在DisplayMetrics类中属性density的值为dpi/160
density=dpi/160
什么是dp?dp是安卓的特有单位,
dp=px/density
dp=px/(dpi/160)
如果dpi=160,那么在这个设备上的1dp=1px
这里展开说一下,其实我们蓝湖上看到的1280*720,单位是dp
而实际的设备有多少PX呢。如果是2K屏幕 一般就是2560*1440 ,因为density=px/dp ,也就是屏幕实际宽度/设计图的宽度,或者屏幕实际高度/设计图高度。
所以density=2560/1280=1440/720=2
来算算4K屏 按照4096*2160算 横向 density = 4096/1280=3.2 纵向density=2160/720=3
大致可以看作 density=3
dp:安卓特殊的一种单位,是实际屏幕分辨率宽或者高/density
安卓的几个文件夹定义:
drawable-ldpi:低分辨率(基本没人用了):
density =0.75 , 分辨率是240*320, dp=px/0.75
drawable-mdpi:中分辨率
density=1 , 分辨率是320*480 ,dp=px/1
drawable-hdpi:高分辨率
density=1.5,分辨率是480*800,dp=px/1.5
drawable-xhdpi:较高分辨率
density=2,分辨率=720*1280,dp=px/2
drawable-xxhdpi:超级高分辨率
density=3 ,分辨率=1080*1920 ,dp=px/3
drawable-xxxhdpi:顶级分辨率
density=4,分辨率=2560*4096 ,dp=px/4
一般都是做法是一套xxhdpi的切图,这样可以向上和向下兼容,节省apk的大小
当然,现在项目需求是2K屏和4K屏,也可以在资源中放2套图,这样,低分辨率的屏幕不用因为拿着高分辨率的图渲染而浪费内存。
如果严格按照需求,只要在drawable-xhdpi(对应2k屏)和drawable-xxhdpi(对应4K屏)放入相应的图片就能达到最好的图片清晰度适配。
我们来计算一下一张图片到底占多少内存
这里要补一些基础知识
1G=1024M=1024*1024k=1024*1024*1024字节(Byte) =1024*1024*1024*8位(bit)
bit代表最基本的0或者1
安卓默认颜色是格式是ARGB_888 :
A代表透明度 ,取值范围是0-255 换算成二进制就是 2的8次方 刚好就是1个byte =8bit
R代表红色red,取值范围0-255,也是相当于一个byte
G代表绿色green,取值范围0-255,相当于一个byte
b代表蓝色blue,取值范围0-255.,相当于一个byte
任何颜色只要通过ARGB这4个元素的组合就能表现出来。
那一个像素需要多少内存呢?
答案是4个byte
那一张100px*100px的图片在 2k屏幕中占多少内存呢?
正常情况下不考虑安卓这边做缩放处理
内存消耗=图片长度*图片宽度*4=40000B≈39.06K
这里要考虑到设别本身的dpi,还有文件存放的目录
一张图片实际在安卓设备中消耗的内存=图片长*图片宽*4*(设备横向的dpi/图片存放文件夹对应的dpi)*(设备纵向dpi/图片存放文件夹对应的dpi)
如下举例说明:
比如 当前设备density=2,也就是dpi=2*160=320,这个图片放在xhdpi中(这个文件夹本身对应dpi=320),
内存消耗的计算公式是 100*100*4*(320/320)*(320/320)≈39.06K
那么这张图片的内存消耗是39.06K
如果当前设备density=3,也就是dpi=3*160=480,这个图片仍然放在xhdpi中(这个文件夹本身对应dpi=320)
内存消耗的计算公式是100*100*4*(480/320)*(480/320)=87.89k
安卓图片资源的寻找规则是按照优先找设备dpi相匹配的图片资源文件夹的资源,如果没有找到,就取更高分辨率文件夹的资源,如果还找不到,就取低分辨率的文件夹资源。
各位看客老爷,如果这篇文章对你有把帮助,请点赞!
安卓的图片占用内存,图片分辨率,图片适配不同屏幕的研究相关推荐
- 安卓图片内存优化(一)——图片占用内存大小的计算
安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊手段获取到几百兆内存空间的情况).所以为了节省更多的空间需要对图片进 ...
- Android 中图片占用内存分析
Android 在加载图片的时候一定会考虑到的一个点就是如何防止 OOM,那么一张图片在加载的时候到底会占用多少内存呢?有哪些因素会影响占用的内存呢?知道了这些,我们才能知道可以从哪些点去优化,从而避 ...
- Android | 如何计算图片占用内存的大小
前言 对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下 ...
- android 图片占用内存大小及加载解析
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在讲解图片占用内存前,我们先问自己几个问题: 我们在对手机进行屏幕适时,常想可不可以只切一套图适配所有的手机呢? 一张图片加载到手 ...
- android 图片占用内存的计算
Android高效内存1:一张图片占用多少内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存 ...
- per.ccz与png图片占用内存对比
pvr相比png优势 1.压缩,2gpu能直接识别,不需要额外的内存开销,3.可以自定义色深 pvr与png的内存占用 转载▼ Zwoptex生成的spritesheet除了可以导出png格式的 ...
- 安卓中图片占用内存大小分析
相关概念: 位深 色彩空间 颜色通道 int型占用字节 位深: 位是二进制的位.位深是指计算机系统中图片的一个像素点占用的二进制位数.例如位深32,就是使用2^8 = 32 位二进制来表示像素值.例如 ...
- cocos-js,内存管理2---计算图片占用内存
一.1张图片内存如何计算 一张图片占用的内存由以下两个因素决定: 图片的像素点个数 单位像素占用的字节数 其中图片的像素点个数是图片的宽度与长度的积,所以一张图片占用的内存值为: 图片长度 * 图片宽 ...
- android图片适配(图片大小与屏幕密度)Bitmap占用内存计算
目录 概述 dpi 计算公式 dp与px换算公式: android系统适配图片规律: 同名图片放在不同密度的文件夹下,系统选择图片规律 同一张图片,放在不同密度的Drawable文件夹下,ImageV ...
最新文章
- 学习笔记(5)——实验室集群LVS监控Web界面配置
- 转:QQ圈子:社交神器还是隐私魔鬼?
- GMM_example(1)
- Java常用数据类型
- Java 编程需要注意的细节
- 动手实现MVC: 4. AOP的设计与实现
- Memory for crash kernel (0x0 to 0x0) notwithin permissible range
- 剑指 只出现一次的数字
- 使用struts框架接受http请求过来的get和post数据的方法:
- html 字体图标大小,CSS ICONFONT 基线和大小问题
- 基于JavaWeb的3D网上模板商城
- php编写网页实例,网页实例:怎么详细介绍用PHP来编写网页记数器
- YOLOv3: An Incremental Improvement (YOLOv3 论文翻译)
- mysql中comment(注释)的一些用法
- 机器学习概要(MACHINE LEARNING SUMMARY)
- 看了下李航的《统计学习方法》
- CoAP协议学习笔记(一)
- centos 安装miniconda
- 2022版本的idea没有定位图标
- 【动态规划】走楼梯问题
热门文章
- 下列哪个不是python的第三方库_以下选项中,不是 Python 中用于开发用户界面的第三方库是()...
- C++学习(二八一)Gradle下载目录里的随机码是什么
- 【学习笔记】无限极分类学习
- 微信聊天记录没有备份可以恢复吗?吐血整理分享
- 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容
- 用友NC 漏洞汇总(转载)
- 第一行代码Android技巧1——知晓当前是在哪一个活动
- 品牌软文营销借助故事的力量打动用户
- django模板使用
- Win11-GTX3060-配置Pytorch GPU