Zoom et canvas bug
Publié : dim. 19/juil./2015 13:34
salut
je suis parti d'un code de Kernadec, que j'ai modifié afin d'obtenir un zoom avec un canvas.
L'idée :
- lorsqu'on zoom, au lieu d'agrandir toute l'image, j'agrandis uniquement la partie de l'image visible.
- lorsque je déplace l'image, je dois faire un update de la partie à afficher.
C'est particulièrement utile pour de grandes images (> 1024*1024 par exemple), avec un zoom en 500%, ça évite d'avoir une image qui fasse 5*1024 X 5*1024 à afficher. On n'affiche que sur la portion de notre écran.
On pourrait donc travailler sur des images en 10000*10000 sans problème car en réalité, on n'afficherait toujours que du 1200*800 environ (en fait, ça dépendrait de notre résolution et de quelques paramètres (tailles des panels si on en mets sur les cotés...)).
Cependant, j'ai quelques bugs avec ce code et je ne parviens pas à les résoudre (je tâtonne ^^). Donc si quelqu'un comprend comment modifier ça, ça pourrait être super utile pour utiliser de grandes images avec le canvas et les images, ce qui est un des gros problèmes actuellement
.
Merci
.
je suis parti d'un code de Kernadec, que j'ai modifié afin d'obtenir un zoom avec un canvas.
L'idée :
- lorsqu'on zoom, au lieu d'agrandir toute l'image, j'agrandis uniquement la partie de l'image visible.
- lorsque je déplace l'image, je dois faire un update de la partie à afficher.
C'est particulièrement utile pour de grandes images (> 1024*1024 par exemple), avec un zoom en 500%, ça évite d'avoir une image qui fasse 5*1024 X 5*1024 à afficher. On n'affiche que sur la portion de notre écran.
On pourrait donc travailler sur des images en 10000*10000 sans problème car en réalité, on n'afficherait toujours que du 1200*800 environ (en fait, ça dépendrait de notre résolution et de quelques paramètres (tailles des panels si on en mets sur les cotés...)).
Cependant, j'ai quelques bugs avec ce code et je ne parviens pas à les résoudre (je tâtonne ^^). Donc si quelqu'un comprend comment modifier ça, ça pourrait être super utile pour utiliser de grandes images avec le canvas et les images, ce qui est un des gros problèmes actuellement

Code : Tout sélectionner
;{ Infos
; code de kernadec,
; modifié par blendman 2015
;}
;{ constantes
#Window = 0
Enumeration ; images
#Image0
#Image1
EndEnumeration
Enumeration ; gadgets
#Scroll
#canvas
EndEnumeration
;}
Global PosYm1, PosXm1, delta
;{ Procedures
Procedure UpdateCanvas(x=0,y=0)
; puis on update le canvas
If StartDrawing(CanvasOutput(#canvas))
Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
; DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),255)
DrawAlphaImage(ImageID(#Image1),x,y)
StopDrawing()
EndIf
EndProcedure
;}
UseJPEGImageDecoder()
file$ = OpenFileRequester("image","","jpg|*.jpg",0)
If file$ <> ""
LoadImage(#Image0, file$)
CreateImage(#Image1,ImageWidth(#Image0),ImageHeight(#Image0),32,#PB_Image_Transparent)
CopyImage(#Image0,#Image1) ; crée une copie de l'image pour eviter la degradation de resize
If OpenWindow(#Window,0, 0,ImageWidth(#Image0)+20,ImageHeight(#Image0)+20, "Zoom Canvas ScrollArea clic deplace Kernadec",
#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
If ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White)
If CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_Keyboard)
EndIf
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
; SetActiveGadget(#canvas) ; focus Canvas : MouseWheel
UpdateCanvas(0)
CloseGadgetList()
EndIf
bm=#False
Repeat
Event= WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #canvas
Select EventType()
Case #PB_EventType_MouseWheel
delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*10) ; delta*10
If PosXm1+(delta/2) > 0
x1 = PosXm1+(delta/2)
EndIf
If PosYm1+(delta/2) > 0
y1 = PosYm1+(delta/2)
EndIf
If x1 > 0 And y1 > 0
ratio.d = ImageHeight(#Image0)/ImageWidth(#Image0)
w = ImageWidth(#Image0)-delta
h = ImageHeight(#Image0)-delta*ratio
If w > ImageWidth(#Image0)
w = ImageWidth(#Image0)
w1 = w + delta
Else
w1 = ImageWidth(#Image0)
EndIf
If h > ImageHeight(#Image0)
h = ImageHeight(#Image0)
h1 = h + delta*ratio
Else
h1 = ImageHeight(#Image0)
EndIf
; Debug Str(w)+"/"+Str(h)
GrabImage(#Image0,#Image1,x1,y1,w,h)
; on calcule pour resizer l'image si notre nouvelle image est plus grande ou plus petite.ON ne recalcule l'image que si elle est plus grande.
ResizeImage(#Image1,w1,h1,#PB_Image_Raw)
EndIf
UpdateCanvas(0,0)
Case #PB_EventType_LeftButtonDown ; choix du bouton deplacer
bm=#True
PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
Case #PB_EventType_MouseMove ; deplacement
If bm=#True
If space= 1
PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
x = PosXm1 ;+(delta/2)
y = PosYm1 ;+(delta/2)
If StartDrawing(CanvasOutput(#canvas))
Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
DrawAlphaImage(ImageID(#Image1),x,y,255)
StopDrawing()
EndIf
Else
EndIf
EndIf
Case #PB_EventType_LeftButtonUp
If bm = #True
bm=#False
If delta > 0
x1 = PosXm1 - PosXm
If x1 < 0
x1 = 0
EndIf
y1 = PosYm1 - PosYm
If y1 < 0
y1 = 0
EndIf
ratio.d = ImageHeight(#Image0)/ImageWidth(#Image0)
w = ImageWidth(#Image0)-delta
h = ImageHeight(#Image0)-delta*ratio
GrabImage(#Image0,#Image1,x1,y1,w,h)
ResizeImage(#Image1,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Image_Raw)
UpdateCanvas(0,0)
EndIf
EndIf
Case #PB_EventType_KeyUp
space = 0
Case #PB_EventType_KeyDown ; deplacement
key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
If key = 32 ; space
space= 1
EndIf
EndSelect
EndSelect
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
End
EndIf
EndIf
