在Python 3中创建给定大小的BMP文件

时间:2016-08-01 11:32:37

标签: python-3.x bitmap python-3.5 pillow

我目前正在尝试使用给定的确切大小在Python中创建BMP文件。我需要这个大小,精度低至一个字节,我在生成图像时遇到问题。要做到这一点,我使用Pillow库如下:

img = Image.new('RGB', (1, size//4), "black")
pixels = img.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):
        pixels[i,j] = (i, j, 1)

img.save("image.bmp")

size等于1*1024*1024 = 1048576(1MB大小计算为字节)。但是,创建的文件有点大 - 它有1048630字节。我想这是因为位图头文件,但是当我尝试从一般大小中减去标题大小时:

img = Image.new('RGB', (1, (size-54)//4), "black")

生成的文件大小为1048576 - 无处不在2个字节。

如何正确计算创建BMP文件时要提供的大小?这样的文件内容可以是随机的,对我来说无关紧要。

1 个答案:

答案 0 :(得分:0)

假设您希望将文件大小调整为1048574字节(如果超过此值):

from PIL import Image
import os
from stat import ST_SIZE

############## Your code below ##################

size = 1*1024*1024
img = Image.new('RGB', (1, (size)//4), "black")
pixels = img.load()
for i in range(img.size[0]):
    for j in range(img.size[1]):
        pixels[i,j] = (i, j, 1)
img.save("image.bmp")

############# Your code above ##################

image_statistics = os.stat("image.bmp")
print("Initial image size: ", image_statistics[ST_SIZE])

difference = image_statistics[ST_SIZE] - size

if difference > 0:
    os.remove("image.bmp") #Delete first attempt.
    img = Image.new('RGB', (1, (size - difference)//4), "black") #Regenerate
    pixels = img.load() # Note: this segment is the same as the initial code.
    for i in range(img.size[0]):
        for j in range(img.size[1]):
            pixels[i,j] = (i, j, 1)
    img.save("image.bmp") #File saved with new size.

    image_statistics = os.stat("image.bmp")




print("New image size: ", image_statistics[ST_SIZE])

输出:

初始图片尺寸:1048630

新图片尺寸:1048574