图像大小需要区分两个概念:
- 原始像素数据大小:不考虑压缩、文件头和附加信息;
- 磁盘文件大小:实际保存为 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
需要特别注意:
这个公式计算的是未压缩像素数据大小,不一定等于实际磁盘文件大小。
实际文件大小还会受到以下因素影响:
- 文件格式;
- 是否压缩;
- 压缩质量;
- 图像内容;
- 文件头;
- 元数据;
- 调色板;
- 行对齐;
- 多页或多帧数据;
- 存储位深和有效位深。