Android中如何计算图片占用的实际内存大小?

Android中一张图片占据的内存大小是如何计算,2024字节跳动春招技术面试题 理清这点蛮重要的,因为碰到过有人说,我一张图片就几 KB,虽然界面上显示了上百张,但为什么内存占用却这么高?所以,我们需要搞清楚一个概念:我们在电脑上看到的 png 格式或者 jpg 格式的图片,png(jpg) 只是这张图片的容器,它们是经过相对应的压缩算法将原图每个像素点信息转换用另一种数据格式表示,以此达到压缩目的,减少图片文件大小。 阅读详情

当我们看完本篇文章,你应该可以知道:

  1. 占用的内存,不是说的图片的文件大小
  2. 我们可以在运行时去获取
  3. 要掌握图片内存大小的计算方法

一、如何在运行时获取Bitmap的大小?

  • 获取图片实际需要的内存大小
public final int getByteCount() {
    if(mRecycled) {
        return 0;
    }

    return getRowBytes() * getHeight();

}
  • 图片实际占用的内存大小

因为存在一个复用的场景,比如之前已经开辟了400KB的大小用来显示图片A,现在我们需要显示300KB的图片B,而且图片A已经不需要显示了,那么可能就会将之前开辟的400KB用来显示图片B,这样就不需要重新开辟新的内存,所以图片B实际占用的内存400KB。

public final int getAllocationByteCount() {
    if(mRecycled) {
        return 0;
    }

    return nativeGetAllocationByteCount(mNativePtr);
}

二、图片的来源

  • Assets中的图片

     asstes中的文件基本等同于我们从SDCard中加载的图片,所以就不再单独讲解了。

举个例子:我们以宽高为112px * 131px像素的png图片为例(文件大小为20kb),如果我们使用下面的方式加载到内存中:

BitmapFactory.decodeStream(assets.open("test.png"));

实际上展示的是:以ARGB_8888的格式加载到内存中,那么最终的大小是112*131*4 = 58688KB。实际上就是我们图片需要显示的总的像素点数乘以单个像素点所占用的内存,因为ARGB_8888,可以看出来一个像素的四个通道分别需要8位来描述,所以一个像素点需要4个字节的内存,所以总的像素点数乘以4就是这张图所占用的总内存了。

所以,意味着图片的内存大小除了像素大小外,还和加载到内存的格式有关,比如我们将上面的图片换成RGB_565去加载,那么我们得出的内存就应该是:112*131*[(5_6+5)/8] = 112*131*2 = 29344个字节,足足比之前小了一半的大小。

  • Drawable目录中的图片

     当我们将图片放到不同的drawable目录中,最后显示出来占用的实际像素是有一定的缩放关系的,还是以112*131px的图片为例:

drawable算法关系

这么说吧,如果将上面的图片放到hdpi目录下,然后以ARGB_8888加载到内存中占用的内存大小算法就如下:

(112÷1.5)×(131÷1.5)× 3 × 4 = 77256字节

注意如果放在-nodpi中,那么图片在不同DPI的设备中不会做任何缩放,都只会以112×131的像素显示,所以在不同手机中永远占用相同的内存。

三、优化图片占用的内存体积

  • 使用inSampleSize对图片进行采样、压缩
  • 使用矩阵变化来改变图片大小
  • 使用RGB_565来加载非透明图片
  • 使用 9-patch图片来做背景图
  • 使用VectorDrawable
  • 能不用图片就不用图片
  • 感兴趣的同学可以看下在Android8.1之前可以使用的索引模式(IndexedColor)

 

字节跳动面试官:一张图片占据的内存大小是如何计算 最近封装了个高斯模糊组件,正好将图片相关的理论基础也梳理了下,所以,这次就来讲讲,在 Android 中,怎么计算一张图片在内存中占据的大小,如果要优化,可以从哪些方向着手。 提问 阅读本篇之前,先来想一些问题: Q1:一张 png 格式的图片,图片文件大小为 55.8KB,那么它加载进内存时所占的大小是多少? Q2:为什么有时候,同一个 app,app 内的同个界面,界面上同张图片,但在不同设备上所耗内存却不一样? Q3:同一张图片,在界面上显示的控件大小不同时,它的内存大小也会跟随着改变吗? Q4:图片 阅读详情

相关推荐

android bitmap内存那些事

bitmap内存占用是一个困扰我很久的问题,今天就好好理一理! 这篇文章用的图片为下面这张图:480 * 800 (这里放上来的我把它缩小了,要不然网页上显示着特别大) 问题:一张压缩前 和 压缩后的图片,PC上的大小有区别,但尺寸不变,只是质量压缩了,那么读入内存时占用的内存大小呢? 验证: 机型:小米2s 压缩前的图大小如下: 压缩后的图大小如下:

tihi的博客 4688

Android中一张图片占据的内存大小是如何计算

最近封装了个高斯模糊组件,正好将图片相关的理论基础也梳理了下,所以,这次就来讲讲,在 Android 中,怎么计算一张图片在内存中占据的大小,如果要优化,可以从哪些方向着手。 提问 阅读本篇之前,先来想一些问题: Q1:一张 png 格式的图片,图片文件大小为 55.8KB,那么它加载进内存时所占的大小是多少? Q2:为什么有时候,同一个 app,app 内的同个界面,界面上同张图片,但在不同设备...

weixin_34235135的博客 475

Android中一张图片占据的内存大小是如何计算(1)

一张图片占用的内存大小的计算公式:分辨率 * 像素点大小;但分辨率不一定是原图的分辨率,需要结合一些场景来讨论,像素点大小就几种情况:ARGB_8888(4B)、RGB_565(2B) 等等。如果不对图片进行优化处理,如压缩、裁剪之类的操作,那么 Android 系统会根据图片的不同来源决定是否需要对原图的分辨率进行转换后再加载进内存。

2401_84003630的博客 1028

【Android笔记】Android加载大图策略,防止OOM

Android中图片以位图(Bitmap)的形式存在,位图常见的格式有.png.jgp.bmp.gif。在加载图片的过程中常见的就是内存溢出。内存溢出是系统会给APP分配内存也就是Heap Size值。当APP占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存时就会抛出的异常。为什么在加载大图片时会出现内存溢出?首先我们要了解Bitmap位图占用内存大小的计算方式。

Ho博客 1955

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5912

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5137

Android加载的图片在内存中的大小

1.图片占内存的大小 计算公式:占内存大小 = 分辨率 * 像素点的大小。 其中每个像素点的大小如下: ALPHA_8 -- (1B) RGB_565 -- (2B) ARGB_4444 -- (2B) ARGB_8888 -- (4B)(默认) RGBA_F16 -- (8B) 例如:1080*1920默认ARGB8888的图片文件大小100K左右,被加载到内存中大小为:1080*1920*4= 8294400 ≈7.91M。 是不是觉得跟想象中的100K左右图片大小不符合呢?我们平时看到...

Yvan 1358

决策树简介/PPT

最近给我们组新生讲了决策树的相关知识,以下是所做的PPT,参考了网络资源。

垃圾就应该待在垃圾桶里的博客 3795

Android 获取图片尺寸大小的方法

一、获取图片大小有两张情况代码如下: package com.jhq.myunzip; import android.Manifest; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v4.app.ActivityCompat; import android.support.v7

Jason_996的博客 3131

【毕业设计参考】基于yolov8+pyqt5自适应界面设计的锂电池表面缺陷检测系统

基于YOLOv8+PyQt5的锂电池表面缺陷检测系统结合了先进的目标检测技术与友好的用户界面设计,为锂电池质量检测提供了一种高效、准确的解决方案。未来,随着深度学习技术的不断发展,我们可以进一步优化模型,提高检测精度和速度,同时拓展系统功能,如实现实时视频流检测、与生产系统的深度集成等,为锂电池产业的发展注入新的活力。希望本文对大家在相关领域的研究和实践有所帮助,欢迎大家在评论区交流讨论。

1182

基于QGIS的DEM地形数据精细化处理:从裁剪、合并到成果输出

本文详细介绍了使用QGIS进行DEM地形数据的精细化处理流程,包括数据获取、裁剪、合并及成果输出等关键步骤。通过实战技巧和注意事项,帮助用户高效处理地形数据,适用于GIS分析、三维建模等应用场景。

weixin_29093017的博客 450

android 计算图片占用内存大小

android 中计算图片占用内存大小公式: 占用内存大小 = 横向显示像素 * 竖向显示像素  * 单个像素占用字节数 ; 显示像素 = 图片实际像素 * 手机density / 图片density ; 图片density根据图片放在哪个目录来决定,参考下图 如果放在drawable目录,与放在mdpi目录相同。如果放在drawable-nodpi目录,图片density

ziyuanyulong的专栏 1549

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 71

android bitmap内存大小,Android——Bitmap占用的内存大小

一、作用知其然二、概念1. 几个小概念像素:组成画面的基本单位,像素没有物理尺寸。可以任意缩放去适配显示屏的像素点大小。不同设备上一个单位像素色块的大小是不一样的(2)dp设备独立像素,用于适配各种屏幕。所有显示到屏幕上的图像都是以px为单位的,dp是我们开发中使用的长度单位,最后也需要转换成px。px=dp*dpi/160dpi/160得到基准比例求以dp布局的 TextView 占用的实际像...

weixin_39637614的博客 363

Pytorch入门实战(2)-使用BP神经网络实现MNIST手写数字识别

上一篇:Pytorch入门实战(1) - 实现线性回归 涉及知识点 Pytorch nn.Module的基本使用 Pytorch nn.Linear的基本用法 PytorchVision Transforms的基本使用 Pytorch中DataLoader的基本用法 Pytorch详解NLLLoss和CrossEntropyLoss 如何确定神经网络的层数和隐藏层神经元数量 本文内容 本文将会使用BP神经网络(就是最普通的神经网络)实现一个MNIST手写数据集的实现。话不多说,直接开始。 首先先导入需要的包

iioSnail的博客 6615

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采集到的数据进行处理和解算,上层用户交互层负责与用户进行交互并显示系统状态信息。

嵌入式阿齐Archie 1万+

【Android进阶笔记】图片优化(理论大小和实际大小的计算方式)

文章目录1. 图片压缩格式1.1. 常见的图片格式1.2. WebP格式2. Android内存中的图片2.1. 位图配置Bitmap.Config2.2. 计算占用内存大小2.2.1. 理论值2.2.2. 实际值3. 图片压缩3.1. 质量压缩3.2. 采样率压缩3.3. 尺寸压缩3.4. 图片压缩总结3.5. 实际效果对比 1. 图片压缩格式 1.1. 常见的图片格式 格式 质量 透明 压缩方式 png 较高 支持 图片压缩算法。把相似的颜色压缩在一起 jpg/jpeg 良好 不

Android学习笔记 932

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android | 计算图片占用内存大小

对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下并整理了一下。图片本身的大小和它占用内存的大小没有什么关系。图片占用内存的计算公式 分辨率 * 像素点大小,也就是 长 * 宽 * 像素点大小,像素点大小是根据加载方式来定的,例如 ARGB_8888 占 4 个字节,RGB_565 占 2 个字节。

bugyinyin的博客 1508

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android中一张图片占用的内存大小

最近面试过程中发现对Android中一些知识有些模棱两可,之前总是看别人的总结,自己没去实践过,这两天对个别问题进行专门研究 探讨:如何计算Android中一张图片占据内存的大小 解释:此处说的占据内存,是APP加载图片用的内存,即APP运行时图片占用的内存,不考虑图片显示到界面占用的内存(即只加载图片,不显示。因为显示图片时,系统有可能根据控件的大小或其他因素对内存进行了优化,不确定因素太多),...

王人冉的博客 2995

安卓图片内存优化(一)——图片占用内存大小的计算

安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊情况获取到几百兆内存空间的情况)。所以为了节省更多的空间需要对图片进行内存优化。对于很多初学者来说应该都会有这样的疑惑: 只是加载了一张几百k的图片而已,为什么也会导致oom的问题?想知道问题的答案我们得弄明白图片在内存中占用的空间大小是如何计算的。1. 图片相关的

hyhdcl的专栏 2040

Android中如何计算一张图片占用内存大小?

Android中获取和计算Bitmap占用内存大小 Bitmap、ARGB_8888、RGB_565、getAllocationByteCount、getByteCount

bigfc的博客 4265

一张图片占据的内存大小是如何计算?

最近封装了个高斯模糊组件,正好将图片相关的理论基础也梳理了下,所以,这次就来讲讲,在 Android 中,怎么计算一张图片在内存中占据的大小,如果要优化,可以从哪些方向着手。 提问 阅读本篇之前,先来想一些问题: Q1:一张 png 格式的图片,图片文件大小为 55.8KB,那么它加载进内存时所占的大小是多少? Q2:为什么有时候,同一个 app,app 内的同个界面,界面上同张图片,但在不同设备上所耗内存却不一样? Q3:同一张图片,在界面上显示的控件大小不同时,它的内存大小也会跟随着改变吗? Q4:图片

qq_39431405的博客 1万+
上一篇: 阿里的专家说不能,当我这么做的时候竟然让他羞红了脸
下一篇: com.android.tools.r8.errors.CompilationError: Program type already present: androidx错误解决方法
IT烂笔头
博客等级 码龄15年 621粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值