2016-08-01 43 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