Page 1 sur 4

ZOOM Souris

Publié : mar. 12/juil./2011 12:41
par kernadec
Bonjour à tous
@blendman peut etre que ce zoom va ta convenir,
j'ai pas eu beaucoup de temps ....
et pas le temps non plus de faire un truc sans flip :mrgreen:

Cordialement

Code : Tout sélectionner

;#################################################
;#### Kernadec  ZOOM  souris  PB 4.40 et +                              ####
;#################################################
#Zoom=200
#Echelle=8
Global c.l,d.l
OpenWindow(0,0, 0,600,600, "Zoom Souris kernadec", #WS_SYSMENU|#PB_Window_WindowCentered )

LoadImage(0, "c:\purebasic\examples\sources\data\Geebee2.bmp") 

Procedure dessin(i)
  
  StartDrawing(WindowOutput(0))
  DrawingMode(1)
  Box(0,0,WindowWidth(0),WindowHeight(0),RGB(225,225,225))
  DrawingMode(4)
  
  mx=WindowMouseX(0)
  my=WindowMouseY(0)
  
  zm=i-#zoom
  
  coofa.d =(mx/600)*#Echelle
  coofb.d =(my/600)*#Echelle
  
  a=(zm*coofa)-(zm/2)
  b=(zm*coofb)-(zm/2)
  c=(600-zm*#Echelle)+zm
  d=(600-zm*#Echelle)+zm
  
  ;Box(a,b,c,d,RGB(255,0,0))                           ;test box  
  
  DrawImage(ImageID(0),a,b,c,d)                        ;test image
  Delay(200)
  
  StopDrawing()
  
  ProcedureReturn i
EndProcedure

Procedure boucle()
  For i=0 To (#Echelle*45)  Step #Echelle
    dessin(i)
    If c<0 Or d<0: Break: EndIf
  Next i 
  For i=(#Echelle*45)-(#Zoom/2) To 0  Step -#Echelle
    dessin(i)
  Next i 
EndProcedure

Repeat
  Event= WaitWindowEvent()
  
  boucle()
  
Until Event= #PB_Event_CloseWindow


Re: ZOOM Souris

Publié : mer. 13/juil./2011 12:05
par blendman
Ah oui, pas mal du tout, je regarderai ça à l'occasion pour voir comment ça fonctionne en détail ;).

merci :D

Re: ZOOM Souris

Publié : mer. 13/juil./2011 12:48
par Backup
j'ai juste ajputé un "WaitWindowEvent()"
dans la procedure Boucle
car chez moi , ça finissait par faire screen blanc au bout d'un certain temps "certain "

;)

finalement j'ai reedité ce code , pour retirer le traitement de la procedure Boucle()

pour le mettre dans la boucle principale
l’empilement de procédure, n'est pas si judicieux
ça creait un problème avec les event() ....
(d’où la modification que j'avais apporté ci dessus ... )

(voir le code plus bas ..)

Re: ZOOM Souris

Publié : mer. 13/juil./2011 14:45
par Backup
correction du flipping :)

j'ai mis du temps , j'en ai profité pour corriger des bugs sur mon EPB :lol:

Code : Tout sélectionner

;#################################################
;#### Kernadec  ZOOM  souris  PB 4.40 et +                              ####
;#################################################
; Nettoyé par Dobro
UseJPEGImageDecoder()
Declare  dessin(i)
Enumeration
	#window
	#image
EndEnumeration

#Zoom=500
#Echelle=8


Global c.l,d.l
OpenWindow(#window,0, 0,600,600, "Zoom Souris kernadec", #WS_SYSMENU|#PB_Window_WindowCentered )

LoadImage(#image, "C:\Dobro\Mes_Photos\le destin de Lisa\alexandra_neldel_01.jpg")


Repeat
	Event= WaitWindowEvent()
	StartDrawing(WindowOutput(#window))
		; *********** boucle *******************
		For i=0 To (#Echelle*45)  Step #Echelle
			dessin(i)
		Next i
		
		For i=(#Echelle*45) To 0  Step -#Echelle
			dessin(i)
		Next i
		; **************************************
	StopDrawing()
Until Event= #PB_Event_CloseWindow
end

Procedure dessin(i)  
	Box(0,0,WindowWidth(#window),WindowHeight(#window),RGB(225,225,225))
	DrawingMode(4)
	
	mx=WindowMouseX(0)
	my=WindowMouseY(0)
	
	zm=i-#zoom
	
	coofa.d =(mx/600)*#Echelle
	coofb.d =(my/600)*#Echelle
	
	a=(zm * coofa)-(zm/2)
	b=(zm * coofb)-(zm/2)
	c=(600-zm*#Echelle)+zm
	d=(600-zm*#Echelle)+zm
	
	DrawImage(ImageID(#image),a,b,c,d)                        ;test image
	ProcedureReturn i
EndProcedure



;
; EPb


Re: ZOOM Souris

Publié : mer. 13/juil./2011 15:04
par blendman
Ah j'ai regardé et c'est super, car c'est un vrai zoom :)
On n'agrandit pas l'image mais les pixels à l'affichage, c'est ça ?

EDIT :
ah mince, je viens de voir que ce n'est pas valable pour les images avec alpha et qu'on n'a pas non plus de flag comme celui de resizeImage() : #PB_Image_Raw et #PB_Image_Smooth.
Je cherche à faire un zoom classique (pas un redimensionnement d'image), sans interpolation.

C'est possible de faire ça ?

Re: ZOOM Souris

Publié : mer. 13/juil./2011 17:30
par Backup
................

Re: ZOOM Souris

Publié : mer. 13/juil./2011 17:58
par blendman
Merci beaucoup pour ton exemple, je vais regarder ça.
la partie de 100X100 que tu regarde te montrera une partie zoomé de ton image
oui, en fait l'idéal serait de faire un redimensionnement uniquement d'une partie de l'image, mais pas de toute l'image, pour y travailler (sur un calque précis).
Cela éviterait de faire complètement ramer la machine lorsque l'on fait un zoom en 1600% sur une image de 4000*4000 :D.

C'est ce que j'espère arriver à faire pour mon logiciel animatoon, pour avoir un zoom qui soit utilisable sur des très grandes images ;).

Encore merci.

Re: ZOOM Souris

Publié : mer. 13/juil./2011 18:00
par Backup
blendman a écrit :oui, en fait l'idéal serait de faire un redimensionnement uniquement d'une partie de l'image, mais pas de toute l'image, pour y travailler (sur un calque précis).
et ben rien ne t’empêche de te faire une image 2 avec une portion de l'image a zoomer

puis tu redimensionne ton image 2 :)

Re: ZOOM Souris

Publié : mer. 13/juil./2011 20:28
par kernadec
bonsoir
merci, Dobro pour avoir passé du temps sur mon code merdeux :?
mais ce matin, je l'ai utilisé avec un mode clic souris et il n'était pas très maniable après coup..
donc j'ai repensé tout ça et je me suis dit qu' avec une projection d'angle depuis la position de la souris
serait peut être la solution, En rentrant ce soir j'ai fais un code et je pense que c'est mieux, et le réglage plus simple
il y a encore quelques imperfections, mais ce mode de zoom semble être la solution. :)

mais l'autre code pourras dans un autre cas de figure avoir une utilité. :)

Et puis, je sais pas comment résoudre le cas de drawalphaimage
avec une récursivité de Resizeimage sans utiliser la copie de celle ci, désolé, blendman

Ajout de quelques lignes pour la visualisation des repères.

Cordialement

Code : Tout sélectionner

;#########################################################################
;###   Zoom Focus souris Wheel scroll canvas deplacement de l'image     ###
;###      avec la Souris  et gestion zoom de l'alpha                    ###
;###       par kernadec  juillet 2011  Ver:  PB 4.60 b3                 ###
;#########################################################################
Enumeration
  #Window
  #Image0  
  #Image1 
  #Scroll
  #canvas
EndEnumeration
Global PosXm.l,PosYm.l,PosXm1.l,PosYm1.l,delta.l,MX.l,MY.l,MX1.l,MY1.l
win_w=600 
win_h=600 
image_w.l=800 
image_h.l=800 
delta=2
mx=400
my=400

ExamineDesktops()
CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(#Image1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(#Image0, "c:\purebasic\examples\sources\data\Geebee2.bmp") 
ResizeImage(#Image0,image_w,image_h,#PB_Image_Smooth)       

CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize

OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Focus Canvas ScrollArea clic zoom ou deplace  Kernadec", #WS_SYSMENU|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0)*2,ImageHeight(#Image0)*2,30)
SetWindowColor(#Window,#White) 
CanvasGadget(#canvas,0,0,ImageWidth(#Image0)*2,ImageHeight(#Image0)*2,#PB_Canvas_DrawFocus|#PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
bm=#False:

StartDrawing(CanvasOutput(#canvas))
Box(0,0,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
; DrawingMode(#PB_2DDrawing_AlphaBlend )
  DrawImage(ImageID(#Image0),0,0,image_w,image_h) 
; DrawAlphaImage(ImageID(#Image0),0,0,255)
StopDrawing()
 
Procedure Zoom_Canvas(zoomAlpha)
 If zoomAlpha=1
  CopyImage(#Image1,#Image0)      ;position de copie ici... restore l'image originale  
 EndIf

 If delta>16:delta=16:EndIf
 If delta<1:delta=1: EndIf
 
 NLG_IM=(ImageWidth(#Image0))                         ;Largeur Image
 NHT_IM=(ImageHeight(#Image0))                       ;Hauteur Image  
 
 PIX_HG=PosXm1                                               ;Point Image X Haut Gauche 
 PIY_HG=PosYm1                                               ;Point Image Y Haut Gauche                                               
 PIX_HD=PIX_HG+NLG_IM                                    ;Point Image X Haut Droit 
 PIY_HD=PIY_HG                                                ;Point Image Y Haut Droit
 PIX_BG=PIX_HG                                                ;Point Image X Bas Gauche
 PIY_BG=PIY_HG+NHT_IM                                    ;Point Image Y Bas Gauche
 PIX_BD=PIX_HG+NLG_IM                                     ;Point Image X Bas Droit
 PIY_BD=PIY_HG+NHT_IM                                    ;Point Image Y Bas Droit
 
 DIA_X=PIX_HG-MX                                             ;Distance XHG img avec Position X souris 
 DIA_Y=PIY_HG-MY                                             ;Distance YHG img avec Position Y souris
 DIB_X=(PIX_HG+NLG_IM)-MX                               ;Distance XBD img avec Position X souris 
 DIB_Y=(PIY_HG+NHT_IM)-MY                               ;Distance YBD img avec Position Y souris 
 
 ANG_A.d=ATan((DIA_Y/DIA_X))+#PI                     ;Angle position et souris point Haut Gauche 
 RA=Sqr(Pow(DIA_Y,2)+Pow(DIA_X,2))*(delta/4)     ;Calcul hypoténuse pour calcul rayon projeté

 PXA=MX+RA*Cos(ANG_A)                                    ;projection depuis la souris du point HX de l'image
 PYA=MY+RA*Sin(ANG_A)                                     ;projection depuis la souris du point HY de l'image
                ;                      delta / 4 = taux du zoom
 ANG_B.d=ATan((DIB_Y/DIB_X))                             ;Angle position et souris point bas droit
 RB=Sqr(Pow(DIB_Y,2)+Pow(DIB_X,2))*(delta/4)       ;Calcul hypoténuse pour calcul rayon projeté
 PXB=MX+RB*Cos(ANG_B)                                     ;projection depuis la souris du point BX de l'image
 PYB=MY+RB*Sin(ANG_B)                                       ;projection depuis la souris du point BY de l'image
 NLG_IMG=Abs(PXB-PXA)                                       ;Calcul la nouvelle largeur de l'image
 NHT_IMG=Abs(PYB-PYA)                                       ;Calcul la nouvelle Hauteur de l'image
 If zoomAlpha=1
   ResizeImage(#Image0,NLG_IMG ,NHT_IMG,#PB_Image_Smooth)
 EndIf  
 StartDrawing(CanvasOutput(#canvas))
 If IsImage(#Image0)                            ; test init #image 
    If zoomAlpha=0
     Box(0,0,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
     DrawImage(ImageID(#Image0),PXA, PYA,NLG_IMG ,NHT_IMG) 
     DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0)
   Else
     Box(0,0,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
     DrawAlphaImage(ImageID(#Image0),PXA,PYA,150)
     DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0)
   EndIf 
 EndIf  
  
 Circle(WindowWidth(#Window)/2,WindowHeight(#Window)/2,5,#Green)
 Circle(GadgetWidth(#canvas)/2,GadgetHeight(#canvas)/2,7,#Cyan)

 ; visualisation des axes
 LineXY(PXA,PYA,mx1,my1,#Black)
 LineXY(PXA,PYA+NHT_IMG,mx1,my1,#Black)
 LineXY(PXA+NLG_IMG,PYA,mx1,my1,#Black)
 LineXY(PXA+NLG_IMG,PYA+NHT_IMG,mx1,my1,#Black)   
  
 LineXY(mx1,my1,mx1+(PXA-mx1),my1,#Red)
LineXY(mx1,my1,mx1,my1+(PYB-my1),#Red)
  
 Circle(mx1+((PXA+(NLG_IMG/2))-mx1),my1+((PYA+(NHT_IMG/2))-my1),5,#Yellow)
  
 Circle(mx1+((PXA+(NLG_IMG/2))-mx1),my1,5,#Red)
 Circle(mx1,my1+((PYA+(NHT_IMG/2))-my1),5,#Blue)
 
 LineXY(mx1,my1,mx1+((PXA+(NLG_IMG/2))-mx1),my1,#Blue)
 LineXY(mx1,my1,mx1,my1+((PYA+(NHT_IMG/2))-my1),#Blue)
 LineXY(mx1+((PXA+(NLG_IMG/2))-mx1),my1+((PYA+(NHT_IMG/2))-my1),mx1+((PXA+(NLG_IMG/2))-mx1),my1,#Green)
 LineXY(mx1+((PXA+(NLG_IMG/2))-mx1),my1+((PYA+(NHT_IMG/2))-my1),mx1,my1+(( PYA+(NHT_IMG/2))-my1),#Green)
 Circle(mx1,my1,5,#Black)
 Circle(mx1,my1,2,#White)
 
 StopDrawing()  
EndProcedure
  

  
Repeat
  Event= WaitWindowEvent()
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel      
  Select EventType()  
    Case #PB_EventType_MouseWheel  
      delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )) ; delta*10
      MX = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
      MY = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY) 
      Zoom_Canvas(0)  ; 1 = valeur zoom drawAlphaimage
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      MX = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
      MY = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)
      delta=delta-1
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1  
      MX = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
      MY = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)
      delta=delta+1
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
      EndIf
      MX1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
      MY1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)
      Zoom_Canvas(0)   ; 1 = valeur zoom drawAlphaimage
    Case #PB_EventType_LeftButtonUp
      bm=#False  
      
    Case #PB_EventType_RightButtonUp    
      bm=#False
  EndSelect  
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      win_w=WindowWidth(#Window)
      win_h=WindowHeight(#Window)
  EndSelect  
Until Event= #PB_Event_CloseWindow

Re: ZOOM Souris

Publié : jeu. 14/juil./2011 9:58
par blendman
super ce dernier code !

Il va falloir que je l'intègre à mon logiciel dis donc, en espérant que j'arrive à le rendre compatible (on ne sait jamais).
Et puis, je sais pas comment résoudre le cas de drawalphaimage
avec une récursivité de Resizeimage sans utiliser la copie de celle ci
pas de soucis ;)
et puis, j'essayerai par la suite de ne faire une copie que de ce que l'on voit à l'écran + 1 bordure (genre 10 à 50 pixels)

Re: ZOOM Souris

Publié : jeu. 14/juil./2011 10:00
par Atomo
Je ne sais pas si c'est ce que tu recherches Blendman mais j'ai fait ce code qui permet de clipper une portion d'image et de la redimentionner à l'affichage, le canal alpha est respecté et c'est plutot rapide (à tester sans debugger):

Code : Tout sélectionner

Structure PixelsArray
  Width.i
  Height.i
  Array Pixel.i(0)
EndStructure

Procedure GetPixelsArray(Output, *PixelsArray.PixelsArray)
  StartDrawing(Output)
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    *PixelsArray\Width = OutputWidth()
    *PixelsArray\Height = OutputHeight()
    Dim *PixelsArray\Pixel((OutputWidth()*OutputHeight())-1)
    For y=0 To OutputHeight()-1
      For x=0 To OutputWidth()-1
        Color = Point(x, y)
        If OutputDepth() <> 32 : Color = RGBA(Red(Color), Green(Color), Blue(Color), 255) : EndIf
        *PixelsArray\Pixel(i) = Color
        i+1
      Next x
    Next y
  StopDrawing()
EndProcedure

Procedure DrawAlphaClippedImage(*PixelsArray.PixelsArray, x1, y1, w1, h1, x2, y2, w2, h2, Alpha)
  x_ratio.f = w1/w2
  y_ratio.f = h1/h2
  alpha_ratio.f = Alpha/255
  
  For y=0 To h2-1
    If y2+y >= 0
      If y2+y >= OutputHeight() : Break : EndIf
      py = y1+Int(y*y_ratio)
      For x=0 To w2-1
        If x2+x >= 0
          If x2+x >= OutputWidth() : Break : EndIf
          px = x1+Int(x*x_ratio)
          Color = *PixelsArray\Pixel(py**PixelsArray\Width+px)
          If Alpha(Color)
            Plot(x2+x, y2+y, RGBA(Red(Color), Green(Color), Blue(Color), Alpha(Color)*alpha_ratio))
          EndIf
        EndIf
      Next x
    EndIf
  Next y
EndProcedure

;Exemple
PixelsArray.PixelsArray
Image = LoadImage(#PB_Any, "")
GetPixelsArray(ImageOutput(Image), @PixelsArray)
FreeImage(Image)

Image2 = CreateImage(#PB_Any, 400, 400, 32)
StartDrawing(ImageOutput(Image2))
  DrawAlphaClippedImage(@PixelsArray, 0, 0, 32, 32, 0, 0, 400, 400, 255)
StopDrawing()
  
Window = OpenWindow(#PB_Any, 0, 0, 400, 400, "Window")
If Window
  ImageGadget(#PB_Any, 0, 0, 400, 400, ImageID(Image2))
  Repeat
    Event = WaitWindowEvent(1)
  Until Event = #PB_Event_CloseWindow
EndIf 

Re: ZOOM Souris

Publié : jeu. 14/juil./2011 10:10
par Backup
@Atomo : division par Zero en ligne 51 ;)

Re: ZOOM Souris

Publié : jeu. 14/juil./2011 10:12
par Atomo
En ligne 51 j'ai ça :

Code : Tout sélectionner

Image2 = CreateImage(#PB_Any, 400, 400, 32)
Je ne vois pas comment il peut y avoir une division par zéro.
J'ai oublié de préciser, il faut remplacer les valeurs de x1, x2 etc... de la ligne 53 par des valuers valides.

Re: ZOOM Souris

Publié : jeu. 14/juil./2011 10:27
par kernadec
salut

ligne 25 chez moi

Code : Tout sélectionner

  x_ratio = ((w1<<16)/w2)+1
  y_ratio = ((h1<<16)/h2)+1
Cordialement

Re: ZOOM Souris

Publié : jeu. 14/juil./2011 10:31
par Atomo
Modifie les valeurs de la ligne 53.