Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Blitz Basic - programme de traitement d'images
(Article écrit par Mathieu Chènebit et extrait d'Amiga News - février 1997)
|
|
Ça y est ! J'ai enfin trouvé le programme qui va nous occuper durant plusieurs numéros. Je suppose qu'en lisant attentivement
Amiga News, vous avez remarqué la rubrique de Barrou Diallo sur le traitement numérique des
images. Et bien, figurez-vous que
nous allons mettre ses cours en pratique afin d'obtenir notre propre logiciel de traitement d'images (genre GFX Lab par exemple).
Attention, cet article va être un peu théorique du fait qu'il faut jeter les bases de notre programme sur papier.
Cahier des charges
C'est la première chose à faire avant de se lancer dans l'écriture d'un programme. Celui-ci peut se faire dans votre tête, ou bien sur
papier, suivant l'envergure du projet. Il est de toutes manières préférable d'en faire un pour éviter de réécrire plusieurs fois
les mêmes routines. Dans notre cas, il nous faut plusieurs choses : un programme multi-images (comme Photogenics), multi-effets,
gérant de 2 à 256 couleurs (Amiga AGA seulement), possédant un "undo", localisé, disposant d'une aide en ligne et bien entendu respectueux
du système. Les deux premiers points vont impliquer une grande modularité de manière à ce que nous n'ayons pratiquement rien à modifier
en rajoutant des effets ou en utilisant plusieurs images. Nous n'allons malheureusement pas tout traiter dans cet article, faute de
place, mais ne vous inquiétez pas, vous en découvrirez un peu plus le mois prochain.
Mise en pratique
Pour ce qui est de l'interface graphique, nous allons ouvrir notre propre écran (c'est plus simple pour nous que de l'ouvrir sur
l'écran du Workbench) mais tout en laissant à l'utilisateur la possibilité de choisir quel mode d'écran il désire. Nous allons donc
créer une fenêtre de requête pour le mode d'écran tout simple. Ensuite, il va falloir définir des menus. Nous aurons : Charger,
Sauver, Sauver Sous, Voir (pour voir notre image en plein écran et non pas dans la seule fenêtre de prévisualisation), lnfos
(informations concernant l'image), Quitter. De plus, il va donc nous falloir trois fenêtres : une pour les effets, une contenant
la liste de nos images, et une fenêtre de prévisualisation affichant une partie de l'image active. Notez qu'on pourrait tout aussi
bien associer une fenêtre à chaque image pour pouvoir en afficher plusieurs en même temps, mais cela ralentirait d'autant le
programme et la consommation en mémoire grimperait en flèche. On va donc se passer de cette option.
Attachons-nous à la fenêtre des effets : pour que l'utilisateur puisse faire un choix le plus simplement du monde, nous allons
avoir recours à un ListView (Cf. cet article et
celui-ci). Pour notre fenêtre contenant les noms des images chargées, nous allons faire
appel à des GTButton qu'on réinitialise à chaque chargement d'une image. On aurait pu aussi bien utiliser un ListView, mais autant
vous faire voir un peu de tout ;-). Certains programmes affichent l'image réduite, mais j'ai trouvé cette possibilité beaucoup
trop lente pour les petites configurations. Néanmoins, les grosses configurations pourront s'y essayer avec les commandes ReduceX2,
Scale, GetAShape et enfin WBlit pour "coller" vos étiquettes.
La fenêtre de prévisualisation est, quant à elle, toute simple : nous nous contenterons d'y coller une partie des images (d'où le terme
"PreView") avec la commande BitmapToWindow. Maintenant, attardons-nous un petit peu sur le mode multi-images. Pour arriver à
cela, il nous faudra créer une table d'un type nouveau (NEWTYPE) appelé tout simplement... .picture ;-). Nous devons définir les
champs de notre NewType : pour cela, il faut penser aux informations à stocker concernant notre image. Il nous faut son numéro, le
numéro de sa palette (ce dernier est optionnel car c'est le même que le numéro de l'image, néanmoins je l'utilise pour plus de
clarté dans mes routines), le nombre de plans, le nombre de couleurs (lui aussi optionnel, il est obtenu à partir du nombre de
plans), la hauteur de l'image, sa largeur, son ViewMode, son chemin d'accès et son nom.
Ouf, c'est fini ! Comme vous pouvez donc le constater, c'est donc un NewType assez imposant que nous allons utiliser. Mais cette
stature nous permettra de faire face à tous les problèmes éventuels et d'appliquer toutes sortes d'effets à notre image.
Nos premiers effets !
Ils ne sont pas formidables ;-). Le premier est un effet de base : le dégradé en niveaux de gris.
Pour cela, nous allons utiliser une boucle fort simple. En partant de la couleur 0 jusqu'à la dernière couleur de notre
palette, nous allons faire la moyenne des trois composantes pour chaque registre de couleurs et ensuite copier celle-ci à la
place des trois composantes de notre registre couleur. Je sais, ça paraît compliqué, mais regardez l'exemple et vous vous
apercevrez que c'est en réalité enfantin. Il ne reste plus qu'à faire un petit "Use Palette" et le tour est joué.
Un autre effet est la rotation (Barrou en a donné les explications dans Amiga News numéro 96 page 58,
je ne vais donc pas y revenir) dont je me suis contenté de recopier l'algorithme ;-). Il est un peu plus complexe
que le précédent dans le sens où il fait intervenir deux bitmaps : l'image originale plus un bitmap temporaire. Nous effectuons toutes
nos transformations sur le bitmap temporaire que nous recopions lorsque l'effet est fini sur le bitmap original.
Bon, allez, on va se rajouter un troisième effet pour la forme ! il s'agit cette fois-ci d'un effet dit de "négatif". Il
transforme la palette pour faire apparaître le négatif de l'image comme sur vos photographies. Il suffit de soustraire notre
couleur à la dernière couleur de la palette et comme précédemment de faire un "Use Palette" umPal.
Le source
Il est je pense suffisamment commenté pour qu'il soit à la portée de tous. Désolé pour le peu d'explications techniques, mais la place me
manque. De toutes manières, nous y reviendrons le mois prochain. S'il y a un quelconque problème d'ici là, n'hésitez pas à me
contacter à ma nouvelle adresse électronique (matc999@spidernet.tm.fr) ou au journal qui transmettra.
Le mois prochain donc, on continue ce programme tout en abordant de nouveaux sujets : localisation, "undo", aide en ligne...
|