MinitelSwiftel photoMinitel

Page projet T.I.P.E 1997 : le vidéotex


Projet T.I.P.E 1997
Informatique
"Image et géométrie"
 Présentation du Vidéotex (aspect graphique)

Avertissement: Ce fichier est une conversion du projet original au format HTML. Des imperfections sont visibles, ainsi que des imperfections de mise en page.

Un T.I.P.E est un (petit) projet présenté aux concours. Il ne s'agit pas d'une thèse ou d'un projet de recherche, mais simplement d'une présentation d'un domaine choisi (sur un thème donné à l'avance). Le thème étant "image & géométrie", et l'auteur ayant réalisé Sweetel, Swiftel Photo et d'autres programmes télématiques, l'idée évidente était donc de présenter le vidéotex, thème récurrent pour tous ces programmes...

Contacter l'auteur


Génération d’images par le langage du Minitel,

Le Vidéotex

Image d'un Minitel 2Etude du langage vidéotex, de ses différentes composantes, ses possibilités et son utilisation concrète. Commandes vidéotex, attributs, utilisation des zones et délimiteurs, efficacité du vidéotex, évolutions... mais aussi algorithmes de codage d'images, d'optimisation…

 

Le Minitel est aujourd’hui utilisé couramment par des millions de Français qui s’en servent pour consulter l’annuaire électronique ou pour accéder à de nombreux services d’information et commerciaux.

Disposant d’un clavier, d’un modem et d’un écran, il comporte également une mémoire écran et un logiciel de décodage lui permettant de transformer les informations en provenance du modem (par le biais des lignes téléphoniques) en images. Cet appareil permet l’affichage d’images en tenant compte des contraintes de la consultation en temps réel .

 

Nous allons nous intéresser plus particulièrement à la manière de coder ces images par le biais du vidéotex, le langage du Minitel .

 

 

 

L’écran d’un Minitel est essentiellement composé d’une matrice de caractères de 40 caractères de large sur 25 de hauteur, qui peuvent être aussi bien des caractères de texte mais aussi des caractères graphiques permettant facilement l’affichage d’images. La première ligne n’est jamais utilisée directement, elle joue le rôle de ligne d’état, affichant le prix de la communication par exemple. Chaque caractère dispose d’un certain nombre d’attributs, qui sont la couleur d’écriture et de fond (8 couleurs sont disponibles sur un Minitel), les attributs visuels tels l’inversion vidéo, le clignotement, et pour le mode texte le soulignage, et la taille d’affichage (normale, double largeur, double hauteur ou les deux réunis) . Les caractères graphiques, nous y reviendrons, sont composés d’une matrice de 2 points de largeur sur 3 points de hauteur, représentant donc 64 caractères différents. Ils peuvent être considérés comme les morceaux d’une image qui seront collés les uns contre les autres pour la constituer.

 

Certains attributs, tels la couleur d’écriture, le clignotement et l’inversion vidéo, sont définis individuellement pour chaque caractère. Ainsi il est possible de modifier la couleur d’écriture séparément pour tout caractère. D’autres attributs se définissent par zones (Voir zones vidéotex) tels la couleur de fond ou le soulignage.

 

 

 

Les données reçues sont interprétées en temps réel, modifient la mémoire écran qui est lue 50 fois par seconde pour être affichée. Le décodage s’effectue en temps réel, à une position de l’écran repérée par un curseur (qui peut être visible et clignotant). Par exemple, l'affichage de texte standard "Bienvenue" se fera par l'envoi des 9 caractères ascii constituant Bienvenue. Le décodeur inscrira alors ces caractères dans la mémoire écran à la position courante du curseur de texte au fur et à mesure de leur réception: l'écran affichera tout d'abord un B, puis un i, etc. à raison de 120 caractères par seconde, le curseur se déplaçant bien sûr au fur et à mesure vers la droite. Ce petit texte sera donc affiché en 7.5 centième de seconde. Tout ce qui se trouvait sous le curseur est au fur et à mesure effacé, si bien que l’aspect d’une page peut varier au cours du temps, pendant que celle-ci s’affiche et que les nouveaux caractères recouvrent les éventuels précédents caractères.

 

Mais de nombreuses commandes constituent le vidéotex, qui ne se limite donc pas à un simple affichage de texte : graphisme et effets visuels permettent de créer facilement des pages attrayantes. Il diffère donc largement de l’affichage classique sur les anciens micro-ordinateurs, qui se limitent à quelques commandes graphiques bien définies.

 

 

 

Les commandes vidéotex

 

Les données envoyé vers le décodeur via le modem sont codées par 7 bits ; c’est à dire que chaque caractère reçu peut avoir un code ascii variant de 0 à 127 : les codes 32 à 127 sont des caractères courants, tels les lettres ou les chiffres (le caractère 65 est un A majuscule) codées selon le code ascii commun à toute l’informatique. Les codes de valeur inférieur à 31 sont des codes de contrôle ; qui permettent de coder les commandes du vidéotex. Certaines d’entre elles, par exemple les codes CR et LF (ascii 13 et 10) se retrouvent sur tout terminal et dans l’informatique en général. Le code ascii 27 quand à lui, nommé ESC (caractère d’échappement) introduit une séquence de lettres ou de signes (ascii>32) qui sont régies par le langage vidéotex. Les communications par lignes téléphonique ou numériques se font généralement sur 8 bits, qui est devenu aujourd’hui le standard. Le standard V23, choisi pour le Minitel, n’est donc utilisé couramment que par ce dernier.

 

Ces commandes permettent le changement de couleur d’écriture par exemple, ou bien le changement d’inversion vidéo. Ce changement est valide pour tous les caractères qui seront inscrits à la suite de la commande. Une fois la couleur d’écriture changée en bleu, tous les caractères qui suivront seront affichés en bleu. Le curseur " transporte " donc les attributs qui seront définis individuellement . Ce n’est néanmoins pas le cas pour les attributs définis par zone (changement de couleur de fond..) : lors du changement d’un tel attribut, c’est le caractère qui suit la commande qui hérite de l’attribut. Les caractères écrits à la suite hériteront cependant de cet attribut, mais pas par le curseur : une zone vidéotex ayant été construite, tout élément de cette zone aura les attributs de zone identiques.

 

 

Les différents types d’attributs vidéotex

 

La mémoire de page du Minitel est limitée à 16 bits par caractères soit, avec 25 lignes et 40 colonnes, un total de 2Kilos-octets. Cette taille peut aujourd’hui paraître ridicule, néanmoins il y a encore quelques années, elle était encore assez coûteuse et paraissait suffisante. Ces 2 octets sont organisés ainsi : un octet est réservé au code du caractère affiché (qu’il soit graphique ou en mode texte) ; bien que le Minitel n’accepte que des liaisons 7 bits, certains caractères supplémentaires ont été prévus (accents, notamment).

Les 8 autres bits sont organisés pour pouvoir regrouper les attributs suivants : (les attributs marqués en italique sont des attributs de zone, qui seront étudiés plus loin)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Dans le cas des caractères semi – graphiques, le codage utilise deux bits supplémentaire. Ceux-ci proviennent du fait que ces mosaïques sont codées sur 6 bits, au contraire des caractères de texte qui, eux, sont codés sur 8 bits (ASCII). 2 bits peuvent donc être utilisés pour le codage des attributs.

 

 

Qu’est-ce qu’une zone vidéotex ?

 

Une zone vidéotex est un ensemble contigu de caractères d’une même ligne commençant par un délimiteur et finissant soit par un délimiteur soit par la fin de la ligne. Pour construire de telles zones, on inscrit des délimiteurs aux positions voulues.

 

Exemple : les X représentent un délimiteur, les points des caractères quelconques

 

......X..........X.....................X...........

 

3 zones ont été ainsi définies : deux encadrées par des délimiteurs, et une par un seul délimiteur et la fin de la ligne. Attention ! L’espace compris entre le début de la ligne et le premier délimiteur n’est pas une zone vidéotex car il ne débute pas par un délimiteur !

 

 

Les délimiteurs de zone vidéotex

 

Un délimiteur est un caractère utilisé pour encadrer une zone vidéotex. Il peut être de deux types : un caractère espace (ascii 32) identifié par un attribut interne de délimiteur (qui aura été commandé par une séquence ESC de changement d’attribut de zone, comme par exemple le changement de couleur de fond, ou bien le soulignage etc.) ou bien tout caractère graphique. Ainsi seul l’espace en mode texte peut être un délimiteur si son attribut de délimitage a été activé ; mais tous les caractères graphiques font office de délimiteur. Un délimiteur impose ses attributs de zone à la zone qui le suit. Un caractère à l’intérieur d’une zone aura donc sa couleur de fond et ses autres attributs de zone imposée par le délimiteur de début de zone. Enfin, il faut noter que l’aspect d’un caractère délimitant ne diffère pas des autres caractères : l’attribut " délimiteur " est invisible.

 

Pour créer un délimiteur, il y a deux possibilités :

 

Passage en mode d’écriture graphique si ce mode n’est pas déjà activé ; puis inscription d’un caractère quelconque (qui aura donc l’attribut graphique activé, et qui sera donc considéré comme un délimiteur par le vidéotex)

 

2 ° Ecriture d’un espace délimitant : il faut pour cela changer d’attribut de zone (par exemple changer de couleur de fond ou bien de type de soulignage) puis inscrire un espace (ascii 32). Plusieurs attributs peuvent être modifiés en même temps en employant plusieurs commandes de changement d’attribut de zone à la suite. L’espace généré gardera la trace de ces modifications. Il aura alors l’attribut de délimiteur activé, en plus des attributs de zone. Seul le caractère espace peut être délimiteur en mode texte. Si un autre caractère est inscrit à la suite d’une commande de changement d’attribut de zone, l’inscription du délimiteur est reportée pour le caractère suivant, et ainsi de suite jusqu'à ce qu’un espace puisse déclencher la commande. Le raison de cette particularité, définie dans le standard vidéotex, est liée au gain de mémoire réalisé, qui à l’époque de la création du Minitel était crucial : le caractère d’espacement n’a pas besoin de tous les attributs qu’ont les autres caractères, par exemple il ne clignote pas car sa matrice (son dessin) est vide. Le gain est donc de 1 bit réservé dans la mémoire de page du Minitel, qui est de 16 bits par caractères. [Nota : un caractère clignotant a sa matrice qui alterne entre une matrice vide et sa propre matrice]

 

Une zone vidéotex est créée par l’écriture de délimiteurs aux positions voulues. Par exemple, pour obtenir une zone vidéotex au milieu de l’écran d’une largeur de 20 caractères, on se positionnera en ligne 12 colonne 10, on changera de mode d’écriture de fond, on inscrira un espace (un délimiteur sera ainsi déclaré) puis on écrira le message contenu dans cette zone. Cette dernière sera terminée par un délimiteur.

 

 

Utilisation des zones et des délimiteurs

 

Les zones vidéotex sont très utiles car elles ont leur couleur de fond, le soulignage, défini par le premier caractère de la zone. Si l’on modifie un de ces attributs, alors c’est toute la zone qui sera modifiée.

 

Lorsque l’écran est vide (ou qu’il a été effacé par la commande d’effacement de l’écran FF, ascii 12), ce sont en fait 1000 caractères graphiques invisibles (noirs) qui sont disposés sur chaque emplacement. (l’écran d’un minitel est en standard noir avec une couleur d’écriture blanche) Il y a donc 1000 délimiteurs à l’écran puisque chaque caractère graphique est un délimiteur ! Cette particularité n’est pas gênante, au contraire : si l’on déclare un nouveau délimiteur ayant un fond jaune, et qu’on inscrit quelques caractères juste après, nous aurons créé une zone ayant un fond jaune et terminée par l’un des délimiteurs d’origine. Si ils n’avaient pas été inscrits, la zone aurait continué jusqu’en fin de ligne, et pour l ‘éviter l’écriture d’un second délimiteur en fin de zone aurait été nécessaire. On économise donc bien souvent du temps grâce à cette particularité. Un autre aspect, esthétique, est aussi à considérer : sans les délimiteurs d’origine, qui " stoppent " les zones, le positionnement des délimiteurs ferait sans cesse apparaître des clignotements désagréables à l’écran (une ligne commencant par un délimiteur serait en effet colorée en totalité, puis le délimiteur de fin de ligne changerait alors de couleur du reste de la ligne etc.)

 

 

Les commandes du vidéotex

 

Les commandes peuvent être séparées en plusieurs catégories : les commandes qui agissent sur la position du curseur, les commandes qui modifient les attributs actuel d’affichage, et les commandes qui sont utilisées pour d’autres fonctions (effacement de l’écran, par exemple)

 

Caractère                 Commande

 

Commandes de déplacement du curseur sur l’écran de travail. Elles permettent de positionner librement le texte ou le graphisme à des endroits bien précis.

 

8 Déplace le curseur vers la gauche ; si le curseur était sur la colonne 1 alors il recule d’une ligne et se place en colonne 40

 

9 Déplace le curseur vers la droite ; de même que pour la commande ascii 8, si le curseur était sur la dernière colonne, alors il repasse sur la première colonne de la ligne suivante

 

10 Avance le curseur d’une ligne ; si il était sur la dernière ligne alors il repasse sur la première ligne de l’écran

 

11 Recule le curseur d’une ligne

 

13 Place le curseur au début de la ligne courante

 

31 , p1 , p2 Positionne le curseur sur la colonne p2-64 et sur la ligne p1-64. Contrairement aux autres commandes de positionnement, les attributs de caractère (couleur de texte, clignotement, inversion) transportés par le curseur sont remis dans l’état initial standard : couleur de texte blanche, pas d’effets.

 

 

Commandes de changement d’attributs ; qu’ils soient valables pour chaque caractère, ou définis par zones.

 14 Mode graphique activé à partir de cette commande, et ce jusqu’au passage en mode texte, ou bien lors d’un effacement d’écran, ou de déplacement du curseur par la commande 31

15 Mode texte activé (désactive le mode graphique) ; c’est le mode standard

 

27 , p1 avec p1 Î { ‘@’ ,‘D’,’A’,’E’,’B’,’F’,’C’,’G’} Attribut couleur d’écriture respectivement en Noir, Bleu, Rouge, Magenta, Vert, Cyan, Jaune, Blanc.

27 , p1 avec p1 Î {‘P’,’T’,’Q’,’U’,’R’,’V’,’S’,’W’} Attribut couleur de fond respectivement en Noir, Bleu, Rouge, Magenta, Vert, Cyan, Jaune, Blanc

27 , p1 avec p1 Î {‘H’,’I’} Active (‘H’) ou désactive (‘I’) le clignotement

 

27 , p1 avec p1 Î {‘\’,’]’} Active (‘\’) ou désactive (‘]’) l’inversion vidéo

 

 

27 , p1 avec p1 Î {‘L’,’M’,’N’,’O’} Attribut taille de texte respectivement normale, double largeur, double hauteur, double taille

27 , p1 avec p1 Î {‘Z’,’Y’} Soulignage activé ou désactivé

 

 

Autres commandes vidéotex

12 Efface l’écran, qui se recouvre uniformément de caractères graphiques noirs, et donne aux attributs du curseur leurs valeurs par défaut

18 , p1 avec p1 Î [|64,127|] Répète p1-64 fois le dernier caractère affiché à l’écran. Cette commande revient à envoyer p1-64 fois le dernier caractère affiché. Cette commande permet d’effectuer des optimisations au sein d’une page : au lieu d’afficher 30 caractères identiques à la suite en envoyant les 30 caractères, il suffit de l’envoyer une seule fois et de demander la répétition de ce caractères 29 fois.

24 Détruit tous les délimiteurs placés après le curseur et sur la même ligne.

 

Ce sont les principales commandes vidéotex ; il en existe néanmoins des dizaine d’autres mais qui entrent en jeu indirectement.

 

 

En pratique : Action sur les zones vidéotex par les délimiteurs

 

Considérons l’écran initial d’un Minitel, rempli de caractères graphiques noirs (l’écran est uniformément noir) ; ici est représentée une partie de l’écran du Minitel (un morceau en haut à gauche)

§*********

**********

**********

**********

ÿ Les * représentent les caractères (invisibles) noirs au début d’une page vidéotex

Le curseur § indique la position d’écriture

Envoyons quelques lettres, abcde, puis un changement de couleur de fond en couleur cyan, ESC,V , un espace puis enfin les lettres fghij ; on aperçoit à l’écran :

 
abcde fghij              

En fait, nous devons représenter cela ainsi :

 
abcde*fghij******

*****************

*****************

 

Ce qui était inscrit sous le curseur a été remplacé par le texte que nous avons envoyé : des caractères graphiques ont été écrasés par le texte abcde fghij.

Le * précédent le f est le délimiteur introduit par le caractère espace qui a suivi le changement de couleur de fond (ESC V). Les autres délimiteurs sont les mêmes que précédemment ; il faut noter que seul les lettres fghij voient leur fond coloré en cyan (même couleur que le délimiteur de début de zone) car un délimiteur d’origine stoppe la zone vidéotex juste après le j.

 

Inscrivons une seconde zone vidéotex : changement de couleur de fond en vert, espace, et quelques lettres (klmn)

 

Nous obtenons  à l’écran :

 
abcde fghij klmn

représentable par:

abcde*fghij*klmn

 

Premier exemple : fusion de deux zones vidéotex

 

Plaçons le curseur sur le deuxième délimiteur (après le j, sur l’espace) puis inscrivons un caractère quelconque (qui peut aussi bien être un espace) : nous avons écrasé le délimiteur qui s’y trouvait. Le vidéotex nous dit alors qu’une seule zone est présente : elle va du premier délimiteur à la lettre n - et donc toute cette zone doit prendre la couleur de fond du premier délimiteur : tous les caractères qui étaient auparavant vert deviennent cyan.

 

à l’écran :

 
abcde fghij klmn

représentable par :

abcde*fghij klmn

 

Deuxième exemple : destruction d’une zone vidéotex

 

Plaçons le curseur sur le premier délimiteur (après le e, sur l’espace) et inscrivons y un caractère quelconque : le délimiteur qui s’y trouvait a été écrasé. La zone auparavant encadrée par le 1er et le 2nd délimiteur a donc été détruite ; les attbibuts de zone ont donc également été détruits. Le texte inclus dans l’ancienne zone perd donc sa couleur de fond. (l’autre zone n’a pas été affectée)

 

à l’écran :

abcde fghij klmn

 représentable par :

abcde fghij*klmn

 

 

Efficacité du vidéotex

 

Par des actions de fusion, de création ou de destruction de zone il devient possible en quelques commandes de modifier subitement l’aspect de l’écran : une ligne peut voir sa couleur de fond changer en moins de 3 centièmes de seconde (changement de couleur de fond, puis espace : 3 octets à 120car/seconde), des portions d’écran peuvent ainsi changer de manière très rapide, avec un minimum d’octets (et donc de temps) : les conséquences de certaines commandes vidéotex sur la mémoire écran sont très importantes. C’est là l’un des atouts du vidéotex : rendre possible l’affichage de pages de façon rapide par l’utilisation de commandes optimisées pour les besoins du Minitel.

 

D’autres commandes sont aussi importantes pour la même raison : la commande de répétition, ascii 18, notamment, joue un rôle prépondérant dans l’optimisation d’une page. Son utilisation est d’ailleurs abondante sur la totalité des serveurs, qui disposent de logiciels de composition de pages remplacant automatiquement toute répétition par la commande adéquate. Elle peut, en 2 octets (ascii 18 et le paramètre) modifier jusqu'à 63 des caractères qui suivent le curseur (63 emplacements dans la mémoire écran seront alors modifiés). Cette limitation n’est pas très gênante : il suffit de placer plusieurs de ces commandes à la suite. Par exemple, si nous désirons remplir les 4 lignes suivantes de points " . " il suffit d’envoyer une seule fois le caractère " . " puis 3 commandes de répétition : deux de longueur 63, et la dernière de 34.

 

Un dernier exemple nous montre l’intérêt de telles commandes : remplissons l’écran uniformément en bleu. Pour cela, effacons tout d’abord l’écran (ascii 12). Puis, sur chaque ligne, le curseur étant sur la première colonne, nous allons effacer tous les délimiteurs introduits pas l’effacement de l’écran : ascii 24 ; puis en créerons un : changement de couleur de fond en bleu (ESC T), caractère espace (ascii 32). Le délimiteur ainsi créé, placé au début de la ligne, influencera en totalité cette dernière : la ligne se colorera en bleu (couleur du délimiteur). Il ne restera plus qu’à passer au début de la ligne suivante : CR , LF (ascii 13 , ascii 10). Donc, pour chaque ligne, il faudra 6 octets, et donc 144 octets pour remplir l’écran tout entier (24 lignes utiles) : cela sera réalisé en un peu plus d’une seconde. S’il avait fallu remplir " manuellement " cette page, en inscrivant des caractères de fond bleu pour chaque emplacement, le temps mis aurait été dix fois supérieur.

 

 

Génération de graphiques

 

Il est possible d’afficher des dessins, grâce aux caractères graphiques du vidéotex . Ce dernier comporte 64 caractères au total, permettant de représenter toute matrice de 2 points de largeur sur 3 points de hauteur. Si un caractère seul n’est pas suffisant pour afficher des graphismes, la concaténation de plusieurs de ces caractères permet de créer facilement tout types d’images. Ici aussi, les optimisations tels la répétition des caractères, est possible .

 

Le codage de ces caractères est réalisé suivant un repérage par puissances de 2 : le premier point de la matrice d’un caractère graphique représente 2^0=1 ; le second 2^1=2 etc.. jusqu’à l’avant dernier, 2^4=16, et le dernier, le 6è point, qui représente 2^6=64. Pour chaque point activé, on additionne sa valeur, puis on ajoute finalement 32 au nombre obtenu pour obtenir un caractère de code supérieur à 32. Ainsi les caractères graphiques vont de l’ascii 32 (qui représente une matrice vide de points, et qui donc est identique visuellement à un caractère de texte espace) à l’ascii 2^0+2^1+..2^4+2^6+32=127 (qui représente une matrice pleine). Une fois en mode graphique (attribut mode graphique activé) l’envoi de ces codes permettra d’afficher les mosaïques correspondantes.

 

 2^0 

2^1
2^2 2^3
2^4 2^6

Caractère graphique du Minitel

 

 

Algorithmes de codage d’images

 

Ce premier algorithme permet de coder une image informatique monochrome en une suite de séquences vidéotex qui, en mode graphique, permettra l’affichage de l’image désirée.

 

L’image est stockée sous forme de tableau dans " Image ". Son type importe peu (il devrait être booléen) , ainsi que ses dimensions ; on considérera que l’image codée commence en haut à gauche, et a une largeur et une hauteur de L et H.

 

Nous devons également savoir où cette image doit s’afficher à l’écran du Minitel. Ces coordonnées Xm et Ym sont donc également requises ; Xm Î [| 0,39 |] et Ym Î [| 0, 24 |]

 

 

Note : Les textes encadrés par des /* */ sont des commentaires

 

C <- " "

Pour y allant de 0 à H/3

  C <- C+chr(31)+chr(64+Ym)+chr(65+Xm) /* Positionnement du curseur */

  C <- C+chr(14) /* Passage en mode graphique */

    Pour x allant de 0 à L/2

    N <- 32

    Si Image[y*3,x*2] ¹ 0 alors n <- n+1

    Si Image[y*3,x*2+1] ¹ 0 alors n <- n+2

    Si Image[y*3+1,x*2] ¹ 0 alors n <- n+4

    Si Image[y*3+1,x*2+1] ¹ 0 alors n <- n+8

    Si Image[y*3+2,x*2] ¹ 0 alors n <- n+16

    Si Image[y*3+2,x*2+1] ¹ 0 alors n <- n+64

    C <- C + chr(n)

  Fin de boucle

Fin de boucle

 

 

 

Algorithme de codage en couleurs

 

Les images codées sont monochromes, alors que le Minitel peut afficher 8 couleurs. La méthode pour gérer des images en couleurs est un peu plus complexe, car chaque caractère mosaïque, s’il peut avoir sa couleur de texte et de fond qui lui sont propres, ne peut néanmoins voir sa matrice disposer de plusieurs couleurs. Ainsi, chaque groupe de mosaïques 2*3 n’a que 2 couleurs possibles sur les 8. Il faut donc choisir quelles seront les deux couleurs qui devront être fixées, pour assurer un résultat satisfaisant. Il est clair que certaines images ne seront pas totalement fidèles à l’original, mais suffisamment proches néanmoins pour avoir un résultat d’une qualité acceptable (voir les exemples d’images vidéotex en couleur)

 

Ici, le tableau "Image " est constitué d’éléments pouvant avoir des valeurs de 0 à 7. Ces valeurs correspondent aux 8 couleurs du Minitel, dans l’ordre de luminosité. (0=Noir..7=Blanc). Ainsi, une image en " vraies couleurs " sur 16 bits ou plus pourra facilement être réduite en 8 niveaux de luminosité du Minitel. Néanmoins, étant donné l’approximation grossière que cela implique, des images ayant des dégradés riches en couleurs ne pourront pas être transcrits de manière fidèle.

 

Pour chaque caractère semi – graphique qui devra être généré, c’est à dire pour chaque morceau d’image de 2 points sur 3, il faut décider quelles couleurs seront attribuées.

 

Une solution possible est la suivante : nous allons choisir les deux couleurs extrêmes présentes dans ce morceau. La couleur la plus sombre sera, arbitrairement, la couleur de fond ; et la plus claire, la couleur de texte. Dans le cas où elles seraient identiques, le procédé fonctionnera également. Ensuite, les points colorés, selon qu’ils sont plus proches de la couleur de texte choisie ou de la couleur de font, activeront ou non les points correspondant dans la matrice semi - graphique. Le procédé est fidèle lorsque 2 couleurs ou moins sont présentes dans un morceau de dessin ; mais plus il y a de couleurs, et moins le résultat sera fidèle. Les risques sont néanmoins limités, étant donné que chque mosaïque ne dispose que de 6 points ; dont au moins 2 corresponderont à l’original.

 

Une autre solution, similaire à la précédente, consiste à choisir les deux couleurs dominantes constituant chaque pavé de 2*6 points. Cette solution, selon les cas, peut s’avérer donner de meilleurs résultats.

 

 

Note : Les textes encadrés par des /* */ sont des commentaires

 

/* Cette fonction indique si la couleur entrée est plus proche de la couleur de texte (1) ou de fond (0)

Un 1 signifie que le point testé doit être activé dans la matrice semi - graphique ; c’est à dire que ce point sera affiché avec la couleur de texte */

Fonction Etat(CoulText,CoulFond,Couleur)

Si | CoulText-Couleur | > | CoulFond-Couleur | Alors Renvoyer 0

Sinon renvoyer 1

Fin de Si

Fin de fonction

 

 

/* Cette fonction renvoie les deux couleurs qui seront utilisées comme couleurs de texte et de fond , PREMIERE méthode, basée sur les deux couleurs extrêmes */

Fonction Choix(Image,y,x)

Local : mini, maxi, a, b (entiers)

 

mini <- Image[y,x]

maxi <- Image[y,x]

Pour b allant de y à y+2

Pour a allant de x à x+1

Si Image[b,a]<mini alors mini <- Image[b,a]

Si Image[b,a]>maxi alors maxi <- Image[b,a]

Fin de boucle

Fin de boucle

 

Renvoyer [mini, maxi]

Fin de fonction

 

 

 

 

/* Cette fonction renvoie les deux couleurs qui seront utilisées comme couleurs de texte et de fond , SECONDE méthode, basée sur les deux couleurs dominantes */

Fonction Choix(Image,y,x)

Local : a, b, index, max1, max2 (entiers) , NbrCoul (vecteur de 8 éléments d’entiers)

 

NbrCoul <- [0, 0, 0, 0, 0, 0, 0, 0]

/* Première étape : Etablir le nombre de points d’une couleur donnée */

Pour b allant de y à y+2

Pour a allant de x à x+1

Index <- Image[b,a]

NbrCoul[Index] <- NbrCoul[Index] + 1

Fin de boucle

Fin de boucle

 

/* Deuxième étape : choisir les deux couleurs prépondérantes */

max1 <- 0

Pour a allant de 0 à 7

Si NbrCoul[a]>NbrCoul[max1] alors max1 <- a

Fin de boucle

max2 <- max1

Pour a allant de 0 à 7

Si NbrCoul[a]>NbrCoul[max2] ET NbrCoul[a]<>NbrCoul[max1] alors max2 <- a

Fin de boucle

 

Renvoyer [max1,max2]

Fin de fonction

 

 

/* Algorithme principal */

Variables : Esc (char), C (chaîne), Coutexte, Coulfond (vecteurs de 8 char), d (vecteur de 2 entiers)

x,y (entiers)

 

C <- " "

Coultexte <- [" @ "," D ", "A ", "E ", "B ", "F ", "C ", "G "] /* Tableau des codes de couleur */

Coulfond <- [" P" , "T ", "Q ", "U ", "R ", "V ", "S ", "W "] /* pour le texte et le fond */

Esc <- chr(27) /* Code Escape (27) */

 

Pour y allant de 0 à H/3

C <- C+chr(31)+chr(64+Ym)+chr(65+Xm) /* Positionnement du curseur */

C <- C+chr(14) /* Passage en mode graphique */

Pour x allant de 0 à L/2

/* Choix des couleurs de texte et de fond, renvoyé dans un vecteur */

d <- Choix(Image,y*3,x*2)

texte <- d[0]

fond <- d[1]

 

/* Codes correspondant au changement de couleur de texte et de fond */

C <- C + Esc + Coultexte[texte]

C <- C + Esc + Coulfond[fond]

 

/* Codage du caractère : selon les points activés dans la matrice de caractère */

n <- 32

n <- n + Etat(texte,fond,y*3,x*2) * 1

n <- n + Etat(texte,fond,y*3,x*2+1) * 2

n <- n + Etat(texte,fond,y*3+1,x*2) * 4

n <- n + Etat(texte,fond,y*3+1,x*2+1) * 8

n <- n + Etat(texte,fond,y*3+2,x*2) * 16

n <- n + Etat(texte,fond,y*3+2,x*2+1) * 64

 

C <- C + chr(n)

Fin de boucle

Fin de boucle

 

 

 

Améliorations de l’algorithme

 

Cet algorithme est fondamental car il est à la base de toute les images affichées sur un Minitel. De lui dépendra leur qualité.

 

Mais l’algorithme doit, de plus, optimiser les images qu’il génère. Ce qui signifie que si 3 caractères semi – graphiques voisins ont la même couleur de texte, une seule commande de changement de couleur de texte devra être générée (la couleur de texte, nous l’avons vu, est un attribut transporté par le curseur). De même, le changement de couleur de fond ne se fera que lorsque cela sera utile. (l’écriture d’un caractère semi – graphique sans déclaration de changement de couleur de fond créant un délimiteur ayant la même couleur que son prédécesseur) L’utilisation de deux variables mémorisant la couleur actuelle de texte et de fond seront alors utilisées.

 

Le second point important est l’utilisation des caractères de répétition que nous avons précédemment étudié ; pour permettre un affichage plus rapide des portions d’images les plus simples à coder. Cette utilisation est un peu plus complexe, dans la mesure où l’on doit considérer le cas où plusieurs caractères se suivant auraient le même code ascii mais pas la même couleur.

 

Ainsi une séquence de cinq caractères X en couleur de texte bleu, suivis de dix caractères X en couleur de texte rouge devra produire :

 

Esc – A X 18 – D Esc – D 18 - J

Couleur Caractère X Répéter 4 fois Couleur de texte Répéter 10 fois

de texte (code 18 suivi du code BLEU (D=bleu) (code 18 suivi du code

ROUGE ascii 64+4=68="D ") ascii 64+10=74= "J ")

(A=rouge) le dernier caractère " X "

 

 

On doit donc noter le dernier caractère envoyé (pour ne pas le répéter inutilement), et interrompre le regroupement des caractères dès qu’un changement de couleur de texte ou de fond est détecté.

 

Notes : Les modifications introduites dans l’algorithme sont mises en évidence par un type de texte différent. Les fonctions précédemment définies sont réutilisées. Les textes encadrés par des /* */ sont des commentaires.

 

/* Cette procédure est chargée de terminer l’éventuelle séquence en cours */

Procédure AcheverSequence

Si SeqActivee alors /* Séquence à terminer */

Si LongueurSeq=1 alors /* Inutile d’optimiser pour 1 caractère */

S <- S + chr(CarActuel)

sinon

/* Commande de répétition (18) + nombre de répétitions codé */

S <- S + chr(18) + chr(64+LongueurSeq)

Fin de Si

SeqActivee <- Faux /* Plus de séquence en cours */

Fin de Si

Fin de Procédure

 

 

/* Cette procédure est chargée d’enregistrer un caractère. En temps normal cela reviendrait à ajouter directement ce caractère dans la chaîne. Ici on détecte si il a déjà été envoyé un caractère identique précédemment. Si oui, la comptabilisation des caractères identiques suivants démarre */

Procédure Ajouter(n)

/* Aucune comptabilisation n’est en cours si SeqActivee = Faux */

Si SeqActivee = Faux

Si n=CarActuel alors /* même caractère que le dernier affiché */

SeqActivee <- Vrai

LongueurSeq <- 1 /* 1 même caractère pour l’instant */

Sinon /* caractère différent */

CarActuel <- n /* noter dernier caractère envoyé */

S <- S + chr(n) /* envoi normal */

Fin de Si

/* Compatibilisation du nombre de caractères indentiques en cours */

Sinon

Si n=CarActuel alors /* on continue d’afficher le même caractère */

LongueurSeq <- LongueurSeq+1 /* ajouter 1 à la longueur */

Sinon /* fin de la séquence */

AcheverSequence

Fin de Si

Fin de Si

Fin de procédure

 

 

/* Algorithme principal */

Variables : Esc (char), C (chaîne), Coutexte, Coulfond (vecteurs de 8 char), d (vecteur de 2 entiers)

x,y (entiers)

TexteActuel, FondActuel (entiers)

 

C <- " "

Coultexte <- [" @ "," D ", "A ", "E ", "B ", "F ", "C ", "G "] /* Tableau des codes de couleur */

Coulfond <- [" P" , "T ", "Q ", "U ", "R ", "V ", "S ", "W "] /* pour le texte et le fond */

Esc <- chr(27) /* Code Escape (27) */

 

CarActuel <- " z " /*  " z " inutilisé, aucun caractère précédemment */

SeqActivee <- Faux /* initialiser l’optimisation des caractères */

 

Pour y allant de 0 à H/3

C <- C+chr(31)+chr(64+Ym)+chr(65+Xm) /* Positionnement du curseur */

C <- C+chr(14) /* Passage en mode graphique */

TexteActuel <- 7 /* La couleur de texte après un POS est par défaut le blanc */

FondActuel <- 0 /* Et la couleur de fond par défaut est noire */

 

Pour x allant de 0 à L/2

 

/* Choix des couleurs de texte et de fond, renvoyé dans un vecteur */

d <- Choix(Image,y*3,x*2)

texte <- d[0]

fond <- d[1]

/* Dans le cas d’un changement de couleur (texte, fond) il faut terminer la séquence de

répétition (si elle a été entamée) */

Si ( texte ¹ TexteActuel) OU (fond ¹ FondActuel) alors

AcheverSequence

Fin de Si

 

/* Codes correspondant au changement de couleur de texte et de fond si il y a lieu */

Si texte ¹ TexteActuel alors

C <- C + Esc + Coultexte[texte]

TexteActuel <- texte

Fin de Si

Si fond ¹ FondActuel alors

C <- C + Esc + Coulfond[fond]

FondActuel <- fond

Fin de Si

/* Codage du caractère : selon les points activés dans la matrice de caractère */

n <- 32

n <- n + Etat(texte,fond,y*3,x*2) * 1

n <- n + Etat(texte,fond,y*3,x*2+1) * 2

n <- n + Etat(texte,fond,y*3+1,x*2) * 4

n <- n + Etat(texte,fond,y*3+1,x*2+1) * 8

n <- n + Etat(texte,fond,y*3+2,x*2) * 16

n <- n + Etat(texte,fond,y*3+2,x*2+1) * 64

/* L’algorithme ne se contente plus d’ajouter un à un les caractères semi – graphiques */

Ajouter(n)

 

Fin de boucle

Fin de boucle

 

Cet algorithme est beaucoup plus efficace que le premier algorithme de codage en couleurs proposé ; les images codées le sont beaucoup plus efficacement (elles possèdent une taille encodée inférieure, et ont donc un temps d’affichage moindre)

 

 

 

Né en 1985, le Minitel a, avec le vidéotex, beaucoup évolué, même si la plus grosse partie du parc de Minitel en France reste composée des premiers Minitels. Pourtant, des améliorations très sensibles ont vue le jour. Les premiers ajouts ont concerné les commandes du vidéotex, avec la possibilité d’effacer plus rapidement des zones d’écran (effacement de la ligne après le curseur, ou avant, ou de toute la ligne) et l’insertion ou la destruction de lignes. Les Minitels 1B possèdent ces commandes, et sont après les Minitels 1 les plus répandus.

 

Le Minitel 2, quand à lui, offre une nouvelle possibilité : le DRCS. Sous ce nom de cache un ensemble de commandes permettant de redéfinir librement l’aspect des caractères inscrits à l’écran, aussi bien en mode texte qu’en mode graphique. Ainsi on peut remplacer l’aspect standard des caractères par des caractères gothiques, par exemple. Un attribut supplémentaire est ainsi ajouté : c’est l’attribut DRCS, qui indique que le caractère doit avoir l’aspect défini par l’utilisateur. Mais un autre usage est généralement fait du DRCS : chaque caractère est composé d’une matrice de 8 points de largeur sur 10 de hauteur ; c’est beaucoup plus que ce qu’offre le mode graphique du Minitel standard. Ainsi, de manière analogue au mode graphique du Minitel, il devient possible d’afficher des dessins ayant une définition bien supérieure : une image sera découpée en blocs 8*10 puis chaque bloc transféré dans le jeu de caractères. Deux limitations sont toutefois à considérer : d’une part le chargement des caractères est beaucoup plus long (il peut prendre de 20 à 30 secondes), et d’autre part seuls 96 caractères peuvent être redéfinis, ce qui limite donc les images à 96 blocs différents (mais qui n’empêche pas d’en utiliser certains plusieurs fois). Il faut noter que la redéfinition d’un caractère a un effet immédiat sur les caractères de ce type éventuellement à l’écran : si l’on modifie l’aspect du " A ", toutes les lettres " A " ayant été affichées en mode DRCS changeront d’aspect.

 

Le Minitel Photo, dernier né de France Télécom, offre un atout supplémentaire : l’affichage de photographies en couleur à l’écran, photographies du même format que celles utilisées dans l’informatique (JPeG compressé). Ce Minitel est doté d’un modem 8 fois plus rapide pour assurer un affichage assez rapide malgrès une taille d’images qui dépasse souvent 4000 octets. Seuls quelques commandes vidéotex ont été introduites ici : la définition de la taille de l’image à afficher, sa position et son type. L’image elle même est transférée directement sous forme de fichier JPeG (image compressée). Ainsi, en quelques secondes une image d’un quart d’écran peut être affichée.

 

Malgré ces évolutions, le Minitel perd peu a peu de son prestige au profit de nouveaux moyens de communication comme Internet. L’une des raison est que la technologie employée par la majorité des Minitels en France est dépassée ; avec un débit d’information 30 (trente !) fois inférieur à ce que peut réaliser un modem actuel, avec un affichage qui ne peut rivaliser avec les définitions de 800 points sur 600 en millions de couleurs proposées en entrée de gamme sur les micro-ordinateurs, et avec un prix de communication qui reste élevé.

 

Néanmoins, il demeure incontournable de par son implantation massive dans les foyers français, et de par les innombrables services (25000 répertoriés) qui sont proposés grâce à lui, générant 9 milliards de FF par an, services de plus accessibles en français, au contraire de l’Internet, qui reste majoritairement basé sur la langue Anglaise.

 

 

Xavier Roche

(C)1997 Xavier Roche, Tous droits réservés


Retour au menu


This page hosted by Get your own Free Home Page