Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Texte sur une image | |
| | Auteur | Message |
---|
nicola4830
Nombre de messages : 3 Date d'inscription : 05/12/2015
| Sujet: Texte sur une image Sam 5 Déc 2015 - 11:58 | |
| Bonjour , j aimerais créer un programme qui insère du texte sur une image bmp l image est stockée en c:\11.bmp et le texte est celui contenu dans le clipboard - taille 20 - fonte courrier - gras - couleur rouge
Merci de votre aide , Nicola | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 5 Déc 2015 - 12:47 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Texte sur une image Sam 5 Déc 2015 - 13:13 | |
| Tout d'abord: bienvenue à toi, Nicola4830 ! Ca fait toujours plaisir de découvrir un nouveau-venu sur notre forum. Quant à ta question, tu t'attaques tout de suite à un problème ardu. S'il est simple d'imprimer un texte dans une image, il l'est moins de le faire en préservant le fond ! Pour cela, il faut utiliser les fonctions d'une DLL (KGF.dll par exemple), mais je ne veux pas immédiatement de noyer avec des détails techniques à ce sujet. Mais on va étudier le cas simple d'écriture d'un texte dans une image, sachant que le fond sous les caractères sera remplacé par une couleur unie. Procédons par étapes: 1. on affiche l'image à l'écran/ Pour cela, il faut utiliser un objet Panoramic nommé PICTURE, le placer à l'écran et le dimensionner: - Code:
-
picture 1 top 1,10 left 1,10 width 1,400 height 1,300
end L'avantage d'un code Panoramic, c'est qu'il se comprend tout seul, pas vrai ? 2. on charge l'image bitmap dans le picture. De deux choses l'une: ou tu connais le nom et le chemin du fichier, ou alors tu veux permettre à l'utilisateur de choisir le fichier, par un sélecteur de fichiers. Prenons cette deuxième option. Pour cela, il y a un objet invisible Panoramic nommé OPEN_DIALOG qui peut faire cela. Une commande FILTER permet de faire ce que son nom indique: "filtrer" les noms de fichiers. Et une fonction FILE_NAME$ retourne le nom et le chemin du fichier choisi. Et finalement, le chargement se fait par la commande FILE_LOAD: - Code:
-
dim bmp$
picture 1 top 1,10 left 1,10 width 1,400 height 1,300
open_dialog 2 filter 2,"Images BMP|*.bmp" bmp$ = file_name$(2) if bmp$="_" then terminate : ' <=== on a cliqué sur "Annuler"
file_load 1,bmp$
end 3. tu vas constater immédiatement que l'image affichée ne correspond pas vraiment à ce que tu souhaites. Si l'image dépasse la taille allouée, elle sera tronquée, sinon, elle sera collée en haut à gauche en laissant le reste à blanc. Deux solutions: ou tu connais la taille et tu choisis les paramètres de WIDTH et HEIGHT en correspondance, ou alors tu utilises la commande STRETCH_ON pour permettre à Panoramic de faire l'ajustement automatiquement: - Code:
-
dim bmp$
picture 1 top 1,10 left 1,10 width 1,400 height 1,300
open_dialog 2 filter 2,"Images BMP|*.bmp" bmp$ = file_name$(2) if bmp$="_" then terminate : ' <=== on a cliqué sur "Annuler"
stretch_on 1 file_load 1,bmp$
end
Il y a des méthodes, par programme, de connaître les dimensions d'une image BMP, mais ça dépasse le cadre de cette initiation. 4. On va maintenant préparer l'impression du texte. Pour cela, on utilisera la commande PRINT. Encore faut-il dire à Panoramic que l'impression doit avoir lieu dans le PICTURE et non sur le fond de la fenêtre principale. C'est la commande PRINT_TARGET_IS qui le fait. Ensuite, il faut fixer la position de début d'impression (coin en haut à gauche du premier caractère à imprimer): c'est la commande PRINT_LOCATE. Ensuite, on va fixer la police, la taille, les attributs graphiques et la couleur. Tout cela, ça donne ceci: - Code:
-
dim bmp$
picture 1 top 1,10 left 1,10 width 1,400 height 1,300
open_dialog 2 filter 2,"Images BMP|*.bmp" bmp$ = file_name$(2) if bmp$="_" then terminate : ' <=== on a cliqué sur "Annuler"
stretch_on 1 file_load 1,bmp$
print_target_is 1 print_locate 20,65 : ' <=== position en pixels dans l'image font_name 1,"Courier" font_size 1,20 font_bold 1 font_color 1,255,0,0
end
5. Il ne reste plus qu'à récupérer le texte contenu dans le presse-papier (fonction CLIPBOARD_STRING_PASTE$) et l'imprimer (commande PRINT): - Code:
-
dim bmp$, txt$
picture 1 top 1,10 left 1,10 width 1,400 height 1,300
open_dialog 2 filter 2,"Images BMP|*.bmp" bmp$ = file_name$(2) if bmp$="_" then terminate : ' <=== on a cliqué sur "Annuler"
stretch_on 1 file_load 1,bmp$
print_target_is 1 print_locate 20,65 : ' <=== position en pixels dans l'image font_name 1,"Courier" font_size 1,20 font_bold 1 font_color 1,255,0,0
txt$ = clipboard_string_paste$ print txt$
end
Voilà qui est fait. Tu peux encore changer la couleur de fond de l'impression en insérant ceci, quelque part avant la commande PRINT: - Code:
-
2d_target_is 1 2d_fill_color R%,G%,B% en mettant les valeurs RGB à la place des variables R%, G% et B%. Mais, comme déjà dit plus haut, si tu veux préserver l'image en-dessous du texte au lieu d'avoir un fond uni, il faut utiliser KGF.dll. On pourra envisager cela plus tard, lorsque tu auras un peu plus d'expérience avec Panoramic. Amuse-toi bien ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Texte sur une image Sam 5 Déc 2015 - 13:50 | |
| D'abord, bonjour nicolas et bienvenue au forum ! La solution la plus facile pour écrire un texte sur une image en préservant le fond (c'est en général le but recherché) c'est sans doute d'utiliser la dll de Klaus, mais on peut y arriver aussi très facilement en pur Panoramic: Une petite sub fait parfaitement l'affaire, avec un exemple d'utilisation. Il faut évidemment adapter le chemin de l'image et les dimensions du picture aux dimensions de l'image. Et l'emplacement en x%,y% (en pixels) du texte dans l'image. Et on peut choisir les attributs du texte: police, taille couleur, attributs. Le texte peut comporter plusieurs lignes; L'opération se fait pixel par pixel, mais c'est très supportable: - Code:
-
DIM txt$,x%,y%,fnt$,sz%,attr%,coul% WIDTH 0,660: HEIGHT 0,550 PICTURE 1: WIDTH 1,640: HEIGHT 1,480 FILE_LOAD 1,"C:\GRAPH\JPG\GOLDGATE.JPG"
txt$ = "Au clair de la lune"
fnt$ = "Arial": ' police sz% = 20: ' taille attr% = 0: ' attributs (aucun) coul% = 255*65536: ' couleur rouge x% = 50: y% = 200: ' emplacement (pixels) Tx2Pic(1,x%,y%,txt$,fnt$,sz%,attr%,coul%)
END ' ============================================================================== SUB Tx2Pic(p%,x%,y%,txt$,fnt$,sz%,attr%,coul%) ' Affichage de lignes de texte txt$ sur l'objet p%, en position x%,y%, ' police fnt$, taille sz% (->255), attributs attr% (= B=1, I=2, U=4) ' couleur coul% format RGB (=65536*R + 256*G + B) ' Si plusieurs lignes: séparées par '0D0A' DIM_LOCAL p1%,wt%,ht%,r%,g%,b%,i%,j%,t2d%,tpt%,k%,a$ p1% = 998: WHILE OBJECT_EXISTS(p1%)=1: p1%=p1%+1: END_WHILE tpt% = NUMBER_PRINT_TARGET: t2d% = NUMBER_2D_TARGET PICTURE p1%: LEFT p1%,-2000 PRINT_TARGET_IS p1%: FONT_NAME p1%,fnt$: FONT_SIZE p1%,sz% IF BIN_AND(attr%,1) = 1 THEN FONT_BOLD p1% IF BIN_AND(attr%,2) = 2 THEN FONT_ITALIC p1% IF BIN_AND(attr%,4) = 4 THEN FONT_UNDERLINE p1% COLOR p1%,1,1,1: 2D_TARGET_IS p1%: 2D_FILL_COLOR 1,1,1 r%=INT(coul%/65536): g%=BIN_AND(coul%,255*256)/256: b%=BIN_AND(coul%,255) 2D_PEN_COLOR r%,g%,b% 2D_TARGET_IS p%: 2D_PEN_COLOR r%,g%,b% k% = INSTR(txt$,CHR$(13)+CHR$(10)) WHILE k% > 0 a$ = LEFT$(txt$,k%-1): txt$ = RIGHT_POS$(txt$,k%+2) wt%=TEXT_WIDTH(a$,p1%): ht% = TEXT_HEIGHT("ABCghi",p1%) WIDTH p1%,wt%: HEIGHT p1%,ht%: PRINT a$ FOR j% = 0 TO ht%-1 FOR i% = 0 TO wt%-1 IF COLOR_PIXEL_RED(p1%,i%,j%) <> 1 THEN 2D_POINT x%+i%,y%+j% NEXT i% DISPLAY NEXT j% y% = y%+ht% k% = INSTR(txt$,CHR$(13)+CHR$(10)) 2D_TARGET_IS p1%: CLS: 2D_TARGET_IS p% END_WHILE wt%=TEXT_WIDTH(txt$,p1%): ht%=TEXT_HEIGHT(txt$,p1%) WIDTH p1%,wt%: HEIGHT p1%,ht%: PRINT txt$ FOR j% = 0 TO ht%-1 FOR i% = 0 TO wt%-1 IF COLOR_PIXEL_RED(p1%,i%,j%) <> 1 THEN 2D_POINT x%+i%,y%+j% NEXT i% DISPLAY NEXT j% PRINT_TARGET_IS tpt%: 2D_TARGET_IS t2d% DELETE p1% END_SUB ' ============================================================================== Comme on peut s'en douter, le texte n'a ici aucun rapport avec l'image PS Je n'ai pas vérifié, mais la sub ci-dessus est probablement une de celles qui sont proposées sur le mag de ygeronimi. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 5 Déc 2015 - 14:11 | |
| Mille excuses.
Mon accueil a été froid, c' est le moins que l' on puisse dire, j' étais perdu dans mes pensées et je n' ai pas fait attention au fait que tu venais de t' inscrire.
Je te souhaite donc la bienvenue parmis nous et d' arriver ,et j' en suis persuadé, à tes fins avec le langage Panoramic.
Bonne Prog à toi, et à bientôt sur ce forum ! | |
| | | nicola4830
Nombre de messages : 3 Date d'inscription : 05/12/2015
| Sujet: Cela fonctionne Dim 6 Déc 2015 - 10:47 | |
| Bonjour , merci pour votre aide qui me satisfait pleinement je vais analyser les 2 possibilités qui sont tout à fait fonctionnelles Je reviens vers vous car je dois les adapter à mon logiciel pour traiter quelques centaines d images à la volée (je programme pour mon business avec le langage paradox objectpal) Encore merci de votre accueil , et à bientôt pour d' autres éclaircissements sur ce langage très sympa Panoramic.
Nicola
| |
| | | Invité Invité
| Sujet: Re: Texte sur une image Dim 6 Déc 2015 - 15:28 | |
| Bonjour et bienvenue Nicolas4830 Ce qui est dommage, est qu'il y ait un manque dans 2d_image_copy, car sinon il aurait été possible de faire cette gymnastique: - Code:
-
dim x,y , l,h , tx$ width 0,1000: height 0,800 picture 10:width 10,800:height 10,50 : font_size 10,20 : font_bold 10: font_name 10,"Times New Roman" 2d_target_is 10 : tx$= "Ceci est un teste" 2d_fill_color 0,0,0 :font_color 10,255,0,0 :print_target_is 10:print tx$ l=text_width( tx$,10) h=text_height(tx$,10) image 12
2d_image_copy 12,0,0,l,h : file_save 12,"c:\temp\img.bmp":' sauvegarde du texte
scene2d 11:left 11,500:width 11,500 : height 11,400 sprite 1 width 10,500 : height 10,400
file_load 10,"C:\PHOTOS_KODAK\ancien_1.jpg":stretch_on 10 :' chemin d'une photo 2d_image_copy 12,0,0,500,400 file_save 12,"c:\temp\sauve_img.bmp": ' pour avoir le format BMP file_load 11,"c:\temp\sauve_img.bmp" : ' stretch_on 11:' ou non
file_load 12,"c:\temp\img.bmp" message "ok! positionnez la souris"
sprite_image_load 1,12 repeat x= mouse_x_position(11) : y = mouse_y_position(11) sprite_x_position 1,x : sprite_y_position 1,y until scancode = 1
END :' car la suite n'est pas possible
' faire le report sur le picture 10 2d_target_is 11 :' scene2d 2d_image_copy 12,0,0,500,400 2d_target_is 10 :' picture 2d_image_paste 12,0,0 Répondre au message en appuyant sur espace pour éviter un clic. |
| | | Invité Invité
| Sujet: Re: Texte sur une image Dim 6 Déc 2015 - 15:47 | |
| J'ai trouvé une solution. On doit pouvoir optimiser le programme, c'était un teste. - Code:
-
dim x,y , l,h , tx$ width 0,1000: height 0,800 picture 10:width 10,800:height 10,50 : font_size 10,20 : font_bold 10: font_name 10,"Times New Roman" 2d_target_is 10 : tx$= "Ceci est un teste" 2d_fill_color 0,0,0 :font_color 10,255,0,0 :print_target_is 10:print tx$ l=text_width( tx$,10) h=text_height(tx$,10) image 12
2d_image_copy 12,0,0,l,h : file_save 12,"c:\temp\img.bmp":' sauvegarde du texte
scene2d 11:left 11,500:width 11,500 : height 11,400 sprite 1 width 10,500 : height 10,400
file_load 10,"c:\image\image_x.jpg" : ' chemin d'une photo 2d_image_copy 12,0,0,500,400 file_save 12,"c:\temp\sauve_img.bmp" : ' pour avoir le format BMP file_load 11,"c:\temp\sauve_img.bmp" : ' stretch_on 11:' ou non
file_load 12,"c:\temp\img.bmp" :' lecture du texte message "ok! positionnez la souris sur SCENE2D" :' Répondre en appuyant sur espace
sprite_image_load 1,12 :' copie du texte dans le sprite repeat x= mouse_x_position(11) : y = mouse_y_position(11) sprite_x_position 1,x : sprite_y_position 1,y until scancode = 1
' faire le report sur le picture 10 2d_target_is 0 :' scene2d 2d_image_copy 12,500,0,1000,400 2d_target_is 10 :' picture 2d_image_paste 12,0,0 file_save 12,"c:\temp\texte sur image.bmp" |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Texte sur une image Lun 7 Déc 2015 - 7:57 | |
| Bonjour à tous! Oui, cosmos, tu as trouvé la solution. J'avais compris qu'on ne pouvait passer que par un scene 2d un objet image et un picture pour faire cela, mais je m'emmelais les pédales avec le 2d_target! J'ai donc revu un peu ton programme et on peut faire cela tout en panoramic pur! Voilà ce que ça donne avec des commentaires pour s'y retrouver plus facilement: - Code:
-
' écrire un texte sur une image ! (par Cosmos) dim x,y,l,h,tx$ width 0,900: height 0,800
' étape 1: créer un picture sur lequel on print un texte de couleur sur fond noir picture 10:full_space 10:' full_space obligatoire avec la version 0927i2 (bug picture) width 10,800:height 10,50:' dimensions assez grandes pour le texte font_size 10,20:font_bold 10:font_name 10,"Times New Roman" 2d_target_is 10:tx$= "Ceci est un test!" 2d_fill_color 0,0,0:font_color 10,255,0,0:print_target_is 10:print tx$ l=text_width( tx$,10):h=text_height(tx$,10): ' récupérer les dimensions du texte
' étape 2: créer un objet image pour y copier l'image du texte image 12:2d_image_copy 12,0,0,l,h file_save 12,"c:\temp\img.bmp":' sauvegarde du texte dans un fichier temporaire 2d_target_is 0:print_target_is 0 delete 10:' on n'a plus besoin du picture on peut le supprimer si il ne sert plus
' étape 3: créer une scène 2d qui servira pour écrire un texte sur l'image scene2d 11:width 11,680:height 11,457:' aux dimensions de l'image sprite 1:' créer un sprite qui sera le texte file_load 11,"c:\mesprog\1.bmp" : ' stretch_on 11 si dimensions diffèrent image
' étape 4: charger l'image du texte dans le sprite sprite_file_load 1,"c:\temp\img.bmp"
' étape 5: le positionner repeat caption 0,"Bougez la souris; cliquez pour positionner votre texte! x="+str$(x)+" ; y="+str$(y) x=mouse_x_position(11):y=mouse_y_position(11) sprite_x_position 1,x: sprite_y_position 1,y until scancode=1 caption 0,""
' étape 6: copier et sauvegarder la nouvelle image avec son texte 2d_image_copy 12,0,0,680,457 file_save 12,"c:\temp\texte sur image.bmp"
' faire le ménage file_delete "c:\temp\img.bmp"
A + | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Texte sur une image Lun 7 Déc 2015 - 9:25 | |
| On peut même se passer du picture, puisqu'on peut "printer" sur un form! Au fait, un grand merci à toi Cosmos! - Code:
-
' écrire un texte sur une image ! (par Cosmos) dim x,y,l,h,tx$ width 0,900: height 0,800
' étape 1: choisir la police, la couleur, la taille du texte sur fond noir tx$= "Ceci est un test!" font_size 0,20:font_bold 0:font_name 0,"Times New Roman" 2d_fill_color 0,0,0:font_color 0,255,0,0:print tx$ l=text_width( tx$,0):h=text_height(tx$,0): ' récupérer les dimensions du texte
' étape 2: créer un objet image pour y copier l'image du texte image 12:2d_image_copy 12,0,0,l,h file_save 12,"c:\temp\img.bmp":' sauvegarde du texte dans un fichier temporaire cls:' effacer le texte de l'écran
' étape 3: créer une scène 2d qui servira pour écrire un texte sur l'image scene2d 11:width 11,680:height 11,457:' aux dimensions de l'image sprite 1:' créer un sprite qui sera le texte file_load 11,"c:\mesprog\1.bmp" : ' stretch_on 11 si dimensions diffèrent image
' étape 4: charger l'image du texte dans le sprite sprite_file_load 1,"c:\temp\img.bmp"
' étape 5: le positionner repeat caption 0,"Bougez la souris; cliquez pour positionner votre texte! x="+str$(x)+" ; y="+str$(y) x=mouse_x_position(11):y=mouse_y_position(11) sprite_x_position 1,x: sprite_y_position 1,y until scancode=1 caption 0,""
' étape 6: copier et sauvegarder la nouvelle image avec son texte 2d_image_copy 12,0,0,680,457 file_save 12,"c:\temp\texte sur image.bmp"
' faire le ménage file_delete "c:\temp\img.bmp"
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Texte sur une image Lun 7 Déc 2015 - 9:38 | |
| - Citation :
- On peut même se passer du picture, puisqu'on peut "printer" sur un form!
Je serais prudent avec ça... Essaie de minimiser la fenêtre et de la restaurer, ou de placer une fenêtre d'un autre programme par dessus, même partiellement, puis remets cette form en avant-plan... Je crois que tu seras surpris. | |
| | | Invité Invité
| Sujet: Re: Texte sur une image Lun 7 Déc 2015 - 18:51 | |
| J'avais pas vu l'intervention de Bignono.,Merci pour ta réponse. Pour ce qui est du picture 10 (pas obligatoire), il faut être sûr que l'image tienne dans la fenêtre. Sinon, il va manquer une partie je crois. On a le droit d'être fou, vu qu'on peut utiliser au maximum 10000 objets, limite imposée par Windows, donc un de plus ou de moins ... A propos je suis heureux de ton intervention. Il me semble que tu allais mal. |
| | | Contenu sponsorisé
| Sujet: Re: Texte sur une image | |
| |
| | | | Texte sur une image | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |