diff --git a/Grille.php b/Grille.php
index 8177883..846fe71 100644
--- a/Grille.php
+++ b/Grille.php
@@ -174,22 +174,26 @@ class Grille implements ArrayAccess
 
     public function save($id)
     {
-        session_id($id);
+        if (session_status() === PHP_SESSION_ACTIVE) {
+            session_write_close();
+        }
+
+        session_id("$this->largeur,$this->hauteur,$id");
         session_start(["use_cookies" => false]);
 
-        $_SESSION["$this->largeur,$this->hauteur"] = (string)$this;
+        $_SESSION["grille"] = (string)$this;
     }
 
     public function load($id)
     {
-        session_id($id);
+        session_id("$this->largeur,$this->hauteur,$id");
         session_start(["use_cookies" => false]);
 
-        if (!isset($_SESSION["$this->largeur,$this->hauteur"])) {
+        if (!isset($_SESSION["grille"])) {
             return false;
         }
 
-        foreach (explode(PHP_EOL, $_SESSION["$this->largeur,$this->hauteur"]) as $y => $ligne) {
+        foreach (explode(PHP_EOL, $_SESSION["grille"]) as $y => $ligne) {
             foreach (str_split($ligne) as $x => $lettre) {
                 $this->grille[$y][$x] = $lettre;
             }
diff --git a/Trie.php b/Trie.php
index 42ee6f8..aa424d0 100644
--- a/Trie.php
+++ b/Trie.php
@@ -6,8 +6,8 @@ class Trie implements ArrayAccess, IteratorAggregate, Countable {
     private $nb_branches = 0;
 
     public function arraySet($cles, $valeur) {
-        $this->nb_branches++;
         $cle = $cles[0];
+        $this->nb_branches++;
         $cles = array_slice($cles, 1);
         if ($cles == []) {
             $this->branches[$cle] = $valeur;
diff --git a/index.php b/index.php
index 7556a4d..043a69d 100644
--- a/index.php
+++ b/index.php
@@ -29,7 +29,10 @@ $largeur = filter_input(INPUT_GET, 'colonnes', FILTER_VALIDATE_INT, [
 $grille_valide = false;
 $grille = new Grille($hauteur, $largeur);
 $basedir = $_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"].dirname($_SERVER["DOCUMENT_URI"]);
-if (!isset($_GET["grille"]) || $_GET["grille"] == "") {
+
+if (isset($_GET["grille"]) || $_GET["grille"] == "") {
+    $id = htmlspecialchars($_GET["grille"]);
+} else {
     do {
         $id = uniqid();
     } while (!$grille->genere($id));
@@ -56,16 +59,14 @@ if (!isset($_GET["grille"]) || $_GET["grille"] == "") {
     <meta property="og:title" content="🄼🄾🅃🅂▣🄲🅁🄾🄸🅂🄴🅂"/>
     <meta property="og:type" content="game"/>
     <meta property="og:url" content="<?=$basedir?>"/>
-    <meta property="og:image" content="<?=$basedir?>/thumbnail.png"/>
-    <meta property="og:image:width" content="192"/>
-    <meta property="og:image:height" content="192"/>
+    <meta property="og:image" content="<?=$basedir?>/thumbnail.php?grille=<?=$id?>&lignes=<?=$hauteur?>&colonnes=<?=$largeur?>&largeur=1200&hauteur=630"/>
+    <meta property="og:image:width" content="1200"/>
+    <meta property="og:image:height" content="630"/>
     <meta property="og:locale" content="fr_FR"/>
     <meta property="og:site_name" content="<?=$_SERVER["HTTP_HOST"]?>"/>
 </head>
 
 <?php
-$id = htmlspecialchars($_GET["grille"]);
-
 $grille_valide = $grille_valide || $grille->load($id) || $grille->genere($id);
 
 mt_srand(crc32($id));
diff --git a/style.css b/style.css
index e2c299a..a474a66 100644
--- a/style.css
+++ b/style.css
@@ -108,6 +108,7 @@ h2 {
 }
 
 .grille input[disabled] {
+  color: black;
   background-color: black;
 }
 
diff --git a/thumbnail.php b/thumbnail.php
new file mode 100644
index 0000000..8a4d928
--- /dev/null
+++ b/thumbnail.php
@@ -0,0 +1,63 @@
+<?php
+
+// Paramètres de largeur, hauteur, lignes et colonnes
+$largeur  = isset($_GET['largeur']) ? (int)$_GET['largeur'] : 200;  // Valeur par défaut : 200
+$hauteur  = isset($_GET['hauteur']) ? (int)$_GET['hauteur'] : 200;  // Valeur par défaut : 200
+$lignes   = isset($_GET['lignes']) ? (int)$_GET['lignes'] : 8;      // Valeur par défaut : 4
+$colonnes = isset($_GET['colonnes']) ? (int)$_GET['colonnes'] : 8;  // Valeur par défaut : 4
+$bordure  = 6;
+
+// Créer une image vide
+$image = imagecreate($largeur, $hauteur);
+
+// Couleurs
+$blanc = imagecolorallocate($image, 255, 255, 255);
+$noir  = imagecolorallocate($image, 0, 0, 0);
+
+// Remplir l'image avec un fond blanc
+imagefill($image, 0, 0, $blanc);
+
+// Calculer la taille et la position des cases
+$cote   = (int)min(($largeur - 2 * $bordure) / $colonnes, ($hauteur - 2 * $bordure) / $lignes);
+$haut   = (int)(($hauteur - $lignes * $cote - 2 * $bordure) / 2) + $bordure;
+$gauche = (int)(($largeur - $colonnes * $cote - 2 * $bordure) / 2) + $bordure;
+$bas    = $haut + $lignes * $cote;
+$droite = $gauche + $colonnes * $cote;
+
+// Dessiner les bordures extérieures (3 pixels d'épaisseur)
+imagesetthickness($image, $bordure);
+imagerectangle($image, $gauche, $haut, $droite, $bas, $noir);
+
+// Dessiner les lignes et colonnes internes (1 pixel d'épaisseur)
+imagesetthickness($image, 2);
+for ($x = $gauche; $x <= $droite; $x += $cote) {
+    imageline($image, $x, $haut, $x, $bas, $noir); // Lignes verticales
+}
+for ($y = $haut; $y <= $bas; $y += $cote) {
+    imageline($image, $gauche, $y, $droite, $y, $noir); // Lignes horizontales
+}
+
+// Noicir les cases
+if (isset($_GET["grille"])) {
+    include_once "Grille.php";
+
+    $grille = new Grille($lignes, $colonnes);
+    $id = htmlspecialchars($_GET["grille"]);
+    $grille->load($id) || $grille->genere($id);
+
+    for ($y = 0; $y < $lignes; $y++) {
+        for ($x = 0; $x < $colonnes; $x++) {
+            if ($grille[$y][$x] == CASE_NOIRE) {
+                imagefilledrectangle($image, $gauche + $x * $cote, $haut + $y * $cote, $gauche + ($x + 1) * $cote, $haut + ($y + 1) * $cote, $noir);
+            }
+        }
+    }
+}
+
+// Envoyer l'image au navigateur
+header('Content-Type: image/png');
+imagepng($image);
+
+// Libérer la mémoire
+imagedestroy($image);
+?>
\ No newline at end of file