FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Mah-Jong américain
par Jean Claude Hier à 19:37

» StratégoV8 et V9
par Jean Claude Hier à 13:18

» Problème avec Deepl
par Klaus Hier à 0:34

» Déformation d'image en trapèze
par Klaus Dim 14 Jan 2018 - 16:22

» Quelques nouvelles ...
par Jean Claude Ven 12 Jan 2018 - 22:40

» Renommer les instructions ITEM_... ?
par Jicehel Ven 12 Jan 2018 - 18:56

» Ludothèque Panoramic
par jjn4 Ven 12 Jan 2018 - 18:11

» sous-programmes et fonctions
par Jack Ven 12 Jan 2018 - 17:51

» KGF_dll - nouvelles versions
par Minibug Ven 12 Jan 2018 - 0:21

» Mah-Jong français
par Jean Claude Jeu 11 Jan 2018 - 22:15

» HVIEWER
par Klaus Mer 10 Jan 2018 - 2:06

» panoramic 0.9.28
par gigi75 Ven 5 Jan 2018 - 14:06

» Un jeu qui va vous énerver!
par Jean Claude Jeu 4 Jan 2018 - 22:05

» Bonne fêtes de fin d'année ! Meilleurs Vœux 2018 !
par Jicehel Jeu 4 Jan 2018 - 17:28

» Mah-Jong international
par jjn4 Jeu 4 Jan 2018 - 16:55

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Janvier 2018
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
293031    
CalendrierCalendrier

Partagez | 
 

 Déformation d'image en trapèze

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
JL35



Nombre de messages : 6069
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Déformation d'image en trapèze   Sam 13 Jan 2018 - 16: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 - 20:07, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jjn4

avatar

Nombre de messages : 1656
Date d'inscription : 13/09/2009

MessageSujet: +++   Sam 13 Jan 2018 - 16:44

Ouahhhh, carrément artistique !
farao
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://jjn4.e-monsite.com
JL35



Nombre de messages : 6069
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Déformation d'image en trapèze   Sam 13 Jan 2018 - 16: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):
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5120
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Déformation d'image en trapèze   Sam 13 Jan 2018 - 22: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+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Minibug

avatar

Nombre de messages : 2478
Age : 51
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Déformation d'image en trapèze   Sam 13 Jan 2018 - 23: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... Suspect
Espérant que jack nous concoctera un compilateur pour améliorer tout çà !

Il n'en reste pas moins que l'idée est excellente. Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://gpp.panoramic.free.fr
Klaus

avatar

Nombre de messages : 10411
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Déformation d'image en trapèze   Dim 14 Jan 2018 - 0:55

En tilisant KGF.dll tu as aussi:
http://klauspanoramic.esy.es/TorturePicture.html
Cette 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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 6069
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Déformation d'image en trapèze   Dim 14 Jan 2018 - 2: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6069
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Déformation d'image en trapèze   Dim 14 Jan 2018 - 15: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10411
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Déformation d'image en trapèze   Dim 14 Jan 2018 - 16:22

Super ! C'est bien ça, l'esprit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Déformation d'image en trapèze   

Revenir en haut Aller en bas
 
Déformation d'image en trapèze
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» roll-over, zone réactive, image et son
» [résolu] Lien dans image survolée vers page html
» agrandir reduire une image en son centre
» Changement d'une image de fond
» Image défilante

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: