图像文件大小

图像大小需要区分两个概念:

  1. 原始像素数据大小:不考虑压缩、文件头和附加信息;
  2. 磁盘文件大小:实际保存为 PNG、JPG、BMP、TIFF 等文件后的大小。

一、原始图像数据大小公式

1. 使用每通道位深计算

其中:

  • 图像宽度:水平方向像素数;
  • 图像高度:垂直方向像素数;
  • 通道数:灰度图通常为1,RGB为3,RGBA为4;
  • 每通道位深:常见为8 bit、16 bit、32 bit;
  • 除以8:将 bit 转换为 Byte。

2. 使用每像素字节数计算

如果已经知道每个像素占多少字节,可以直接使用:

例如:

图像类型 每像素字节数
8位灰度图 1 Byte
16位灰度图 2 Byte
24位RGB图 3 Byte
32位RGBA图 4 Byte
48位RGB图 6 Byte
float32单通道图 4 Byte

二、单位换算

1. 二进制单位

计算机内存通常采用二进制单位:

因此:


2. 十进制单位

硬盘厂商和部分软件可能使用:

因此同一文件可能显示为不同的数值。例如:

等于:

  • 1 MiB
  • 1.049 MB

日常通常把 MiB 也简称为 MB,但严格来说两者不同。


三、常见图像计算示例

示例1:1024×1024的8位灰度图

参数:

复制代码
宽度:1024
高度:1024
通道数:1
每通道位深:8 bit

计算:

换算为 MiB:

所以:

1024×1024的8位灰度图,原始像素数据约为1 MiB。


示例2:1024×1024的16位灰度图

即:

所以:

16位灰度图的数据量是同分辨率8位灰度图的2倍。


示例3:1024×1024的24位RGB图

RGB图每通道8位,共3个通道:

即:

也可以直接计算:

所以:

1024×1024的8位/通道RGB图,原始数据约为3 MiB。


示例4:1024×1024的32位RGBA图

即:


示例5:4096×4096的8位灰度图

即:


示例6:4096×4096的24位RGB图

换算为 MiB:

所以:

4096×4096的24位RGB图,原始像素数据为48 MiB。


示例7:6144×6144的8位灰度图

换算:

所以:

6144×6144的8位灰度图,原始数据为36 MiB。


示例8:6144×6144的24位RGB图

换算:


四、常见图像类型数据量对比

1024 × 1024 图像为例:

图像类型 通道数 每通道位深 每像素大小 原始数据量
1位二值图 1 1 bit 1 bit 约128 KiB
8位存储的二值图 1 8 bit 1 Byte 1 MiB
8位灰度图 1 8 bit 1 Byte 1 MiB
16位灰度图 1 16 bit 2 Byte 2 MiB
24位RGB图 3 8 bit 3 Byte 3 MiB
32位RGBA图 4 8 bit 4 Byte 4 MiB
48位RGB图 3 16 bit 6 Byte 6 MiB
64位RGBA图 4 16 bit 8 Byte 8 MiB
float32灰度图 1 32 bit 4 Byte 4 MiB
float32 RGB图 3 32 bit 12 Byte 12 MiB

五、二值图像大小的特殊情况

逻辑上的二值图只有两个像素值,例如:

复制代码
0和1

因此理论上每个像素只需要1 bit:

例如1024×1024的1位二值图:

但是在很多图像处理程序中,二值图通常使用 uint8 保存:

复制代码
0:背景
255:前景

此时每个像素实际占1 Byte:

因此需要区分:

二值图存储方式 每像素大小
真正的1位打包存储 1 bit
uint8格式存储 8 bit,即1 Byte

六、10位、12位、14位图像的大小

工业相机常见10位、12位、14位图像。它们可能有两种存储方式。

1. 非打包格式 Unpacked

通常使用16位容器保存一个像素:

复制代码
有效位深:12 bit
存储位深:16 bit

因此每个像素仍占:

例如4096×4096的12位非打包图:

而不是24 MiB。


2. 打包格式 Packed

如果12位像素紧密打包,则理论大小为:

例如4096×4096的12位Packed图:

因此:

12位图存储方式 每像素平均大小
12-bit Packed 1.5 Byte
12-bit Unpacked到uint16 2 Byte

七、带行对齐时的图像内存大小

有些图像格式或图像库要求每行数据按照一定字节数对齐,例如:

  • 4字节对齐;
  • 8字节对齐;
  • 16字节对齐;
  • 32字节对齐;
  • 64字节对齐。

此时不能简单地用:

计算每行大小。

需要先计算行跨度,也叫:

复制代码
Stride
Pitch
Step
Bytes Per Line

通用对齐公式

假设要求按 A 字节对齐:

总内存大小为:


示例:宽度为101像素的24位RGB图,按4字节对齐

一行的有效像素数据:

303不能被4整除,因此需要补齐到304字节:

如果高度为100:

而直接计算得到:

多出的100字节就是每行的填充字节。


八、BMP文件大小计算

BMP通常存在行对齐,常见为每行按4字节对齐。

BMP行大小公式

或者写成整数形式:

像素数据大小:

BMP文件总大小还要加上:

  • BMP文件头;
  • DIB信息头;
  • 调色板;
  • 颜色配置文件;
  • 其他附加信息。

因此:


九、实际磁盘文件大小公式

实际保存后的图像文件大小可以近似表示为:

因此,实际文件大小不一定等于原始像素数据大小。


十、不同格式对文件大小的影响

1. RAW、PGM等未压缩格式

大小通常接近:

再加上少量文件头。


2. BMP格式

通常不压缩或压缩较少,文件大小接近原始数据,但要考虑:

  • 文件头;
  • 调色板;
  • 行对齐填充。

3. PNG格式

PNG采用无损压缩:

压缩比例不能仅根据宽高和位深精确计算,因为它取决于图像内容。

例如:

  • 大面积纯色图像容易压缩;
  • 噪声图像不容易压缩;
  • 二值图、图标、文字通常压缩效果较好。

4. JPG格式

JPG采用有损压缩,文件大小主要取决于:

  • 图像分辨率;
  • 质量参数;
  • 图像纹理复杂度;
  • 色度降采样;
  • 编码器实现。

不能只通过宽度、高度和通道数精确计算。

例如,同为 4096 × 4096 的两张图片:

  • 纯色图可能非常小;
  • 复杂纹理或噪声图可能明显更大。

5. TIFF格式

TIFF可以:

  • 不压缩;
  • 使用LZW压缩;
  • 使用Deflate压缩;
  • 使用JPEG压缩;
  • 保存多页图像;
  • 保存大量元数据。

所以TIFF大小不能仅通过后缀判断。


十一、多帧图像和视频大小

1. 未压缩多帧图像

单帧数据量:

因此:


2. 连续采集数据率

例如1920×1080、8位灰度、30 fps:

单帧:

每秒:

约为:


3. 采集一定时间的总数据量

例如采集60秒:

约为3.47 GiB。

这还没有考虑文件头和压缩。


十二、网络带宽计算

如果需要计算相机传输带宽:

例如1920×1080、8位灰度、30 fps:

约为:

实际网络带宽还需要考虑:

  • 数据包头;
  • 协议开销;
  • 帧头;
  • 时间戳;
  • 丢包重传;
  • 安全余量。

十三、图像大小通用速查表

已知条件 计算公式
原始字节数 宽×高×通道数×每通道位深÷8
已知每像素字节数 宽×高×每像素字节数
MiB 字节数÷1024²
GiB 字节数÷1024³
多帧总大小 单帧大小×帧数
每秒数据量 单帧大小×fps
一段采集数据量 单帧大小×fps×秒数
网络位率 宽×高×通道数×位深×fps
带Stride的内存 Stride×高度
Packed 12位图 宽×高×12÷8
uint16存储的12位图 宽×高×2

十四、Python计算示例

python 复制代码
def image_raw_size(
    width: int,
    height: int,
    channels: int,
    bits_per_channel: int,
) -> dict:
    """计算未压缩图像的理论像素数据大小。"""

    if width <= 0 or height <= 0:
        raise ValueError("图像宽度和高度必须大于0")

    if channels <= 0:
        raise ValueError("通道数必须大于0")

    if bits_per_channel <= 0:
        raise ValueError("位深必须大于0")

    size_bits = width * height * channels * bits_per_channel
    size_bytes = size_bits / 8

    return {
        "bits": size_bits,
        "bytes": size_bytes,
        "KiB": size_bytes / 1024,
        "MiB": size_bytes / (1024 ** 2),
        "GiB": size_bytes / (1024 ** 3),
    }


# 4096×4096、RGB三通道、每通道8位
result = image_raw_size(
    width=4096,
    height=4096,
    channels=3,
    bits_per_channel=8,
)

for unit, value in result.items():
    print(f"{unit}: {value}")

输出中,原始像素数据约为:

复制代码
50,331,648 Byte
49,152 KiB
48 MiB

十五、最终总结

最核心的公式是:

也可以记为:

例如:

复制代码
8位灰度图:宽 × 高 × 1 Byte
16位灰度图:宽 × 高 × 2 Byte
24位RGB图:宽 × 高 × 3 Byte
32位RGBA图:宽 × 高 × 4 Byte
48位RGB图:宽 × 高 × 6 Byte

需要特别注意:

这个公式计算的是未压缩像素数据大小,不一定等于实际磁盘文件大小。

实际文件大小还会受到以下因素影响:

  • 文件格式;
  • 是否压缩;
  • 压缩质量;
  • 图像内容;
  • 文件头;
  • 元数据;
  • 调色板;
  • 行对齐;
  • 多页或多帧数据;
  • 存储位深和有效位深。
相关推荐
千纸鹤安安1 小时前
开源 Agent 框架实战:用自然语言替代 Crontab 做运维
算法
从零开始的代码生活_1 小时前
C++ string 详解:常用接口、字符串算法与深拷贝实现
开发语言·c++·后端·学习·算法
2zcode1 小时前
项目文档:基于语音信号分析与机器学习的帕金森病智能检测系统
人工智能·机器学习·帕金森病
Keven_111 小时前
算法札记:差分约束系统为啥叫差分约束系统Σ(っ °Д °;)っ
算法·差分约束系统
liang89991 小时前
Anconda常用命令
linux·人工智能·conda
JustNow_Man1 小时前
【openspec】存量项目中如何使用进行开发
大数据·人工智能
minge00011 小时前
【世界杯中的AI】(2026-07-12)狂野逆转与AI神预测:世界杯1/4决赛夜,科技如何“封神”?
人工智能·科技·世界杯
枫叶丹41 小时前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
人工智能·microsoft·hermes
xd1855785551 小时前
鸿蒙PC时代的AI快递查询应用:基于鸿蒙Flutter框架的跨端创新实践
人工智能·flutter·华为·harmonyos·鸿蒙