Photobase - Opérateurs sur les images Par Eric JUHEL, Developpeur 4D Thierry OZIL, Marketing Technique 4D S.A. Olivier DESCHANELS, Responsable Programme 4D S.A. Note technique 4D-200210-30-FR Version 0 Date 10 Octobre 2002 Résumé 4e Dimension propose des opérateurs sur les images, ils effectuent des traitements spécifiques et leur fonction diffère de leur utilisation courante. Nous vous proposons dans ce chapitre, l étude d un cas de superposition d images qui utilise ces fonctionnalités de 4e Dimension. 4D Notes techniques Copyright 1985-2003 4D SA - Tous droits réservés Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible. Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte. L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs utilisateurs que des tiers. Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager 4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la licence électronique figurant sur le support dulogiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être utilisés, copiés oureproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette licence. Aucune partie de ce document ne peut être reproduite ourecopiée de quelque manière que ce soit, électronique ou mécanique, y compris par photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA. 4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques enregistrées de 4D SA. Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation. Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc. Mac2Win Software Copyright 1990-2002 est un produit de Altura Software,Inc. 4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,trumbull,ct,usa. XTND Copyright 1992-2002 4D SA. Tous droits réservés. XTND Technology Copyright 1989-2002 Claris Corporation.. Tous droits réservés ACROBAT Copyright 1987-2002, Secret Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'adobe Systems Inc. 1 / 21
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs. 2 / 21
Présentation Comme tout langage de programmation 4e Dimension propose des opérateurs permettant d'effectuer des opérations sur des expressions. Ces opérateurs sont "monnaie courante", nous les utilisons régulièrement et, si chaque langage propose des particularités et gère des syntaxes différentes, généralement, nous les regroupons en trois catégories. : - Les opérateurs arithmétiques. - Les opérateurs logiques. - Les opérateurs de chaînes de caractères. 4e Dimension dispose de plusieurs opérateurs dans ces domaines, pour connaître les syntaxes, vous pouvez vous reporter au chapitre opérateurs du manuel 4e Dimension - Langage. Les opérateurs arithmétiques permettent de réaliser des calculs sur les numériques. L utilisation de ces opérateurs respecte une hiérarchie, permettant d interpréter une expression de façon unique. Pour clarifier des situations ambiguës, les parenthèses permettent de regrouper des calculs intermédiaires. Les opérateurs logiques, peuvent être regroupés en deux catégories. Certains permettent de comparer des données de même type, d'autres permettent d'effectuer des opérations booléennes sur les données. Les opérateursde la première catégorie comparent deux informations de type numérique ou alphanumérique en fonction d'un certain critère, pour déterminer si le résultat est vrai ou faux. Les opérateurs de la seconde catégorie permettentd'effectuer les trois opérations booléennes standards : le Et logique, le Ou logique et le Sauf. Les opérations sur les chaînes, concernent plus particulièrement la concaténation, selon le langage d autres traitements comme l extraction ou la répétition, font appel à des opérateurs. En plus de ces opérations standard, 4e Dimension propose d utiliser des opérateurs sur les images, ils effectuent des traitements spécifiques et leur fonction diffère de leur utilisation courante. Nous vous proposons dans ce chapitre, l étude d un cas de superposition d images qui utilise ces fonctionnalités de 4e Dimension. Dans cette perspective, nous aborderons dans ce chapitre : - La syntaxe des opérateurs sur les images, - Le mécanisme du procédé. Contexte Pour commencer, utilisons pleinement les fonctionnalités de 4D Photobase! 3 / 21
Des informations symbolisées L application permet d associer des couleurs à nos mots-clés directeurs (Nous entendons par mots-clés directeurs les mots-clefs de premier niveau). Les illustrations d une planche contact peuvent, alors, être agrémentées par l ajout de puces colorées sur l image. Pour cela, nous sélectionnons un item directeur dans l inspecteur liste des mots-clés et cliquons sur le bouton "attribution d une couleur" qui déroule une palette de couleurs. Attribution d une couleur à un mot-clé Nous sélectionnons des illustrations qui ont fait l objet d une localisation et de plusieurs affectations de mots-clés et nous cochons les options : Afficher les drapeaux des pays et afficher les puces de mots clés, dans l inspecteur Affichage. Ces options sont attribuées distinctement à chaque planche contact. Elles sont effectives au moment de la consultation, et modifient l aspect des images affichées en temps réel. Dans le même genre, l option Afficher les fichiers présents dispose une icône en haut à gauche des photos pour signaler les fichiers images accessibles à l aide d un double-clic. 4 / 21
Présentation avec le drapeau du pays et les puces des mots clés affectés Prévisualisation La palette regroupant les inspecteurs utilitaires, nous permet de visualiser la vignette survolée par le pointeur de la souris, cela permet d avoir un agrandissement de l imagette. Si cet inspecteur est sélectionné lors d un double-clic sur une vignette, l agrandissement proposé change d aspect et nous présente une image au look "pellicule inversible" qui donne directement l image positive. L orientation des perforations est adaptée à l orientation de la photo originale. Les deux contextes précédents, les informations symbolisées adjointes à la vignette ou la visualisation sous la forme d une pellicule, sont le résultat d une superposition de plusieurs images issues de la bibliothèque de 4e 5 / 21
Dimension sur des imagettes. Nous allons voir que plusieurs opérations successives sont nécessaires pour être sûr que notre puce jaune sera jaune ou que le drapeau conservera ses couleurs d origine. Syntaxe des opérateurs La mise en œuvre des opérateurs sur les images, ne semble pas toujours donner le résultat souhaité. Il est nécessaire de bien comprendre les possibilités de 4e Dimension dans ce domaine. Système de coordonnées Afin de rester cohérent avec le reste du langage 4e Dimension, les opérateurs sur les images utilisent des coordonnées en pixel dont l origine se trouve au coin supérieur gauche de l objet traité. 6 / 21
La superposition L opération est réalisée à l aide de 2 opérateurs logiques : Opération Syntaxe Action Superposition inclusive Image1 Image2 cf. commentaires ci-dessous Superposition exclusive Image1 & Image2 cf. commentaires ci-dessous Note : Pour obtenir une explication plus détaillée sur cet aspect, vous pouvez vous reporter à la note technique 02 de janvier 2000 de Roland Lannuzel 4D SA. - Lors de l opération Image1 Image2, 4e Dimension retourne une image dont l aspect correspond par exemple, à ce que l on obtient en ajoutant un filtre de couleur à des lunettes. Ce qui veut dire que si l une des images à une couleur dominante, notre photo finale sera teintée par cette couleur. Exemple : - Un paysage et un fond blanc -> Le paysage est inchangé parce que le blanc est translucide - Un paysage et un fond noir -> une image noire - Un paysage et un ciel bleu -> un paysage bleu - Un paysage et un Paysage -> un flou plus ou moins artistique Exemple : - Lors de l opération Image1 & Image2, 4e Dimension retourne une image dont l aspect correspond à une vision négative de l originale sur laquelle, on aurait appliquer un filtre. Dans ce cas, il est parfois difficile de maîtriser le résultat sauf, si l on opère avec l une des images à fond uni. Exemple : - Un paysage et un fond blanc -> Le paysage est inchangé parce que le blanc est encore translucide - Un paysage et un fond noir -> Le paysage en négatif - Un paysage et un ciel bleu -> un flou plus ou moins artistique - Un paysage et un Paysage -> un flou plus ou moins artistique Exemple : 7 / 21
Le dimensionnement L opération est réalisée à l aide de 2 opérateurs d extension : Opération Syntaxe Action Homothétie Image * N Redimensionne Image au pourcentage de N Extension horizontale Image *+ N Redimensionne Image horizontalement au pourcentage N Extension verticale Image */ N Redimensionne Image verticalement au pourcentage N Exemple : $image:=($image*+0,25)*/0,50 Dans ce cas l image $image, sera redimensionnée de 25 % horizontalement et de 50% verticalement. Le déplacement L opération est réalisée à l aide de 2 opérateurs de déplacement : Opération Syntaxe Action Déplacement vertical Image / N Déplace Image verticalement de N pixels Déplacement horizontal Image + N Déplace Image horizontalement de N pixels Exemple : $image:=($image+30)/10 L image $image, sera d abord déplacée horizontalement sur la droite de 30 pixels et déplacée verticalement de 10 pixels vers le bas dans un second temps. Affichage du drapeau Lors du choix ou du retrait de l option, l inspecteur envoie un message au process de communication. Ce dernier active l évènement formulaire Sur appel extérieur de la planche contact. 8 / 21
La mise à jour est réalisée dynamiquement pour la page courante, par l intermédiaire d une méthode exécutée dans l évènement formulaire "Sur minuteur" : LB_draw_cell, dont le code est lisible à la fin de cette section. La mise à jour individuelle des imagettes est réalisée en boucle, en fonction du nombre de photos affichées dans la page courante. Elle suit le processus suivant. 1) Identification de l illustration. 2) Identification du pays. 3) Chargement de l image du drapeau à partir de la bibliothèque d images 4e Dimension. 4) Création d un masque de fond, de couleur blanche à la taille du drapeau. 5) Déplacement du masque blanc et du drapeau, dans le coin supérieur gauche 6) Superposition du masque blanc, du drapeau et de l imagette. Le dimensionnement, le déplacement et la superposition des images sont réalisés à l aide des opérateurs sur les images. Mais avant d aborder le détail de ces opérations, considérons l utilisation du masque blanc. Pourquoi utilisons nous un masque translucide? Compte tenu des résultats retournés par les opérateurs ET et OU, nous devons prendre en compte l opération dont on sera sûr du résultat, quel que soit le drapeau et la photo. Sans cette condition, on pourrait obtenir une icône plus ou moins représentative du pays concerné sous l aspect de l illustration suivante. 9 / 21
Affichage des drapeaux sans masque de fond Utilisation d un masque En fait, pour obtenir avec certitude un drapeau aux couleurs réelles, sans dégrader la photo, ni les drapeaux, nous créons une zone translucide sur l emplacement du drapeau. Un drapeau combiné avec une image blanche ne changera pas de couleurs à l affichage. Cette zone translucide est obtenue à partir de deux superpositions successives d un masque noir sur la photo. Pour cela, nous utilisons successivement les opérateurs : OU et ET dans cet ordre. 1) Création d un masque noir à la taille du drapeau. 2) Opération : La photo masque noir -> Photo avec zone noire. 3) Opération : Photo avec zone noire & masque noir -> Photo avec zone blanche (la zone blanche étant le négatif du masque noir). Pour créer un masque à la taille du drapeau, nous utilisons une image issue de la bibliothèque (ID 12003). Cette image de couleur noire est de 1 pixel sur 1 pixel, il suffit alors, de réaliser un agrandissement à partir des informations retournées par la commande PROPRIETES IMAGE appliquée au drapeau. Syntaxe : LIRE IMAGE DANS BIBLIOTHEQUE(12003;$fond) PROPRIETES IMAGE($drapeau;$largeur;$hauteur) 10 / 21
$fond1:=($fond1*+$largeur)*/$hauteur En complément, nous pouvons envisager un encadrement autour du drapeau, cet encadrement est issu d un second masque dont la taille est supérieure de 2 pixels. Syntaxe : $fond2:=($fond*+($largeur+2))*/($hauteur+2) Le positionnement en haut à droite, des masques et du drapeau, est réalisé en tenant compte des valeurs retournées par PROPRIETES IMAGE appliquée à la photo : Syntaxe : PROPRIETES IMAGE(Photo;$largeurPhoto;$hauteurPhoto) $fond1:=($fond1+($largeurphoto-$largeur-1))/1 $fond2:=$fond2+($largeurphoto-$largeur-2) $drapeau:=($drapeau+($l1-$l-1))/1 Pour finir, la juxtaposition des 4 objets s effectue en trois temps selon la syntaxe suivante : $Photo:=$Photo $fond2 $Photo:=$Photo & $fond1 $Photo:=$Photo & $drapeau Extrait méthode : LB_draw_cell / `Chargement de l enregistrement [Photo] ALLER A ENREGISTREMENT([Photo];_cell_address_table{$1+ ((page_current-1)*cell_number_by_page)}) $objet->:=[photo]thumbnail PROPRIETES IMAGE($objet->;$largeur;$hauteur) / Si (cell_display_flag=1) & ([Photo]ID_Location#0) `Si affichage drapeau = Vrai LIRE IMAGE DANS BIBLIOTHEQUE(12003;$fond) `lecture du masque `identification du pays $id_pays:=([photo]id_location_>>_20) << 20 `chargement enregistrement pays CHERCHER([Location];[Location]ID=$id_pays) Si (Enregistrements trouves([location])>0) `Lecture de l icône drapeau LIRE IMAGE DANS BIBLIOTHEQUE([Location]Ref_Icon;$drapeau) PROPRIETES IMAGE($drapeau;$l;$h) `largeur et hauteur du drapeau 11 / 21
$fond1:=($fond*+$l)*/$h ` dimension pour fond translucide $fond2:=($fond*+($l+2))*/($h+2)`dimension pour fond Noir +2 pixel pour cadre PROPRIETES IMAGE($objet->;$l1;$h1)`largeur et hauteur Photo courante $fond1:=($fond1+($l1-$l-1))/1 `déplacement du 1er masque $fond2:=$fond2+($l1-$l-2)/1 `déplacement du second masque avec un retrait de 2pixels à cause de l encadrement $objet->:=$objet-> $fond2 ` Zone en noire $objet->:=$objet-> & $fond1` Zone en Blanc - encadrement $drapeau:=($drapeau+($l1-$l-1))/1 `déplacement du drapeau $objet->:=$objet-> & $drapeau`superposition du drapeau Fin de si Fin de si Les illustrations suivantes présente les aspects graphiques intermédiaires du mécanisme utilisé. 12 / 21
13 / 21
Affichage des puces L affichage des puces est réalisé selon le même processus que l affichage des drapeaux, à la différence que, dans ce cas, nous ne connaissons pas à l avance le nombre de puces à ajouter. Pour rappel, la couleur attribuée à un mot-clé correspond à la couleur associée au mot directeur. Le nombre de puces à afficher est alors, équivalent au nombre de puces distinctes. L identification des mots-clés est réalisée lors de la lecture du blob [Photo]IDs_Keyword et les couleurs de puces concernées sont extraites du Champ [Keyword]Color à partir de la sélection courante des [Keyword]. Ensuite la présentation des puces colorées, suit le mécanisme suivant : 1) Création de deux masques de fond Blanc redimensionnés en fonction du nombre de lignes et d un pourcentage qui représente l espace, que l on se donne pour afficher les puces (ici 66% de la largeur) 2) Positionnement en Boucle en fonction du nombre de puces totales : de puces noires sur l un dès masques et de puces colorées sur l autre. 3) Première juxtaposition du masque Blanc à tâches noires sur la photo pour obtenir un masque Noir sur le futur emplacement des puces colorées. 14 / 21
4) Seconde juxtaposition du même masque sur la photo pour obtenir un masque Blanc sur le futur emplacement des puces colorées. 5) Juxtaposition de masque Blanc à puces colorées sur la photo. extrait méthode : LB_draw_cell / Si (cell_display_keyword=1) `Si on choisi l'option dans inspecteur affichage Cluster_read_in_photo (->[Keyword]) `récupération des valeurs ID des mots clés Si (Taille tableau(_klap_id)>0) `il y a t-il des mots clés PROPRIETES IMAGE($objet->;$l1;$h1) `récup des dimensions de la photo en cours $poucentage_zone:=0,66 `pourcentage attribué à la zone des puces CHERCHER PAR TABLEAU([Keyword]ID;_klap_id) VALEURS DISTINCTES([Keyword]Color;$tl_couleur) _ `lecture de la puce noire LIRE IMAGE DANS BIBLIOTHEQUE(21016;$puce_noire) `lecture du pixel noir LIRE IMAGE DANS BIBLIOTHEQUE(12003;$fond) $colonne_puce:=0 `initialisation à zéro pour commencer $ligne_puce:=1`au début on se positionne sur la première ligne $nb_ligne_puce:=(taille tableau($tl_couleur)\(($l1*$poucentage_zone)\8))+1 `le fond Noir est redimensionné en fct du nombre de lignes $masque:=($fond*+$l1)*/($nb_ligne_puce*8) $masque:=$masque & $masque `il est Blanc $image:=$masque `elle est blanche Boucle ($i;1;taille tableau($tl_couleur);1) $colonne_puce:=$colonne_puce+1 `on passe à la colonne suivante Si (($colonne_puce*8)>($l1*$poucentage_zone)) `est ce que l'on est encore dans la limite imposée $colonne_puce:=1 `on revient sur la première colonne $ligne_puce:=$ligne_puce+1 `on passe à la seconde ligne (au dessus) Fin de si `lecture de la puce concernée LIRE IMAGE DANS BIBLIOTHEQUE(21000+$tl_couleur{$i}; $puce_couleur) `déplacement sur ligne et colonne courantes $puce:=($puce_couleur/(8*($nb_ligne_puce-$ligne_puce)))+ ((8*($colonne_puce-1))+1) $puce_masque:=($puce_noire/(8*($nb_ligne_puce-$ligne_puce)))+ ((8*($colonne_puce-1))+1) $image:=$image & $puce `Blanc à puces colorées $masque:=$masque & $puce_masque `Blanc à tâches noires Fin de boucle `dimensions du masque blanc à tâches noires PROPRIETES IMAGE($masque;$l2;$h2) $masque:=$masque/($h1-$h2-1) `déplacement vertical + remontée de 1 pixel $image:=$image/($h1-$h2-1) ` déplacement vertical + remontée de 1 pixel $objet->:=$objet-> $masque ` Photo + tâches noires $objet->:=$objet-> & $masque ` Photo + täches blanches 15 / 21
$objet->:=$objet-> & $image ` Photo + puces colorées Fin de si Fin de si Les illustrations suivantes présentent les aspects graphiques intermédiaires du mécanisme utilisé. 16 / 21
17 / 21
18 / 21
Look pellicule Pour afficher l image sous la forme d une pellicule avec ses perforations disposées selon l orientation de la photo originale, nous utilisons entre autres, deux masques enregistrés dans la bibliothèque de 4D Photobase Ces images ont des dimensions de 180 x 180 pixels, elles correspondent à celles de la variable image utilisée dans l inspecteur.nous avons vu auparavant que la superposition d un fond noir sur une photo, génère une image négative. Pour obtenir une image propre, nous allons de nouveau créer une défonce centrée et dimensionnée à la taille de l image sur le négatif sélectionné et ensuite superposer l imagette sur le résultat. L opération se déroule selon l illustration suivante : Le script qui exécute ces deux superpositions successives est visible dans la méthode PH_move_photo : 19 / 21
Extrait de la méthode PH_move_photo `détermination de la largeur et hauteur image originale PROPRIETES IMAGE(photo_picture;photo_width;photo_height) `Calcul la plus grande taille possible de la variable image dans la fenêtre `Détermine le coefficient multiplicateur photo_zoom_factor:=4dmath_minimum ((($ph_fenetre_largueur-100)/ photo_width);(($ph_fenetre_hauteur-100)/photo_height)) _ / `Création de la vignette look pellicule `choix du fond adapté Si (photo_width>photo_height) thumbnail_ratio:=4dmath_minimum (($vltaille_zone/photo_width);(($vltaille_zone-42)/photo_height)) LIRE IMAGE DANS BIBLIOTHEQUE(19020;$viCadre) Sinon thumbnail_ratio:=4dmath_minimum ((($vltaille_zone-42) /photo_width);($vltaille_zone/photo_height)) LIRE IMAGE DANS BIBLIOTHEQUE(19021;$viCadre) Fin de si thumbnail_width:=arrondi((photo_width*thumbnail_ratio);0) thumbnail_height:=arrondi((photo_height*thumbnail_ratio);0) `Création de la défonce pour installer l'image dans le négatif LIRE IMAGE DANS BIBLIOTHEQUE(12003;$vi_Defonce) `le masque issu de la bibliothèque est dimensionné selon la taille de la photo $vi_defonce:=($vi_defonce*+thumbnail_width)*/thumbnail_height `transfert du fond pellicule dans la la variable image affichée thumbnail_picture:=$vicadre `le fond noir est centré sur la variable affichée $masque:=($vi_defonce+((180-thumbnail_width)/2)) /((180-thumbnail_height)/2) `la pellicule et le masque sont superposés thumbnail_picture:=thumbnail_picture_&_$masque `Création de l'imagette et collage dans la défonce du négatif CREER IMAGETTE(photo_picture;$ph_FZVignette;thumbnail_width; thumbnail_height;2;millions de couleurs 24 bits ) $ph_fzvignette:=($ph_fzvignette+((180-thumbnail_width)/2)) /((180-thumbnail_height)/2) thumbnail_picture:=thumbnail_picture_&_$ph_fzvignette APPELER SUR ERREUR("Export_manage_error") COMPRESSER IMAGE(thumbnail_picture;"jpeg";500) APPELER SUR ERREUR("") 20 / 21
Résumé / Références techniques - Manuel 4e Dimension Langage - Chapitre : Les opérateurs - Note technique 03 de Janvier 2000 - Opérations sur les images de Roland Lannuzel, Responsable Produit ACI. 21 / 21