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é.
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.
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