J'ai besoin de générer un fichier image de 1 Mo pour faire un test dans django. Je ne peux définir que la taille de l'image, mais pas la taille du fichier image.

image_file = StringIO()
image = Image.new('RGBA', size=(4000,4000), color=(256,0,0))
image.save(image_file, 'png')
0
Giovanni Cornachini 13 juil. 2015 à 23:43

2 réponses

Meilleure réponse

Le moyen le plus simple consiste à enregistrer une image BMP, qui n'a pas de compression:

In [1]: Image.new('L', (1024, 1024)).save('/tmp/x.bmp')
In [2]: !ls -alh /tmp/x.bmp
-rw-r--r--  1 wolever  wheel   1.0M Jul 13 16:46 /tmp/x.bmp

Et si vous devez utiliser PNG, vous pouvez le remplir avec des données aléatoires:

In [3]: import os
In [4]: Image.frombytes('L', (1024, 1024), os.urandom(1024*1024)).save('/tmp/x.png')
In [5]: !ls -alh /tmp/x.png
-rw-r--r--  1 wolever  wheel   1.0M Jul 13 16:49 /tmp/x.png
1
David Wolever 13 juil. 2015 à 20:47

La taille du fichier dépend de ce qui est sur l'image. PNG compresse les données, de sorte que l'image vierge serait bien plus petite qu'une photo (avec la même résolution).

Vous pouvez utiliser une approche itérative: filp un pixel, enregistrer dans un fichier, vérifier la taille. Puis retournez-en un autre. Plus rapide: utilisez la bissection.

-1
neutrinus 13 juil. 2015 à 20:47