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 |
|
|
| Déformation d'image en trapèze | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Déformation d'image en trapèze Sam 13 Jan 2018 - 14:26 | |
| Par exemple pour mettre une image en perspective, ou n'importe quel autre usage, simuler l'affichage d'une image sur un mur latéral, comme dans une galerie de peintures... Le traitement est un peu long (fonction de la taille de l'image), colonne par colonne de pixels, à l'aide d'un Scene2d/Sprite, chaque colonne étant agrandie ou raccourcie par rapport à la précédente, suivant le sens du trapèze. On utilise la fonction SPRITE_Y_SCALE pour ajuster la colonne de pixels à la hauteur voulue. Le travail est exécuté dans une sub 'Trapèze' Paramètres: image d'origine (jpg, bmp), sens du rétrécissement droite ou gauche, facteur de rétrécissement, fichier image résultat (bmp) Il faut évidemment adapter les chemins: fm$ = fichier temporaire de manoeuvre - Code:
-
' ============================================================================== SUB Trapeze_H(f$,dg$,r,fr$) ' Déformation d'une image en trapèze horizontal ' Origine f$ (jpg, bmp), résultat dans fr$ (bmp) ' dg$ = "R" ou "L" côté droit (R) ou gauche (L) en trapèze ' r = facteur de rétrécissement par rapport au côté fixe, ex. r= 0.5 (= 1/2) DIM_LOCAL fm$,p%,im%,s2%,sp%,w%,h%,h1%,hl%,ry,rh,cy,x%,y%,d%,delta fm$ = "C:\TEMP\Provy.bmp" p% = 900: PICTURE p%: HIDE p%: FILE_LOAD p%,f$: FILE_SAVE p%,fm$ FILEBIN_OPEN_READ 1,fm$: ' dimensions image -> w%, h% FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 WIDTH p%,w%: HEIGHT p%,h%: FILE_LOAD p%,fm$: FILE_DELETE fm$ im% = p%+1: IMAGE im% 2D_TARGET_IS p% IF UPPER$(dg$) = "R" hl% = h%: y% = 0 ELSE hl% = h%*r: y% = (h%-r*h%)/2 END_IF d% = (h%-h%*r)/2: ' diminution totale d'ordonnée sur la largeur delta = d%/w%: ' diminution par colonne ry = y%: rh = hl% s2% = im%+1: SCENE2D s2%: WIDTH s2%,w%: HEIGHT s2%,h% sp% = s2%-1 FOR x% = 0 TO w%-1 2D_IMAGE_COPY im%,x%,0,x%+1,h%-1: ' 1 ligne verticale sp% = sp%+1: SPRITE sp% SPRITE_IMAGE_LOAD sp%,im% cy = hl%/h% SPRITE_Y_SCALE sp%,cy SPRITE_POSITION sp%,x%,y% IF UPPER$(dg$) = "R" ry = ry+delta: rh = rh-2*delta ELSE ry = ry-delta: rh = rh+2*delta END_IF y% = ry: hl% = rh: ' nouvelle hauteur de ligne NEXT x% SNAPSHOT s2%,fr$ 2D_TARGET_IS 0: DELETE p%: DELETE im%: DELETE s2%: SPRITE_DELETE_ALL END_SUB ' ============================================================================== SUB Trapeze_V(f$,dg$,r,fr$) ' Déformation d'une image en trapèze vertical ' Origine f$ (jpg, bmp), résultat dans fr$ (bmp) ' dg$ = "T" ou "B" côté haut (T) ou bas (B) en trapèze ' r = facteur de rétrécissement par rapport au côté fixe, ex. r= 0.5 (= 1/2) DIM_LOCAL fm$,p%,im%,s2%,sp%,w%,h%,w1%,wl%,rx,rw,cx,x%,y%,d%,delta fm$ = "C:\TEMP\Provy.bmp" p% = 900: PICTURE p%: HIDE p%: FILE_LOAD p%,f$: FILE_SAVE p%,fm$ FILEBIN_OPEN_READ 1,fm$: ' dimensions image -> w%, h% FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 WIDTH p%,w%: HEIGHT p%,h%: FILE_LOAD p%,fm$: FILE_DELETE fm$ im% = p%+1: IMAGE im% 2D_TARGET_IS p% IF UPPER$(dg$) = "B" wl% = w%: x% = 0 ELSE wl% = w%*r: x% = (w%-r*w%)/2 END_IF d% = (w%-w%*r)/2: ' diminution totale d'abscisse sur la hauteur delta = d%/h%: ' diminution par ligne rx = x%: rw = wl% s2% = im%+1: SCENE2D s2%: WIDTH s2%,w%: HEIGHT s2%,h% sp% = s2%-1 FOR y% = 0 TO h%-1 2D_IMAGE_COPY im%,0,y%,w%-1,y%+1: ' 1 ligne horizontale sp% = sp%+1: SPRITE sp% SPRITE_IMAGE_LOAD sp%,im% cx = wl%/w% SPRITE_X_SCALE sp%,cx SPRITE_POSITION sp%,x%,y% IF UPPER$(dg$) = "B" rx = rx+delta: rw = rw-2*delta ELSE rx = rx-delta: rw = rw+2*delta END_IF x% = rx: wl% = rw: ' nouvelle largeur de ligne NEXT y% SNAPSHOT s2%,fr$ 2D_TARGET_IS 0: DELETE p%: DELETE im%: DELETE s2%: SPRITE_DELETE_ALL END_SUB ' ============================================================================== Par exemple (2 images déformées, une normale au centre): NB édité à 18h00 J'ai séparé en deux subs Trapeze_H() et Trapeze_V() pour déformations en trapèze hiorizontal ou vertical.
Dernière édition par JL35 le Sam 13 Jan 2018 - 18:07, édité 2 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 13 Jan 2018 - 14:44 | |
| Ouahhhh, carrément artistique ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Déformation d'image en trapèze Sam 13 Jan 2018 - 14:51 | |
| Merci jj, j'aurais pu prendre 3 images différentes, il faudra que j'essaye... ça pourrait être marrant avec des photos persos. En tout cas c'est simple à faire. On peut imaginer facilement des trapèzes vers le haut ou vers le bas, sur le même principe, mais je n'en ai pas trop vu l'utilité. J'ai édité pour ajouter une sub trapèze vertical, pour avoir les 4 possibilités. Et corrigé quelques erreurs de langage. Par exemple, la même image déformée dans les 4 sens, et intacte au milieu, comme dans l'intérieur d'un cube (donc 5 images, regroupées dans un Scene2d): | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Déformation d'image en trapèze Sam 13 Jan 2018 - 20:20 | |
| Salut à tous,
Bravo JL35, voilà un code qui permet de construire un monde en 3D.
Ce n'était peut-être pas ton intention initiale mais ça peut être utilisé pour ça....
A+ | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Déformation d'image en trapèze Sam 13 Jan 2018 - 21:53 | |
| Bonsoir JL35 ! Très bonne idée cette déformation, et le principe que tu utilises est très intéressant. Par contre, sur une image de taille importante, le temps est long, très long... Espérant que jack nous concoctera un compilateur pour améliorer tout çà ! Il n'en reste pas moins que l'idée est excellente. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Déformation d'image en trapèze Sam 13 Jan 2018 - 22:55 | |
| En tilisant KGF.dll tu as aussi: http://klauspanoramic.esy.es/TorturePicture.htmlCette fonction permet de déformer un rectangle en un quatrilatère quelconque (et donc en un trapèze). C'est assez rapide. Mais, évidemment, ce n'est plus 100 % Panoramic... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Déformation d'image en trapèze Dim 14 Jan 2018 - 0:58 | |
| C'est vrai que c'est valable pour de petites images, mais pas en temps réel sur des images plus importantes, à moins de créer les images une fois pour toutes pour les utiliser ensuite à part. Le traitement se fait ligne de pixels par ligne de pixels, mais c'est vrai que le principe m'a semblé intéressant.
Klaus, je n'ai jamais utilisé cette fonction de kgf.dll, ça ouvre aussi des horizons, je regarderai. D'un autre côté j'aime bien le panoramic pur, mais bon, j'utilise aussi des ressources externes quand c'est intéressant (et surtout kgf.dll !) Bonne nuit à tous !
Je viens de regarder vite fait, effectivement la fonction de kgf.dll est beaucoup plus souple et plus rapide... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Déformation d'image en trapèze Dim 14 Jan 2018 - 13:53 | |
| Effectivement Klaus, cette fonction TorturePicture de Kgf.dll est très intéressante. Elle ne permet pas seulement de torturer des images (!), mais de les redimensionner (agrandir, réduire) à sa guise sans déformations. Et en plus, très rapidement. Je m'en suis fait une petite sub, transparente (sans affichage) pour le programme appelant, le résultat étant renvoyé sois dans un fichier bmp, soit dans le presse-papier. (le chemin de kgf.dll est à ajuster) - Code:
-
SUB Trapeze(f$,x1%,y1%,x2%,y2%,x3%,y3%,x4%,y4%,fr$) ' Déformation d'une image rectangulaire f$ en quadrilatère quelconque ' Paramètres: coordonnées des sommets résultants dans le sens des aiguilles, ' en commençant par le sommet haut/gauche ' Résultat dans fr$ (bmp) (ou clipboard si fr$ = ""). DIM_LOCAL p%,res%,hg$,hd$,bd$,bg$ hg$ = STR$(x1%)+","+STR$(y1%): hd$ = STR$(x2%)+","+STR$(y2%) bd$ = STR$(x3%)+","+STR$(y3%): bg$ = STR$(x4%)+","+STR$(y4%) p% = 900: PICTURE p%: HIDE p%: FILE_LOAD p%,f$: CLIPBOARD_COPY p% DLL_ON "C:\PANORAMIC\KGF\KGF.dll" res% = DLL_CALL0("LoadPicture") res% = DLL_CALL4("TorturePicture",ADR(hg$),ADR(hd$),ADR(bd$),ADR(bg$)) res% = DLL_CALL0("SavePicture") DLL_OFF IF fr$ <> "" THEN CLIPBOARD_PASTE p%: FILE_SAVE p%,fr$ DELETE p% END_SUB | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Déformation d'image en trapèze Dim 14 Jan 2018 - 14:22 | |
| Super ! C'est bien ça, l'esprit ! | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Déformation d'image en trapèze Mar 16 Jan 2018 - 19:06 | |
| Vraiment super Travail j'avais modestement créer un programme pur panoramic pour atteindre le même résultat avec un traitement très rapide. La seul limite est que nous n'avons pas une définition d'image très poussé en 3D. je vous livre les quelques lignes: - Code:
-
dim a,xm,ym ,proph,roph,b,c,pi label correc,rotpho pi=acos (-1) width 0,1000: height 0,1000 : border_small 0 :left 0,250 scene3d 1:left 1,200:top 1,50:width 1,600:height 1,600 print "correction de l'angle de prise de vue " form 303 : left 303,0 :top 303,420 :height 303,100 :width 303,240 : caption 303,"Photo" : command_target_is 303 main_menu 81 sub_menu 83 : caption 83,"correction" : parent 83,81 :on_click 83,correc sub_menu 84 : caption 84,"portait-paysage" : parent 84,81 :on_click 84,rotpho scroll_bar 307 :top 307,0 :min 307,-45:max 307,45:position 307,0 alpha 317:caption 317,"parallaxe":top 317,20 :left 317,130 3d_cube 10,1 :3d_scale 10,3,4,1 3d_load_texture 10,"votrephoto.bmp" roph=0
end
correc: a =position (307) 3d_rotate 10,a,0,0 proph=even(roph) if proph =1 3d_scale 10,6,(4/cos(a/(20*pi))),0.1 else 3d_scale 10,4,(6/cos(a/(20*pi))),0.1 end_if b=cos (a/64) print a print b return
rotpho: roph=roph+1 gosub correc return
Comme vous le voyez, ici il n'y a qu'un sens de rotation mais vous pouvez tout imaginer! bonne programmation a tous | |
| | | Fredisland
Nombre de messages : 261 Date d'inscription : 30/03/2018
| Sujet: Re: Déformation d'image en trapèze Sam 7 Avr 2018 - 18:02 | |
| Pourquoi ai-je en permanence le même message d'erreur sur la ligne 2 :
--------------------------- Panoramic_editor --------------------------- (32) Illegal instruction. Line : 2 --------------------------- SUB Trapeze_H(f$,dg$,r,fr$)
Ah il faut envoyer des paramètres.... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Déformation d'image en trapèze Sam 7 Avr 2018 - 21:00 | |
| Ben oui, une sub n'est qu'un sous-programme qu'il faut appeler avec des paramètres. J'aurais dû mettre un exemple d'appel, comme d'habitude... mea culpa.
| |
| | | Contenu sponsorisé
| Sujet: Re: Déformation d'image en trapèze | |
| |
| | | | Déformation d'image en trapèze | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |