Python - PIL - Pixelisation

Pour pixeliser des images il existe la bibliothèque PIL pour Python.

Pour utiliser PIL dans vos scripts :

# pip install Pillow

Pixelisation d’image

Simple pixelisation

Je crois vraiment que c’est le script le plus simple de toute la Terre entière pour pixeliser des images :

#!/usr/local/bin/python3

from PIL import Image

# Open image
img = Image.open("UneImage.jpg")

# Resize smoothly down to 16x16 pixels
imgSmall = img.resize((16,16), resample=Image.Resampling.NEAREST)

# Scale back up using NEAREST to original size
result = imgSmall.resize(img.size, Image.Resampling.NEAREST)

# Save
result.save('result.png')

Il suffit de jouer avec les valeurs img.resize((X,Y) pour faire varier le taux de pixelisation.

Calcul auto en fonction de la taille de l’image

Pour un script qui calcule automatiquement le prorata de la taille des images et qui parcoure recursivement vos dossier :

import glob
from PIL import Image

# Bandeau
for My_DIR in glob.glob("dossier/*/"):

print(My_DIR)

MyImg = Image.open(My_DIR + "chat.jpg")
wB = (MyImg.width // 4)
hB = (MyImg.height // 4)
# Pixeler
imgSmallB = MyImg.resize((wB, hB), resample=Image.Resampling.NEAREST)
MyImg = imgSmallB.resize(MyImg.size, Image.Resampling.NEAREST)
MyImg.save(My_DIR + "chat-Pixel.jpg")

print("--- END ---")

Réduction à 16 couleurs

from PIL import Image
import glob
import os

DIRECTORY = "dossier/*/"

def reduce_to_16_colors(input_path, output_path):
try:
image = Image.open(input_path)
image = image.convert("P", palette=Image.ADAPTIVE, colors=16)
output_path_png = output_path.replace('.jpg', '-16colors.png')
image.save(output_path_png)
# Enregistrez également une version JPEG si nécessaire
image.convert("RGB").save(output_path)
print(f"reduce_to_16_colors : {input_path} - OK")
except Exception as e:
print(f"Erreur lors de la conversion de {input_path} : {str(e)}")

def pixelate_images():
# Bandeau
for DIR_B in glob.glob(DIRECTORY):
print(DIR_B)

imBP_path = os.path.join(DIR_B, "bandeau.jpg")
reduce_to_16_colors(imBP_path, imBP_path.replace('.jpg', '-16colors.jpg'))

imB = Image.open(imBP_path.replace('.jpg', '-16colors.jpg'))
wB = (imB.width // 10)
hB = (imB.height // 10)
# Pixeler
imgSmallB = imB.resize((wB, hB), resample=Image.Resampling.NEAREST)
imBP = imgSmallB.resize(imB.size, Image.Resampling.NEAREST)
imBP.save(os.path.join(DIR_B, "bandeau-Pixel.jpg"))
print(f"pixelate_images : {imBP} - OK")

# Thumbnail
for DIR_T in glob.glob(DIRECTORY):
print(DIR_T)

imTP_path = os.path.join(DIR_T, "thumbnail.jpg")
reduce_to_16_colors(imTP_path, imTP_path.replace('.jpg', '-16colors.jpg'))

imT = Image.open(imTP_path.replace('.jpg', '-16colors.jpg'))
wT = (imT.width // 6)
hT = (imT.height // 6)
# Pixeler
imgSmallT = imT.resize((wT, hT), resample=Image.Resampling.NEAREST)
imTP = imgSmallT.resize(imT.size, Image.Resampling.NEAREST)
imTP.save(os.path.join(DIR_T, "thumbnail-Pixel.jpg"))
print(f"pixelate_images : {imTP} - OK")

def delete_16colors_images(DIRECTORY):
pattern = os.path.join(DIRECTORY, "*-16colors*")
for file_path in glob.glob(pattern):
try:
os.remove(file_path)
print(f"Image supprimée : {file_path}")
except Exception as e:
print(f"Erreur lors de la suppression de {file_path} : {str(e)}")

if __name__ == "__main__":
pixelate_images()
delete_16colors_images(DIRECTORY)

print("--- END ---")

Ajout d’un effet de calque

Pour un script qui applique du gris et un calque avec l’effet couleur verte :

@SOON

Exemple


Documentation

https://stackoverflow.com/questions/47143332/how-to-pixelate-a-square-image-to-256-big-pixels-with-python
https://pillow.readthedocs.io/en/stable/
https://pillow.readthedocs.io/en/stable/reference/Image.html
https://neptune.ai/blog/pil-image-tutorial-for-machine-learning

> Partager <