使用 python 打开和保存位图图像会影响文件大小
Opening and saving of bitmap images with python affects filesize
我有一个 800x800 RGB 位图,文件大小为 2501 KB,并执行以下操作(使用 python 3.6):
(不幸的是我不能分享图片)
from PIL import Image
import numpy as np
im = Image.open('original_image.bmp')
im.save("test_size_manual.bmp", "BMP")
由于某些原因,新文件只有 1876 KB。即使文件大小不同,以下内容仍然成立:
import matplotlib.pylab as plt
original_image = plt.imread('original_image.bmp')
test_size_image = plt.imread('test_size_manual.bmp')
assert (original_image == test_size_image).all()
这意味着像素对像素的结果 numpy.ndarray 是相同的。从在 google 图像上发现的 800x800 bmp 的 'random' 样本中,大多数图像的文件大小与新图像相同,为 1876 KB,但至少还有一个与原始图像的文件大小相同, 2501 KB.
是什么导致了文件大小的差异,或者您将如何找出答案?
答案确实在元数据中找到了。
原始图像原来是 32 位位图,而新图像是 24 位位图。这解释了文件大小的差异:2501 * 3/4 刚好小于 1876。
在二进制的偏移量 28 (0x1c) 处存储了位深度,原始图像为 32,新图像为 24。
参考:BMP file format on Wikipedia
我有一个 800x800 RGB 位图,文件大小为 2501 KB,并执行以下操作(使用 python 3.6):
(不幸的是我不能分享图片)
from PIL import Image
import numpy as np
im = Image.open('original_image.bmp')
im.save("test_size_manual.bmp", "BMP")
由于某些原因,新文件只有 1876 KB。即使文件大小不同,以下内容仍然成立:
import matplotlib.pylab as plt
original_image = plt.imread('original_image.bmp')
test_size_image = plt.imread('test_size_manual.bmp')
assert (original_image == test_size_image).all()
这意味着像素对像素的结果 numpy.ndarray 是相同的。从在 google 图像上发现的 800x800 bmp 的 'random' 样本中,大多数图像的文件大小与新图像相同,为 1876 KB,但至少还有一个与原始图像的文件大小相同, 2501 KB.
是什么导致了文件大小的差异,或者您将如何找出答案?
答案确实在元数据中找到了。
原始图像原来是 32 位位图,而新图像是 24 位位图。这解释了文件大小的差异:2501 * 3/4 刚好小于 1876。
在二进制的偏移量 28 (0x1c) 处存储了位深度,原始图像为 32,新图像为 24。
参考:BMP file format on Wikipedia