"""
Programme   : TP-images-correction-exo2.py
Langage     : Python 3.7.3
Modules     : Pillow 7.1.2
Auteur      : Mathieu Pons
Description : introduction à la manipulation d'images
Docs Pillow : https://pillow.readthedocs.io/en/stable/

Exercice à réaliser :
	1) Ecrire une fonction convertir_NB(pimg) qui convertit l'image passée en paramètre en
	noir et blanc. Votre fonction devra se charger de créer une nouvelle image vide en
	mode 1 de même taille que l'image à convertir.

	2) Ecrire une fonction convertir_gris(pimg) qui convertit l'image passée en paramètre en
	niveaux de gris sur le même principe que la question précédente.

	3) Ecrire une fonction filtrer_canaux(pimg) qui filtre chaque canal de rouge, de vert et de
	bleu de l'image passée en paramètre et renvoit un 3-tuple contenant les images filtrées.
"""

# IMPORT =========================================================================================
from PIL import Image

# FONCTIONS =======================================================================================
def convertir_NB(pimg):
	"""
    Description : convertit pimg en noir et blanc
	Paramètres  : type(pimg) => Image.PIL
	Retour      : Image.PIL
	"""
	_width, _height = pimg.width, pimg.height # on récupère la largeur et la hauteur de l'image dans des variables locales
	_seuil = 100 # seuil de la valeur d'un pixel pour le passer en blanc ou en noir
	_img = Image.new("1", (_width, _height)) # création d'une image en noir et blanc "1"

	print("Conversion noir et blanc en cours...")
	for y in range(_height): # parcours ligne par ligne
		for x in range(_width): # et colonne par colonne
			r, g, b = pimg.getpixel((x, y)) # on récupère les composantes RGB du pixel
			moy = int((r + g + b) / 3) # calcul de la moyenne de la valeur du pixel

			if moy > _seuil: # si celle-ci est plus grande que le seuil fixé
				_img.putpixel((x, y), 1) # on passe le pixel en blanc
			else:
				_img.putpixel((x, y), 0) # on passe le pixel en noir
	print("Image convertie avec succès!")

	return _img

def convertir_gris(pimg):
	"""
    Description : convertit pimg en niveaux de gris
	Paramètres  : type(pimg) => Image.PIL
	Retour      : Image.PIL
	"""
	_width, _height = pimg.width, pimg.height
	_img = Image.new("L", (_width, _height)) # création d'une image en niveaux de gris "L"

	print("Conversion en niveaux de gris en cours...")
	for y in range(_height): # parcours ligne par ligne
		for x in range(_width): # et colonne par colonne
			r, g, b = pimg.getpixel((x, y)) # on récupère les composantes RGB du pixel
			luminance = int(0.2126 * r + 0.7152 * g + 0.0722 * b)  # calcul du gris
			_img.putpixel((x, y), luminance) # on passe le pixel en gris
	print("Image convertie avec succès!")

	return _img

def filtrer_canaux(pimg):
	"""
    Description : filtre le rouge, le vert et le bleu de pimg
	Paramètres  : type(pimg) => Image.PIL
	Retour      : 3-tuple : (Image.PIL, Image.PIL, Image.PIL)
	"""
	_width, _height = pimg.width, pimg.height
	_imgred = Image.new("RGB", (_width, _height)) # création d'une image couleur "RGB" pour le rouge
	_imggreen = Image.new("RGB", (_width, _height)) # création d'une image couleur "RGB" pour le vert
	_imgblue = Image.new("RGB", (_width, _height)) # création d'une image couleur "RGB" pour le bleu

	print("Filtrage des canaux de couleurs en cours...")
	for y in range(_height):
		for x in range(_width):
			r, g, b = pimg.getpixel((x, y)) # on récupère les composantes RGB du pixel
			_imgred.putpixel((x, y), (r, 0, 0)) # filtre le rouge
			_imggreen.putpixel((x, y), (0, g, 0)) # filtre le vert
			_imgblue.putpixel((x, y), (0, 0, b)) # filtre le bleu
	print("Filtrage terminé!")

	return (_imgred, _imggreen, _imgblue)

# PROGRAMME PRINCIPAL =============================================================================
img = Image.open("perroquet.png")

img_nb = convertir_NB(img)
img_nb.save("perroquet-NB.png", "PNG") # sauvegarde au format PNG

img_gris = convertir_gris(img)
img_gris.save("perroquet-gris.png", "PNG")

img_filtrer = filtrer_canaux(img)
# filtrer_ canaux renvoit un tuple de 3 valeurs que l'on stocke dans img_filtrer
# on accède aux éléments de ce tuple au travers de la notation avec les crochets
img_filtrer[0].save("perroquet-rouge.png", "PNG")
img_filtrer[1].save("perroquet-vert.png", "PNG")
img_filtrer[2].save("perroquet-bleu.png", "PNG")