要求未压缩图像的大小,用像素总数乘以每个像素所用的位数:位数 = 宽 × 高 × 颜色深度。当题目给出分辨率和颜色深度,并问这幅图需要多少存储空间时,就会用到它。
它直接建立在上一模块的位深度之上,也是图像、声音与存储模块的第一课。
为什么答案需要假设?
位图图像是一张像素网格,每个像素把一种颜色存成二进制数。每个像素的位数就是颜色深度(colour depth)。位数越多,能表示的颜色越多,但图像需要的存储也越多。
公式只给出像素数据的大小。真实文件还会保存宽、高等细节,也可能经过压缩。所以要写出你的假设,例如“假设没有压缩并忽略文件元数据”。
一步一步怎么算?
- 求像素总数: 宽 × 高。
- 求每个像素的位数。 如果给的是颜色数,就找能容纳它们的最小位深度(2位数 ≥ 颜色数)。
- 相乘: 像素数 × 每像素位数,得到以位为单位的大小。
- 换算: 除以 8 得到字节,更大的单位按指定约定换算(见存储单位换算)。
- 写出假设并带上单位。
同一个方法写成剑桥风格的伪代码:
INPUT Width, Height, Depth
Bits ← Width * Height * Depth
Bytes ← Bits / 8
OUTPUT Bytes
追踪 Width = 800、Height = 600、Depth = 8:Bits = 800 × 600 × 8 = 3 840 000,所以 Bytes = 480 000。
例题
一张照片宽 1 024 像素、高 768 像素,颜色深度为 24 位。求未压缩大小,分别用字节和 KiB 表示(1 KiB = 1 024 字节)。
第 1 步,像素数: 1 024 × 768 = 786 432。
第 2 步,位数: 786 432 × 24 = 18 874 368 位。
第 3 步,字节数: 18 874 368 ÷ 8 = 2 359 296 字节。
第 4 步,KiB: 2 359 296 ÷ 1 024 = 2 304 KiB(即 2.25 MiB)。
用另一条路检查: 24 位等于 3 字节,所以 786 432 × 3 = 2 359 296 字节。两条路结果一致。
假设: 没有压缩、没有元数据,所以真实文件会稍大一点,如果压缩了则会小很多。
要留意的错误
常见的失误是把颜色数当成位深度。
错误的答案: 一幅 640 × 480、256 种颜色的图像。大小 = 640 × 480 × 256 = 78 643 200 位。
学生在应该用位数的地方用了 256。
纠正:256 种颜色需要 8 位,因为 28 = 256。所以大小 = 640 × 480 × 8 = 2 457 600 位 = 307 200 字节。错误的答案大了 32 倍,快速做一次合理性检查就会发现。
自我检测
写出每一步,然后打开答案。
1. 一幅图像宽 100 像素、高 50 像素,颜色深度为 4 位。需要多少字节?
显示答案
像素数 = 100 × 50 = 5 000。位数 = 5 000 × 4 = 20 000。字节数 = 20 000 ÷ 8 = 2 500 字节。
2. 一幅 640 × 480 像素的图像使用 16 种颜色。求未压缩大小(KiB)。
显示答案
16 种颜色需要 4 位(24 = 16)。像素数 = 640 × 480 = 307 200。位数 = 307 200 × 4 = 1 228 800。字节数 = 153 600。KiB = 153 600 ÷ 1 024 = 150 KiB。
3. 一幅黑白图像为 8 × 8 像素。需要多少字节?你假设的位深度是多少?
显示答案
两种颜色每个像素需要 1 位。位数 = 8 × 8 × 1 = 64。字节数 = 64 ÷ 8 = 8 字节,假设颜色深度为 1 位且没有元数据。
接下来学什么
声音的存储用的是类似的推理,所以接着学习计算采样音频的大小。两课都熟练后,到练习集里检验。Python 推理沙盒适合把公式写成代码并核对你的算术。
有些学生每一步都看得懂,却因为忘了写假设或忘了除以 8 而失分。这正是我们的老师在线上一对一计算机科学补习中会留意的模式。