Zoom Image avec VectorDrawing()

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Zoom Image avec VectorDrawing()

Message par kernadec »

bjr à tous
En recherchant dans mes vieux codes PB
j'ai retrouvé un code zoom que j'avais
fait avec la librairie PB de VectorDrawing
mais oublié depuis un moment :mrgreen:

Cordialement

Code : Tout sélectionner

EnableExplicit

Global scale.f, wheel, event

Procedure zoomdessin(scale)
  If StartDrawing(CanvasOutput(0))
    Box(00, 00,1000,800,#White)    ;reztore fond blanc canvas
    StopDrawing()
  EndIf
  
  If StartVectorDrawing(CanvasVectorOutput(0))
    
    VectorSourceColor(RGBA(0, 0, 255, 128))
    MovePathCursor(0, 0)
    ScaleCoordinates(1 + scale,1 + scale)
    DrawVectorImage(ImageID(0), 127)
    
    StopVectorDrawing()
  EndIf
EndProcedure


If OpenWindow(0, 0, 0, 1000, 800, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 1000, 800,#PB_Canvas_Keyboard)    
  LoadImage(0, #PB_Compiler_Home + "examples/Sources/Data/PureBasicLogo.bmp")
  
  SetActiveGadget(0)
  zoomdessin(scale)
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget And EventGadget() = 0
      If EventType() = #PB_EventType_MouseWheel
        Wheel = GetGadgetAttribute(0, #PB_Canvas_WheelDelta)
        scale= scale + wheel * 0.5
        zoomdessin(scale)  
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

Avatar de l’utilisateur
Ar-S
Messages : 9475
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Zoom Image avec VectorDrawing()

Message par Ar-S »

Question bête peut être mais pourquoi ne pas utiliser un resizeimage #PB_Image_Smooth en copiant au préalable l'image originale ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Zoom Image avec VectorDrawing()

Message par kernadec »

salut Ar-S
j'ai déjà utiliser le mode ResizeImage() à partir d'une copie
moins de dégradations qu'un ResizeImage() recursif...
mais pour ce code il n'y a pas besoin de faire de copie de l'originale
le changement d’échelle est directe avec la lib VectorDrawing qui comme
son nom l'indique elle travaille en vectoriel ce qui devrait être mieux :mrgreen:
j'ai posté ce code car c'est une peut être une option possible de zoom
Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Zoom Image avec VectorDrawing()

Message par kernadec »

@Ar-S tu as raison :)
je suis allé sur le forum anglais et trouvé ce code de 2017 de "Torp"
qui répond cette question j'ai vérifier avec un code zoom non récursif
que j'avais fait en 2011
résultat, il est identique à un zoom fait avec ResizeImage() c'est dommage :?
ça aurait été sympa qui fasse un zoom Postscript PDF..

j utilise ces programmes pour agrandir mes Photos qui utilisent le mode PDF pour agrandir le format image
https://www.clubic.com/telecharger-fich ... eriza.html
https://www.clubic.com/telecharger-fich ... razor.html

Cordialement

Ps: il zoom à l'endroit ou se trouve le curseur souris

Code : Tout sélectionner

EnableExplicit

Declare Ev_MouseMove()
Declare Ev_Repaint()
Declare Ev_MousePan()
Declare Ev_MouseWheel()

Global.i Event
Global.d x_PosOrigin, y_PosOrigin, Zoom, Zoom_Factor, y_WscreenSize, x_WscreenSize

Zoom_Factor = 1.10 : Zoom = 1.0

;{ Evènements personnalisés
Enumeration #PB_Event_FirstCustomValue
  #Ev_Repaint
EndEnumeration
;}

;{ Structure Mouse/Curseur }
Structure Str_Mouse
  x_Wld.d                        ;// Coordonnée X monde avant "TranslateCoordinates"
  y_Wld.d                        ;// Coordonnée Y monde avant "TranslateCoordinates"
  
  x_CoordW.d                  ;// Coordonnée X monde
  y_CoordW.d                  ;// Coordonnée X monde
  
  x_PrW.d                        ;// Coordonnée X monde précédente
  y_PrW.d                        ;// Coordonnée Y monde précédente
  
  x_Can.l                        ;// Coordonnée Souris X sur le Canvas
  y_Can.l                        ;// Coordonnée Souris Y sur le Canvas
  
  Move.b                        ;// La souris se déplace
  Pan.b                         ;// Déplacement panoramique
  Wheel.b                       ;// Molette Souris
EndStructure

;Init Structure
Global Mouse.Str_Mouse
;}

Procedure Ev_MouseMove()
  Mouse\x_Can = GetGadgetAttribute(0, #PB_Canvas_MouseX)
  Mouse\y_Can = GetGadgetAttribute(0, #PB_Canvas_MouseY)
  Mouse\Move ! 1
  PostEvent(#Ev_Repaint)
EndProcedure

Procedure Ev_MousePan()
  Mouse\Pan ! 1 ; inverse la valeur 0|1
EndProcedure

Procedure Ev_MouseWheel()
  Mouse\Wheel ! 1
  Select GetGadgetAttribute(0, #PB_Canvas_WheelDelta)
    Case 1
      ;Debug "in"
      Zoom =  Zoom * Zoom_Factor
    Case -1
      ;Debug "out"
      Zoom = Zoom / Zoom_Factor   
  EndSelect
  PostEvent(#Ev_Repaint)
EndProcedure

Procedure Ev_Repaint()
  ;Debug "Repaint"
  If StartVectorDrawing(CanvasVectorOutput(0, #PB_Unit_Millimeter))
    
    VectorFont(FontID(0), 3)
    
    FlipCoordinatesY(y_WscreenSize / 2, #PB_Coordinate_User) ; 0,0 en bas à gauche
    ScaleCoordinates(Zoom, Zoom, #PB_Coordinate_User)
    
    If Mouse\Move And Not Mouse\Pan
      ;Debug "Move"
      Mouse\Move ! 1
      Mouse\x_Wld = ConvertCoordinateX(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      Mouse\y_Wld = ConvertCoordinateY(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      TranslateCoordinates(x_PosOrigin, y_PosOrigin, #PB_Coordinate_User)
      Mouse\x_CoordW = ConvertCoordinateX(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      Mouse\y_CoordW = ConvertCoordinateY(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
    ElseIf Mouse\Move And Mouse\Pan
      ;Debug "Move et Pan"
      Mouse\Move ! 1
      Mouse\x_PrW = Mouse\x_Wld
      Mouse\y_PrW = Mouse\y_Wld
      Mouse\x_Wld = ConvertCoordinateX(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      Mouse\y_Wld = ConvertCoordinateY(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      x_PosOrigin = x_PosOrigin + Mouse\x_Wld - Mouse\x_PrW
      y_PosOrigin = y_PosOrigin + Mouse\y_Wld - Mouse\y_PrW
      TranslateCoordinates(x_PosOrigin, y_PosOrigin, #PB_Coordinate_User)
      Mouse\x_CoordW = ConvertCoordinateX(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      Mouse\y_CoordW = ConvertCoordinateY(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
    ElseIf Mouse\Wheel
      ;Debug "Wheel"
      Mouse\x_PrW = Mouse\x_Wld
      Mouse\y_PrW = Mouse\y_Wld
      Mouse\x_Wld = ConvertCoordinateX(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      Mouse\y_Wld = ConvertCoordinateY(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      x_PosOrigin = x_PosOrigin  +  Mouse\x_Wld - Mouse\x_PrW
      y_PosOrigin = y_PosOrigin  +    Mouse\y_Wld - Mouse\y_PrW
      TranslateCoordinates(x_PosOrigin, y_PosOrigin, #PB_Coordinate_User)
      Mouse\x_CoordW = ConvertCoordinateX(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
      Mouse\y_CoordW = ConvertCoordinateY(Mouse\x_Can, Mouse\y_Can, #PB_Coordinate_Device, #PB_Coordinate_User)
    EndIf
    
    If Mouse\Pan Or Mouse\Wheel
      ;Debug "draw"
      Mouse\Wheel ! 1
      VectorSourceColor(RGBA(80, 80, 80, 255)) : FillVectorOutput()
      
      AddPathBox(0, 0, x_WscreenSize, y_WscreenSize)
      VectorSourceColor(RGBA(255,0,0,255))
      StrokePath(0.2)
      
      VectorSourceColor(RGBA(255,255,0,255))
      AddPathCircle(0, 0, 1)
      StrokePath(0.5)
      
      MovePathCursor(-4, 5)
      SaveVectorState()
      FlipCoordinatesY(y_WscreenSize / 2, #PB_Coordinate_User)
      AddPathText("Origin")
      RestoreVectorState()
      FillPath()
      
      MovePathCursor(120,40)
      SaveVectorState()
      FlipCoordinatesY(y_WscreenSize / 2, #PB_Coordinate_User)
      DrawVectorImage(ImageID(0), 255)
      RestoreVectorState()
    EndIf
    
    StopVectorDrawing()
  EndIf
  StatusBarText(0, 0, "World Coord.: " + StrF(Mouse\x_CoordW, 2) + ", " + StrF(Mouse\y_CoordW, 2))
  StatusBarText(0, 1, "Screen Coord.: " + Str(Mouse\x_Can) + ", " + Str(Mouse\y_Can))
EndProcedure

If OpenWindow(0,0,0,1000,800,"Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CanvasGadget(0,0,0,1000,777, #PB_Canvas_Keyboard )
  CreateStatusBar(0,WindowID(0))
  SetActiveGadget(0)
  AddStatusBarField(200)
  AddStatusBarField(200)
  
  LoadFont(0, "Calibri", 20, #PB_Font_Italic)
  LoadImage(0, #PB_Compiler_Home + "examples/Sources/Data/Geebee2.bmp")
  
  BindGadgetEvent(0,    @Ev_MouseWheel(),    #PB_EventType_MouseWheel)
  BindGadgetEvent(0,    @Ev_MouseMove(),       #PB_EventType_MouseMove)
  BindGadgetEvent(0,    @Ev_MousePan(),       #PB_EventType_MiddleButtonDown)
  BindGadgetEvent(0,    @Ev_MousePan(),       #PB_EventType_MiddleButtonUp)
  BindEvent(#Ev_Repaint, @Ev_Repaint())
  
  If StartVectorDrawing(CanvasVectorOutput(0, #PB_Unit_Millimeter))
    ; Init
    x_WscreenSize = VectorOutputWidth()
    y_WscreenSize = VectorOutputHeight()
    StopVectorDrawing()
  EndIf
  
  Mouse\Move = 1 : Mouse\Wheel = 1
  PostEvent(#Ev_Repaint)
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  
EndIf
Avatar de l’utilisateur
Ar-S
Messages : 9475
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Zoom Image avec VectorDrawing()

Message par Ar-S »

Je testerai (là j'ai pas le temps je dois installer un ssd en m2)
Pourquoi ne pas convertir en PB un algo d'interpolation bilinéaire voir bicubique ? ça ne doit pas être si tendu ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Zoom Image avec VectorDrawing()

Message par Kwai chang caine »

Super comme code :D
Je me suis toujours demandé comment se faisait les ZOOM sur des grosses images comme GoogleStreet, qui permettent de zoomer mais aussi de balader la fenêtre avec la souris sur l'image 8O
Je ne sais pas si c'est le même style de code ?? :oops:

En tout cas merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Zoom Image avec VectorDrawing()

Message par Zorro »

Kwai chang caine a écrit : Je me suis toujours demandé comment se faisait les ZOOM sur des grosses images comme GoogleStreet, qui permettent de zoomer mais aussi de balader la fenêtre avec la souris sur l'image 8O

deja fais ici, il y a fort longtemps :

ici : https://www.purebasic.fr/french/viewtop ... ilit=loupe

et il doit y avoir une version encore plus ancienne faite par le Soldat de memoire .... faudrai que je plonge dans mes archives sous les toiles d'araignées ... :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Zoom Image avec VectorDrawing()

Message par Kwai chang caine »

Merci ZORRO 8)
Mais je ne parlais pas spécialement d'une simple loupe :wink:
Je parlais de la méthode qu'utilise GoogleMap, ou l'on peut se déplacer sur une image presque sans fin, pouvoir zoomer sur elle, et après pouvoir aussi déplacer la fenêtre zoomée où l'on veut sur l'image immense :D
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Zoom Image avec VectorDrawing()

Message par Zorro »

je ne sais pas si google map a une limite ou si toute la terre est représenté...
mais si comme je le soupçonne c'est le cas ...

la plupart du temps les prestataires de "Map" proposent leur "territoire" sous different Zoom prédefinis .

donc en clair, tu as la terre ou la france entiere sur un serveur en zoom 16 , en zoom 14 , en zoom 10 etc....
comme si chaque zoom etait un Calque ... d'ailleurs chez Geoportail , on peut activer les calques pour avoir en plus le Cadastre, ou meme les cartes anciennes

et lorsque tu "zoom" tu change en fait de carte , tu change de Calque ....


donc rien d’étonnant la dedans ... c'est juste qu'ils disposent de tres grande Cartes a toutes les resolutions de zoom proposé... :)

a propos des "Zoom" prédéfini, je suis sur de ce que je dis , car Oscar un membre du forum Xplane a créé un utilitaire qui permet de récuperer les cartes vue "Satellite"
pour les plaquer dans l'univers de Xplane (simulateur de vol) , il se paye meme le luxe de recuperer les données de la Nasa pour le relief ...

bref, son utilitaire, te permet de choisir le type de zoom que tu veux ... bien sur plus tu prends dans un Calque-zoom grand , plus ta map va etre grosse (et ça va vite la prise de poids du fichier final)
donc son utilitaire va bien prendre chez le prestataire, les cartes correspondant a un zoom précis et parametrable a l'avance


si tu regarde cette adresse par exemple :
https://www.google.fr/maps/@45.4367663,4.4007562,19.25z

tu vois que le zoom est = a 19.25z <-- le petit z indique le zoom
donc tu re promène sur le calque "19.25"

ici : https://www.google.fr/maps/@45.3794291,4.4856802,12.25z on est sur le caque 12.25z

bref, il ne s'agit pas de Zoom au sens Grossissant, mais de Calques de tel ou tel zoom :)
c'est la raison pour laquel c'est aussi rapide a afficher ...
c'est du précalculé en somme


note qu'entre 2 zoom predefini, il peut y avoir une interpolation proposé par GoogleMap .. c'est pas impossible

ou alors ... Googlemap a sa carte en tres haute résolution , et propose une version reduite en zoom inverse, c'est plus simple de reduire une tres grosse résolution
Que de grossir une resolution de M**de....
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Zoom Image avec VectorDrawing()

Message par Kwai chang caine »

Merci beaucoup ZORRO de cette explication .... 8)
Moi je voyais un truc beaucoup plus compliqué avec des serveurs de dingues qui calculent le grossissement en temps réel :oops:

Perso GoogleMap ça m'a toujours ébouriffé 8O
Quand tu penses que passé un temps, il fallait payer noir pour avoir une photo vue du ciel :lol:
Maintenant, faut se planquer pour pas se retrouver sur le NET en faisant la planche à poil dans sa piscine (surtout coté pile), qui au passage sera taxée "grâce" à cet outil :mrgreen:
Les temps changent .... :roll:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Zoom Image avec VectorDrawing()

Message par blendman »

salut

j'avais aussi testé le zoom avec le lib vectordrawing, mais quand on zooom, les image sont "floutées" (celles qu'on affiche avec un DrawVectorImage(), contrairement à un resizeimage() ou des sprites (avec spritequality()), où on peut gérer si on veut que ça soit flouté ou non.

Vous savez si on peut modifier ça dans la lib vectordrawing, je n'ai pas trouvé ?

merci.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Zoom Image avec VectorDrawing()

Message par microdevweb »

Bonjour,
Voici une bout de code pour la gestion de zoom reprise sur un projet pour l'affichage d'une preview d'impression.

Code : Tout sélectionner

StartVectorDrawing(CanvasVectorOutput(\IdCanvas,\Unity))
      ScaleCoordinates(\ZoomFactor,\ZoomFactor,#PB_Coordinate_User)
Le code complet depuis Github

Attention cependant que si veux gérer des événements souris il faut convertir les coordonnées de la souris

Exemple

Code : Tout sélectionner

Procedure coordianteTo(x,y,*x,*y)
  PokeL(*x,ConvertCoordinateX(x,y,#PB_Coordinate_Device,#PB_Coordinate_User))
  PokeL(*Y,ConvertCoordinateY(x,y,#PB_Coordinate_Device,#PB_Coordinate_User))
EndProcedure 
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre