###### Traitements images ######

# Bibliothèques pour lire une image 
from PIL import Image
from PIL import ImageOps
import numpy, os

# définir le répertoire courant (pour pyzo) 
os.chdir( r'./' )

##################################
## Pour afficher des images 

def afficher(nfichier:str) -> None : 
    Image.open(nfichier).show()


##################################
## Des images en noir & blanc...

def photo2matriceNB(nfichier: str) -> list:
    """
    a partir d'une image en niveau de gris, créé la matrice représentant l'image
    entree : nom avec son chemin d'une image en niveau de gris
    sortie : une matrice d'entiers compris entre 0 et 255
    """
    im = Image.open( nfichier ) # créer un objet im qui contient l'image située à l'adresse indiquée
    largeur, hauteur = im.size    # méthode size récupère les dimensions
    imdata = numpy.array( im.getdata() )         # la methode getdata permet de récupérer les valeurs des pixels en liste, que l'on transforme en tableau
    mat = numpy.reshape( imdata, (hauteur, largeur) )  # met les données sous forme de matrice
    return list( mat )

def matrice2photoNB(mat: list, nfichier: str) -> None:
    """
    a partir d'une matrice d'entiers, créé une image
    entree : matrice et nom avec chemin de la future image
    sortie : aucun (mais un fichier a été créé sur l'ordinateur)
    """
    mat = numpy.array( mat )
    size = ( mat.shape[1], mat.shape[0] ) # entre matrice et image, l'ordre des dimensions est inversé
    im2 = Image.new( "L", size )
    im2.putdata( list( mat.flat ) )
    im2.save( fp=str(nfichier) )


##################################
## et avec de la couleur...

def photo2matriceC(nfichier: str) -> list:
    """
    a partir d'une image en couleurs, créé la matrice représentant l'image
    entree : nom avec son chemin d'une image en couleurs
    sortie : une matrice de triplet d'entiers compris entre 0 et 255
    """
    im = Image.open( nfichier )   # créer un objet im qui contient l'image située à l'adresse indiquée
    largeur, hauteur = im.size    # méthode size récupère les dimensions
    imdata = im.getdata()          # la méthode getdata permet de récuperer les valeurs des pixels en liste    
    tab = numpy.array(imdata)      # met les données en tableau
    mat = numpy.reshape( tab, (hauteur,largeur,3) )  # met les données sous forme de matrice
    return list( mat )

def matrice2photoC(mat: list, nfichier: str) -> None:
    """
    a partir d'une matrice possédant un triplet d'entiers, créé une image en couleurs
    entree : matrice et nom avec chemin de la future image
    sortie : aucun (mais un fichier a été créé sur l'ordinateur)
    """
    mat = numpy.array( mat )
    mat = numpy.uint8( mat )   # conversion obligatoire
    imNew = Image.fromarray( mat )  
    imNew.save( nfichier )

##################################


