Les projets !

1. Projet:

Projet : créer un programme Python faisant intervenir les classes.

Consignes :

2. Projet sur les arbres binaires et la génération d'images:

Nous avons créer la classeArbreBinaire. Toutefois, une fois un arbre créé, il était difficile de le visualiser.

Nous allons donc créer un outil pour visualiser les arbres binaires à l'aide de la bibliothèque PIL. Le but est de créer une image au format png représentant l'arbre implémenté.

Quelques indications :

Voici un morceau de code pour vous aider à démarrer.

#Nom prenom
from PIL import Image,ImageDraw, ImageFont
img=Image.new("RGB",(800,900))
draw=ImageDraw.Draw(img)


class ArbreBinaire:
    def __init__(self,valeur):
        self.valeur=valeur
        self.gauche=None
        self.droit=None

    def ajout_gauche(self,valeur):
        self.gauche=Arbre_binaire(valeur)

    def ajout_droit(self,valeur):
        self.droit=Arbre_binaire(valeur)

    def suppr_gauche(self):
        self.gauche=None

    def suppr_droit(self):
        self.droit=None

#fond blanc
# for x in range(800):
#     for y in range(900):
#         img.putpixel((x,y),(255,255,255))

#un texte en (20,20) écrit en rouge
#font = ImageFont.truetype("arial.ttf", 30) 
#draw.text((20,20),"coucou",(255,0,0), font=font)

#une ligne :
#draw.line([(30,40),(50,60)],fill="black",width=6)

#un point :
#img.putpixel((400,450),(0,0,255))

img.show()

3. Projet API :

Nous souhaitons avoir accès à un LLM (Large Language Model) dans notre projet.

Faire tourner un LLM sur sa machine requiert une machine assez puissante pour le faire fonctionner.

En effet, des LLM performants requièrent des cartes graphiques de plusieurs milliers d'euros et plus d'une centaine de Go de mémoire vive. Des modèles plus petits peuvent tourner sur des machines plus raisonnables mais cela reste au delà de la puissance des machines du lycée.

Nous allons donc utiliser un module nommé ia.py qui utilise une API vers le site de votre professeur qui fait lui aussi appel à une API vers un LLM.

Prérequis :

Vous pouvez bien entendu regarder ce que contient le module ia.py mais vous ne le modifierez pas.

Tout votre code sera dans le second fichier que vous avez créé.

Exemples non exhaustifs des projets possibles :

Certains projets ci-dessus sont (trop?) simples. On attendra alors une interface graphique (pyxel, tkinter, flask...).

4. Projet SQL:

Le but de ce projet est d'appréhender les bases de données de la conception jusqu'à l'implémentation.

Voici les exigences :

5. Projet Message codé

Voici une première image :

Voici une deuxième image :

Il y a une différence entre ces deux images. La voyez-vous?

Un message a été caché dans la deuxième image, mais invisible pour votre oeil.

Le principe pour masquer le message a été le suivant :

  1. Un message est écrit en lettres noires ((0,0,0)) sur fond blanc ((255,255,255)) dans une image privée .
  2. On possède une image publique plus grande en largeur et en hauteur par exemple: original.jpeg
  3. On créé une nouvelle image (pour le moment vide) de mêmes dimensions que l'image publique.
  4. Pour chaque pixel aux coordonnées (x,y) de la nouvelle image , on récupère le tuple (r,g,b) de l'image publique aux coordonnées (x,y) puis :

    1. les valeurs r et g de la nouvelle image sont identiques
    2. Pour la valeur du bleu b:
      1. D'abord, si b est impair, on lui enlève 1. Ainsi la valeur de b est paire à cette étape.

      2. On ajoute 1 à b s'il existe un pixel blanc à ces coordonnées de l'image privée ou si ce pixel est en dehors de l'image privée.

Quelques lignes de codes pour vous aider :

# importation des bibliothèques nécessaires :
from PIL import Image
from PIL import ImageDraw
import os

repertoire_actuel="U:\\" #à modifier
# Se déplacer dans le répertoire du fichier actuel
os.chdir(repertoire_actuel)

#Pour ouvrir une image : 
#nom_de_variable_image=Image.open(nom_du_fichier_de_type_str)

#Pour créer une nouvelle image : 
#nom_de_variable_image=Image.new("RGB",(largeur,hauteur))

#Pour connaitre la taille d'une image : 
#largeur,hauteur = nom_de_variable_image.size

'''
for x in range(largeur):
    for y in range(hauteur):
        r,g,b=nom_de_variable_image.getpixel((x,y))[:3] # connaitre les pixels r,g,b

        nom_de_variable_image.putpixel((x,y),(r,g,b)) #mettre un pixel d'une certaine couleur
'''

#pour faire apparaitre une image : 
#nom_de_variable_image.show()

#pour enregistrer une image :
#nom_de_variable_image.save(nom_du_fichier_de_type_str)    

Travail à faire :

  1. Télécharger la deuxième image puis faire apparaitre l'image privée à l'aide d'une fonction separation(fichier_entree :str,fichier_sortie :str). fichier_entree correspond au nom du fichier qu'il faut ouvrir. fichier_sortie correspond au nom du fichier que vous allez créer. Il correspond à l'image privée.

    Vous pouvez aussi tester votre code sur l'image originale, pour voir la différence.

  2. Creer une fonction cache(image_publique :str, image_privee :str, fichier_sortie :str) qui permet de cacher une image en noir et blanc dans une autre et la tester.

    Attention : le fichier de sortie doit être au format png pour ne pas avoir de compressions de l'image et modifier les valeurs des pixels.

  3. Une fois fini, approfondissement au choix :

    • Cacher trois images dans une autre à l'aide des deux autres couleurs. (facile)
    • Cacher une image en couleur dans une autre image en couleur.
    • Avec cette méthode, au lieu de cacher une image, on peut cacher un code binaire et donc un nombre ou du texte...