2016-08-01 110 views
0

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

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文件时提供的尺寸?这样的文件的内容可以是随机的,对我无关紧要。

回答

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]) 

OUTPUT:

初始图像大小:1048630

新的图像大小:1048574

+0

是否真的需要创建一个文件然后被删除?难道它不能在几行或者从一开始就完成,而没有创建 - 删除 - 创建场景呢? – Asunez

+0

这是我思考的一点点,唯一的方法(我能想到)确定它不超过一定的内存量是在创建文件后检查它的实际内存。但是,您可以将初始代码更改为减去56个字节而不是54个,然后包含来自我的代码的image_statistics检查,并且只在图像在减去56个字节后不符合您的要求时才执行图像去除和再生。此时图像再生实际发生的频率将比原来提供的代码少得多。 – BRRRRR