Concepteur de Mozaïques

 

Introduction

Ce programme est mon tout premier programme Allegro. Un ami faisait un jeu et avait besoin de faire un programme pour transformer des fonds d'écran en mozaïques. Une telle opération est assez simple finalement. Elle revient à isoler dans une image donnée les plus petites parties qui se répètent.

 

Fonctionnement

Un exemple fixera les idées :

Il s'agit d'une photo d'écran d'un jeu de la console Sega Megadrive : Shining Force 2 (prise avec l'émulateur Kgen98). Cette image est constituée de plusieurs carrés de 8 pixels de coté (une mozaïque). Voici la même image, mais agrandie 2 fois et avec un quadrillage noir, pour bien voir l'effet de mozaïques :

Cette image, on peut s'amuser à compter pour vérifier, est composée de 31 mozaïques horizontales, et de 28 mozaïques verticales (si on fixe la taille d'une mozaïque à 8 par 8 pixels bien entendu).

Que fait donc mon programme ? Il analyse cette image, en isole les mozaïques de base, et crée deux fichiers. L'un est une image qui ne comporte que ces mozaïques uniques, et l'autre est un fichier binaire, qui est un tableau d'indices permettant de reconstituer l'image originale.

Fichier des mozaïques
Le même, agrandie 3 fois et quadrillé
pour mieux se rendre compte

 

Extrait du fichier des indices
 31
 12  11   6   5  10   9   [...]
21 20 18 17 19 9 [...]
32 31 0 30 27 29 [...]

Ce fichier est une simple suite de nombre, de 2 octets chacun. Le premier est le nombre de mozaïques horizontales composant l'image source, ici 31 donc. Viennent ensuite les mozaïques, dans le sens normal de lecture, c'est à dire de gauche à droite et de haut en bas. Ces indices se réfèrent au fichier 1. Attention, la première mozaïques dans ce fichier est à l'indice 0 et non 1. Dans cet exemple donc, la première ligne de mozaïques va de l'indice 0 à 11, la deuxième de 12 à 23, etc ... :

Prenons la 1ère série de nombre du fichier 2 (12, 11, 6, 5, 10 et 9). Ce sont les indices des 6 premières mozaïques du fichier 1. A l'aide du tableau ci-dessus, on peut facilement repérer la correspondance entre l'indice et l'image :

  • Indice 12 = mozaique
  • Indice 11 = mozaique
  • Indice  6 = mozaique
  • Indice  5 = mozaique
  • Indice 10 = mozaique
  • Indice  9 = mozaique

Si on met ces images à la suite on obtient : , ce qui est bien le début de l'image source.

 

Utilisation

Ce programme utilise la ligne de commande pour ses paramètres. Si on le lance sans paramètres on obtient un texte d'aide (en français) que je ne reproduirais pas ici.

Quand vous lui indiquez une image (format : BMP, LBM, PCX ou TGA), il la traite de façon standard, c'est à dire que le fichier 1 (les mozaïques) aura par défaut 20 mozaïques horizontales, et autant qu'il le faut dans le sens de la hauteur.

Vous pouvez fixer ce nombre de mozaïques à une valeur quelconque en le passant en ligne de commande.

Par défaut le programme analyse l'image source dans le sens normal de lecture, mais vous pouvez le forcer à analyser de droite à gauche avec le paramètre -r (comme Reverse en anglais) : cela vous permet de distinguer les mozaïques beaucoup plus facilement dans le fichier 1.

A l'exécution, le programme fournit diverses infos. Voici ce que j'obtient en utilisant l'image de l'exemple :

Image source :
   § Dimensions : 248 * 224 = 55552 pixels
   § NB blocs   : 31 * 28 = 868 mozaïques
   § Taille     : 54 Ko
Sens d'analyse : Envers
Analyse en cours...
Temps nécessaire : Moins d'une seconde
139 mozaïques trouvées
Image finale :
   § Dimensions : 96 * 96 = 9216 pixels
   § NB blocs   : 12 * 12 = 144 mozaïques
   § Taille     : 36 Ko
Emplacements de mozaïques inutilisés : 5
CODAGE.BIN : 1738 octets (2 Ko)
Nb de mozaïques en longueur optimum : 139
Pour obtenir à peu près un carré    : 12

Assez verbeux donc, mais il donne tout ce dont j'avais besoin.

En ce qui concerne la taille des mozaïques, elle est fixée à 8 pixels de coté. Mais en éditant le code source et en le recompilant, il est très facile d'obtenir une valeur qui convient à vos besoin, puisqu'il suffit juste de changer la valeur d'une directive #define.

 

Télécharger

Enfin, pour terminer, voici l'archive zip (222 ko) qui contient l'exécutable, le source, et les fichiers de l'exemple. Lancez juste le fichier go.bat pour obtenir exactement les fichiers résultats de l'exemple.