Imprimer
Catégorie : Programmation Python - 2nde SNT
Affichages : 13364

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é

Pièce(s) jointe(s)
Download this file (4096par4096pix-couleur.jpg)4096par4096pix-couleur.jpg[ ]1590 kB
Download this file (CouleurAlea.jpg)CouleurAlea.jpg[ ]60 kB
Download this file (CouleurIncrement.jpg)CouleurIncrement.jpg[ ]0.8 kB
Download this file (NoirEtBlanc.jpg)NoirEtBlanc.jpg[ ]43 kB