Présentation
Série de scripts permettant de générer une image avec des points. Pour visualiser des pixels carrés je vous engage à ouvrir les fichiers résultants avec GIMP. Pour mieux comprendre, peut-être aller voir l'article source ayant inspiré ces scripts: 2nde-snt-python-image-et-pixels
Script - générateur d'un damier Noir et Blanc
from PIL import Image
#taille image
largeur = int(input("Largeur en pixel ="))
hauteur = int(input("Hauteur en pixel ="))
# creation image
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
for x in range (largeur):
for y in range (hauteur):
if (x+y)%2==0:
n=255
else:
n=0
img.putpixel((x,y),(n,n,n))
# sauvegarde image
img.save("NoirEtBlanc.jpg")
print("creation de l'image source - enregistrement NoirEtBlanc.jpg - voir le dossier où se trouve le programme python")
Script - générateur couleur aléatoire
from PIL import Image
from random import randint
#taille image
largeur = int(input("Largeur en pixel ="))
hauteur = int(input("Hauteur en pixel ="))
# creation image
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
for x in range (largeur):
for y in range (hauteur):
b=randint(0,255)
v=randint(0,255)
r=randint(0,255)
img.putpixel((x,y),(r,v,b))
# sauvegarde image
img.save("CouleurAlea.jpg")
print("creation de l'image source - enregistrement CouleurAlea.jpg - voir le dossier où se trouve le programme python")
Script - incrémentation régulière r,v,b
Conseil: une image de 383 par 2 pixel² permet de traiter tous les couples r,v,b de 0,0,0 (... 255,0,0 ... 255,255,0) à 255,255,255 en utilisant 766 pixels
from PIL import Image
#taille image
largeur = 383
hauteur = 2
compteur = 0
# creation image
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
r,v,b=0,0,0
for x in range (largeur):
for y in range (hauteur):
compteur=compteur+1
img.putpixel((x,y),(r,v,b))
print(compteur,r,v,b)# Impression des valeurs pour comprendre
if r<255:
r=r+1
else:
r=255
if v<255:
v=v+1
else:
v=255
if b<255:
b=b+1
else:
r,v,b=0,0,0
# sauvegarde image
img.save("CouleurIncremente.jpg")
print("creation de l'image source - enregistrement CouleurIncremente.jpg - voir le dossier où se trouve le programme python")
Script - Image de 256^3 soit 16 777 216 couleurs
L'idée est ici d'incrémenter régulièrement toutes les combinaisons de 0,0,0 à 255,255,255.
Pour ne rater aucune combinaison je compte en binaire de
00000000 00000000 00000000
à
11111111 11111111 11111111
puis découperait cette valeur en 3 parties de 8 bits. Notez que je me demande si une autre méthode ne serait pas plus efficace mais pour l'instant je ne vois pas...
Génération des valeurs en binaire
for i in range (16777216):
binaire=bin(i)[2:]
while len(binaire)<24:
binaire="0"+binaire
r=int(binaire[0:8],2)
v=int(binaire[8:16],2)
b=int(binaire[16:24],2)
print(r,v,b)
Générateur d'une image de 16 777 216 pixels avec 16 777 216 de couleurs allant de r,v,b=0,0,0 à 255,255,255
Je vous laisse le plaisir de lancer le script et de découvrir le résultat... Ouvrez l'image avec GIMP puis pipette pour visualiser les coordonnées et le valeur rvb.
Notez que j'ai un petit doute sur les valeurs r,v,b de mes pixels. Aurai-je attends les limites de pillow?
Après expérimentation, je suis à deux doigts de penser qu'un enregistrement en jpg n'est pas une bonne idée car c'est un format compressé. J'ai donc testé avec largeur=hauteur= 2**5 et img.save("4096par4096pix-couleur.bmp). C'est beaucoup mieux! Mais pour une image de 16 millions de pixels, j'ai une MemoryError... Donc j'en resterai là!
from PIL import Image #1
# taille image
largeur =2**12
hauteur =2**12
# creation image 16 millions de pixel couleurs allant de 0,0,0 à 255,255,255
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
print("RAPPEL - enregistrement de l'image 4096par4096pix-couleur.jpg, l’image se trouve dans le dossier où le script est enregistré")
i=0
#3
for x in range (largeur):
for y in range (hauteur):
#4
binaire=bin(i)[2:]
while len(binaire)<24:
binaire="0"+binaire
r=int(binaire[0:8],2)
v=int(binaire[8:16],2)
b=int(binaire[16:24],2)
#5
img.putpixel((x,y),(r,v,b))
i=i+1
# Impression à chaque sortie de la boucle y pour faire patienter le testeur
print("traitement de la ligne n° ",x+1, "de votre image")
# Affichage finale
print("image de ",x+1,"par",y+1," pixel²","- Valeurs de r,v,b max atteintes ",r,v,b)
img.save("4096par4096pix-couleur.jpg")
Déçu ? Oui je trouve aussi qu'il est moche le dégradé