为何用PIL生成的横竖尺寸图像字节数存在差异?
问题
我尝试使用PIL生成随机图像:
import numpy from PIL import Image a = numpy.random.rand(48,84) img = Image.fromarray(a.astype('uint8')).convert('1') print(len(img.tobytes()))
这段代码的输出为528。当我将numpy数组的尺寸互换,改为:
a = numpy.random.rand(84,48)
输出变为504。明明两个numpy数组的总元素数一致,为何图像的字节数会不同?
解答
核心原因是PIL处理1位二进制图像时,会对每行的字节数做8位对齐——每行的像素数会向上取整到8的倍数,不足的部分用0填充,最终按对齐后的字节数计算总大小。
具体计算:
- 第一种情况:图像尺寸为48行 × 84列
每行84个像素,转换为字节数:84 ÷ 8 = 10.5,向上取整为11字节(8×10=80,剩余4个像素需额外1字节存储)
总字节数:48 × 11 = 528,与代码输出一致。 - 第二种情况:图像尺寸为84行 × 48列
每行48个像素,48 ÷ 8 = 6,刚好是8的倍数,无需填充
总字节数:84 × 6 = 504,与代码输出一致。
总像素数相同,但每行像素数不同导致行对齐后的单行列字节数有差异,最终总字节数就不一样了。
内容的提问来源于stack exchange,提问作者shampu
相关产品推荐
相关产品推荐

