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...
Génération dimages par le langage du Minitel,
Le Vidéotex
Etude 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
Présentation du Minitel
Le Minitel est aujourdhui utilisé couramment par des millions de Français qui sen servent pour consulter lannuaire électronique ou pour accéder à de nombreux services dinformation et commerciaux.
Disposant dun clavier, dun modem et dun é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 laffichage dimages 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 dun Minitel est essentiellement composé dune 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 laffichage dimages. La première ligne nest 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 dun certain nombre dattributs, qui sont la couleur décriture et de fond (8 couleurs sont disponibles sur un Minitel), les attributs visuels tels linversion vidéo, le clignotement, et pour le mode texte le soulignage, et la taille daffichage (normale, double largeur, double hauteur ou les deux réunis) . Les caractères graphiques, nous y reviendrons, sont composés dune 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 dune image qui seront collés les uns contre les autres pour la constituer.
Certains attributs, tels la couleur décriture, le clignotement et linversion 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. Dautres 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 seffectue 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 laspect dune page peut varier au cours du temps, pendant que celle-ci saffiche 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 laffichage 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 ; cest à 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 linformatique. Les codes de valeur inférieur à 31 sont des codes de contrôle ; qui permettent de coder les commandes du vidéotex. Certaines dentre elles, par exemple les codes CR et LF (ascii 13 et 10) se retrouvent sur tout terminal et dans linformatique 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 aujourdhui le standard. Le standard V23, choisi pour le Minitel, nest donc utilisé couramment que par ce dernier.
Ces commandes permettent le changement de couleur décriture par exemple, ou bien le changement dinversion 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 nest néanmoins pas le cas pour les attributs définis par zone (changement de couleur de fond..) : lors du changement dun tel attribut, cest le caractère qui suit la commande qui hérite de lattribut. 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 dattributs 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 aujourdhui 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é (quil soit graphique ou en mode texte) ; bien que le Minitel naccepte 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)
En mode texte (qui est un attribut) pour les caractères qui ne sont pas des espaces
En mode graphique (tous les caractères)
Les caractères despacement en mode texte
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.
Quest-ce quune zone vidéotex ?
Une zone vidéotex est un ensemble contigu de caractères dune 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 ! Lespace compris entre le début de la ligne et le premier délimiteur nest 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 dattribut de zone, comme par exemple le changement de couleur de fond, ou bien le soulignage etc.) ou bien tout caractère graphique. Ainsi seul lespace 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 à lintérieur dune 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 laspect dun caractère délimitant ne diffère pas des autres caractères : lattribut " délimiteur " est invisible.
Pour créer un délimiteur, il y a deux possibilités :
1° Passage en mode décriture graphique si ce mode nest pas déjà activé ; puis inscription dun caractère quelconque (qui aura donc lattribut graphique activé, et qui sera donc considéré comme un délimiteur par le vidéotex)
2 ° Ecriture dun espace délimitant : il faut pour cela changer dattribut 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 dattribut de zone à la suite. Lespace généré gardera la trace de ces modifications. Il aura alors lattribut 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 dune commande de changement dattribut de zone, linscription du délimiteur est reportée pour le caractère suivant, et ainsi de suite jusqu'à ce quun 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 despacement na pas besoin de tous les attributs quont 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 dune 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 lon modifie un de ces attributs, alors cest toute la zone qui sera modifiée.
Lorsque lécran est vide (ou quil a été effacé par la commande deffacement 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 dun 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é nest pas gênante, au contraire : si lon déclare un nouveau délimiteur ayant un fond jaune, et quon inscrit quelques caractères juste après, nous aurons créé une zone ayant un fond jaune et terminée par lun des délimiteurs dorigine. Si ils navaient pas été inscrits, la zone aurait continué jusquen fin de ligne, et pour l éviter lécriture dun 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 dorigine, 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 daffichage, et les commandes qui sont utilisées pour dautres 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 dune 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 dune ligne ; si il était sur la dernière ligne alors il repasse sur la première ligne de lécran
11 Recule le curseur dune 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 deffets.
Commandes de changement dattributs ; quils soient valables pour chaque caractère, ou définis par zones.
14 Mode graphique activé à partir de cette commande, et ce jusquau passage en mode texte, ou bien lors dun effacement décran, ou de déplacement du curseur par la commande 31
15 Mode texte activé (désactive le mode graphique) ; cest 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 (]) linversion 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 deffectuer des optimisations au sein dune page : au lieu dafficher 30 caractères identiques à la suite en envoyant les 30 caractères, il suffit de lenvoyer 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 dautres mais qui entrent en jeu indirectement.
En pratique : Action sur les zones vidéotex par les délimiteurs
Considérons lécran initial dun 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 dune 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 dorigine 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 lespace) puis inscrivons un caractère quelconque (qui peut aussi bien être un espace) : nous avons écrasé le délimiteur qui sy trouvait. Le vidéotex nous dit alors quune 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 dune zone vidéotex
Plaçons le curseur sur le premier délimiteur (après le e, sur lespace) et inscrivons y un caractère quelconque : le délimiteur qui sy 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 lancienne zone perd donc sa couleur de fond. (lautre zone na 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 laspect 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 doctets (et donc de temps) : les conséquences de certaines commandes vidéotex sur la mémoire écran sont très importantes. Cest là lun des atouts du vidéotex : rendre possible laffichage de pages de façon rapide par lutilisation de commandes optimisées pour les besoins du Minitel.
Dautres 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 loptimisation dune page. Son utilisation est dailleurs 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 nest 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 denvoyer 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 lintérêt de telles commandes : remplissons lécran uniformément en bleu. Pour cela, effacons tout dabord 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 leffacement 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 dune seconde. Sil 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 dafficher 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 nest pas suffisant pour afficher des graphismes, la concaténation de plusieurs de ces caractères permet de créer facilement tout types dimages. 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 dun caractère graphique représente 2^0=1 ; le second 2^1=2 etc.. jusquà lavant 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 lascii 32 (qui représente une matrice vide de points, et qui donc est identique visuellement à un caractère de texte espace) à lascii 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é) lenvoi de ces codes permettra dafficher les mosaïques correspondantes.
2^0 |
2^1 |
2^2 | 2^3 |
2^4 | 2^6 |
Caractère graphique du Minitel
Algorithmes de codage dimages
Ce premier algorithme permet de coder une image informatique monochrome en une suite de séquences vidéotex qui, en mode graphique, permettra laffichage de limage désirée.
Limage 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 limage 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 safficher à 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, sil 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 na 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 à loriginal, mais suffisamment proches néanmoins pour avoir un résultat dune qualité acceptable (voir les exemples dimages 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 lordre 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é lapproximation 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é, cest à dire pour chaque morceau dimage de 2 points sur 3, il faut décider quelles couleurs seront attribuées.
1° 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 quils 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 à loriginal.
2° 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 savé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 ; cest à 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 dentiers)
NbrCoul <- [0, 0, 0, 0, 0, 0, 0, 0] /* Première étape : Etablir le nombre de points dune 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 lalgorithme
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 lalgorithme doit, de plus, optimiser les images quil 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 lavons 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 dun 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) Lutilisation de deux variables mémorisant la couleur actuelle de texte et de fond seront alors utilisées.
Le second point important est lutilisation des caractères de répétition que nous avons précédemment étudié ; pour permettre un affichage plus rapide des portions dimages les plus simples à coder. Cette utilisation est un peu plus complexe, dans la mesure où lon 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 quun changement de couleur de texte ou de fond est détecté.
Notes : Les modifications introduites dans lalgorithme 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 doptimiser 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 denregistrer 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 nest 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 linstant */ 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 dafficher 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 loptimisation 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 dun 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
/* Lalgorithme ne se contente plus dajouter 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 daffichage moindre)
Evolutions du vidéotex
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é deffacer plus rapidement des zones décran (effacement de la ligne après le curseur, ou avant, ou de toute la ligne) et linsertion 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 laspect des caractères inscrits à lécran, aussi bien en mode texte quen mode graphique. Ainsi on peut remplacer laspect standard des caractères par des caractères gothiques, par exemple. Un attribut supplémentaire est ainsi ajouté : cest lattribut DRCS, qui indique que le caractère doit avoir laspect défini par lutilisateur. Mais un autre usage est généralement fait du DRCS : chaque caractère est composé dune matrice de 8 points de largeur sur 10 de hauteur ; cest beaucoup plus que ce quoffre le mode graphique du Minitel standard. Ainsi, de manière analogue au mode graphique du Minitel, il devient possible dafficher 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 : dune part le chargement des caractères est beaucoup plus long (il peut prendre de 20 à 30 secondes), et dautre part seuls 96 caractères peuvent être redéfinis, ce qui limite donc les images à 96 blocs différents (mais qui nempêche pas den utiliser certains plusieurs fois). Il faut noter que la redéfinition dun caractère a un effet immédiat sur les caractères de ce type éventuellement à lécran : si lon modifie laspect du " A ", toutes les lettres " A " ayant été affichées en mode DRCS changeront daspect.
Le Minitel Photo, dernier né de France Télécom, offre un atout supplémentaire : laffichage de photographies en couleur à lécran, photographies du même format que celles utilisées dans linformatique (JPeG compressé). Ce Minitel est doté dun modem 8 fois plus rapide pour assurer un affichage assez rapide malgrès une taille dimages qui dépasse souvent 4000 octets. Seuls quelques commandes vidéotex ont été introduites ici : la définition de la taille de limage à afficher, sa position et son type. Limage elle même est transférée directement sous forme de fichier JPeG (image compressée). Ainsi, en quelques secondes une image dun 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. Lune des raison est que la technologie employée par la majorité des Minitels en France est dépassée ; avec un débit dinformation 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 lInternet, qui reste majoritairement basé sur la langue Anglaise.
(C)1997 Xavier Roche, Tous droits réservés
Retour au menu
This page hosted by Get your own Free Home Page