Android 图片处理之不同res-dpi文件夹下图片的内存大小计算

Android 图片处理之不同res-dpi文件夹下图片的内存大小计算

资源:

  • 图片:资源图片
  • 图片分辨率: 1920x1080
  • 设备: 华为青春版平板(FDR-A10w)
  • 设备分辨率: 1200*1920
  • 适用资源文件夹:hdpi(如何确定设备的res dpi
  • 源码
    MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/test"  //没有加载到内存时去掉当前行代码
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

将资源图片每次移动到同资源文件夹下的内存:

no loading picture(图片没有加载到内存)

Alt text

picture in mipmap-hdpi

Alt text

picture in mipmap-mdpi

Alt text

picture in mipmap-xhdpi

Alt text

picture in mipmap-xxhdpi

Alt text

picture in mipmap-xxxhdpi

Alt text

分析(单位:M)

不同文件夹内存分布

资源文件夹TotalJavaNativeGraphicsStackCodeOthers
no(不加载到内存)13.43.73.90.30.22.72.5

同一张图片,在不同文件夹下加载到内存数据

资源文件夹TotalJavaNativeGraphicsStackCodeOthers
mipmap-mdpi21.811.63.90.90.22.72.5
mipmap-mdpi32.121.23.91.50.22.72.5
mipmap-xhdpi18.28.14.00.70.22.72.5
mipmap-xxhdpi15.75.73.90.50.22.72.5
mipmap-xxxhdpi14.64.83.90.50.22.72.5

通过上述表格数据可得出同一张图片在不同res-dpi文件夹下加载到内存中内存占用大小是比一样的。

同一张图片,在不同文件夹下加载到内存与不加载到内存的差异

资源文件夹TotalJavaNativeGraphicsStackCodeOthers
mipmap-hdpi8.47.900.6000
mipmap-mdpi18.721.201.2000
mipmap-xhdpi4.88.10.10.4000
mipmap-xxhdpi2.35.700.2000
mipmap-xxxhdpi1.24.800.2000

在Android中默认使用的是ARGB_8888相对于其他格式,ARGB_8888的内存占用是最大的,但是也算最清晰的。

公式及解析:

图片内存计算公式:图片内存 = 长*宽 * 图片每个像素的内存占用大小(一个像素点占用的字节数)

以图片格式ARGB_8888为例,每个像素占用A、R、G、B四个通道,每个通道占用8位,所以描述一个像素需要32位即4个字节。一个颜色通道需要8位描述,2^8=256,所以每个颜色通道就有256种状态。如果把彩色图转化成灰阶图的话,也有256种状态分割从白色到黑色之间的过渡颜色。

注意不同图片格式内存计算方式(单位:字节)
图片格式(Bitmap.Config)图片每个像素的内存占用大小图片占用内存(分辨率:X*Y)
ALPHA_81x*y
ARGB_44442x*y*2
ARGB_88884x*y*4
RGB_5652x*y*2

参考链接:https://developer.android.google.cn/reference/android/graphics/Bitmap.Config

验证:

不同文件夹加载图片到内存与不加载到内存的差异

资源文件夹计算方式TotalJavaNativeGraphicsStackCodeOthers
mipmap-hdpi8.47.900.6000
mipmap-mdpi18.721.201.2000
mipmap-xhdpi4.88.10.10.4000
mipmap-xxhdpi2.35.700.2000
mipmap-xxxhdpi1.24.800.2000

验证

  • 当前设备识别的res-dpi文件夹是hdpi,通过计算图片在hdpi文件夹下的内存进行验证;按照上述的图片内存计算公式计算,1920x1080分辨率图片的内存 = 1920 * 1080 * 图片每个像素的内存占用大小 ;因为我们使用的图片格式默认是ARGB_8888,所以我们的图片每个像素的内存占用大小 = 4(字节),所以分辨率为1920x1080并且格式为ARGB_8888图片的内存内存 = 1920 * 1080 *4 = 8100k =7.910M。

  • 未完待续

总结

图片内存计算公式:图片内存 = 长*宽 * 图片每个像素的内存占用大小(一个像素点占用的字节数)
内存计算公式验证是成功的,能对上不同文件夹加载图片到内存与不加载到内存的差异表中mipmap-hdpi 的Java内存大小(有一些误差),有兴趣的可以继续验证其他组数据。

图片与不同(dpi)资源文件夹的关系详细分析可参考:Android 屏幕适配之不同res-dpi文件夹之间的关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一翼诚-Hokings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值