2016-08-01 62 views
0

Ich versuche derzeit, eine BMP-Datei in Python der angegebenen genauen Größe zu erstellen. Ich brauche diese Größe mit einer Genauigkeit bis zu einem Byte, und ich habe Probleme, ein Bild zu erzeugen. Um dies zu tun Ich bin mit Pillow-Bibliothek wie folgt:Erstellen BMP-Datei der angegebenen Größe in Python 3

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

Wo size-1*1024*1024 = 1048576 gleich ist (1 MB Größe in Bytes berechnet). Die erstellte Datei ist jedoch etwas größer - sie hat 1048630 Bytes. Ich nehme an, es ist wegen einer Bitmap-Header-Datei, aber wenn ich versuche, die Kopfgröße von allgemeiner Größe zu subtrahieren:

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

die Größe der Datei erzeugt wird, 1048576 - mit 2 Bytes aus dem Nichts.

Wie kann ich richtig berechnen, welche Größe beim Erstellen von BMP-Dateien bereitgestellt werden soll? Der Inhalt einer solchen Datei kann zufällig sein, spielt für mich keine Rolle.

Antwort

0

Sie Angenommen, möchten Sie Ihre Datei zu 1.048.574 Bytes der Größe verändert werden, wenn sie diesen Wert überschreitet:

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:

Anfängliche Bildgröße: 1048630

New Bildgröße: 1.048.574

+0

Ist es wirklich notwendig, eine Datei zu erstellen, die dann entfernt wird? Kann es nicht in nur wenigen Zeilen oder von Anfang an getan werden, ohne ein Szenario zu erstellen, das überhaupt gelöscht werden kann? – Asunez

+0

Das war etwas, worüber ich nachgedacht habe, und die einzige Möglichkeit (ich kann daran denken), sicher zu gehen, dass es eine bestimmte Menge an Speicher nicht überschreitet, ist, seinen tatsächlichen Speicher zu überprüfen, nachdem die Datei erstellt wurde. Sie könnten jedoch Ihren ursprünglichen Code ändern, um statt 54 54 Bytes zu subtrahieren, und dann die image_statistics-Prüfung aus meinem Code einfügen und die Image-Entfernung und -Regenerierung nur durchführen, wenn das Image nach dem Subtrahieren von 56 Bytes nicht Ihren Anforderungen entspricht. Die Häufigkeit, mit der diese Bildregeneration tatsächlich an diesem Punkt stattfinden würde, wäre viel geringer als in dem ursprünglich bereitgestellten Code. – BRRRRR