ZOOM Souris
Re: ZOOM Souris
Tu peux me passer le code que tu utilises ainsi que l'image d'origine ?
Je n'arrive pas à reproduire le bug.
Je n'arrive pas à reproduire le bug.
Re: ZOOM Souris
yep 
le code :
l'image :

Système :
windows xp

le code :
Code : Tout sélectionner
Structure PixelsArray
Width.i
Height.i
Array Pixel.i(0)
EndStructure
Procedure GetPixelsArray(Image, *PixelsArray.PixelsArray)
StartDrawing(ImageOutput(Image))
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
For y=0 To h2-1
If y2+y >= 0 And y2+y < OutputHeight()
py = (y1+y*y_ratio)**PixelsArray\Width
For x=0 To w2-1
If x2+x >= 0 And x2+x < OutputWidth()
px = x1+x*x_ratio
Color = *PixelsArray\Pixel(py+px)
If Alpha(Color)
Percent.f = Alpha/255
Plot(x2+x, y2+y, RGBA(Red(Color), Green(Color), Blue(Color), Alpha(Color)*Percent))
EndIf
EndIf
Next x
EndIf
Next y
EndProcedure
;Exemple
PixelsArray.PixelsArray : UseJPEGImageDecoder()
Image = LoadImage(#PB_Any, "1.jpg")
GetPixelsArray(Image, @PixelsArray)
FreeImage(Image)
Image2 = CreateImage(#PB_Any, 400, 400, 32)
StartDrawing(ImageOutput(Image2))
DrawAlphaClippedImage(@PixelsArray, 0, 0, ImageWidth(image)/8, ImageHeight(image)/8, 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

Système :
windows xp
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
Ca devrait être bon, j'ai édité le code en première page, merci pour ta colaboration 

Re: ZOOM Souris
yep, ça marche nickel 
merci à toi

merci à toi

http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
Je viens de corriger un autre bug lié au redimentionnement, j'ai mis à jour le code en première page.
Re: ZOOM Souris
super , je regarde ça tout de suiteAtomo a écrit :Je viens de corriger un autre bug lié au redimensionnement, j'ai mis à jour le code en première page.

Dis-moi, je me demandais si je pouvais utiliser ce code pour 2 choses :
1. tout d'abord pour faire un zoom"classique", comme tu le fais (avec mon logiciel animatoon) sur l'image (celle-ci est composée de plusieurs calques, avec des mode de fusion/opacité, etc..)
2. pour créer une copie du document (donc de tous les calques en cours), et de travailler dessus mais uniquement ce qui est affiché (les pixels affichés). Je dessinerai sur mon calque actif, mais n'afficherai que ce 2ème document (les pixels affichés).
c'est possible ce genre de choses ?
EDIT :
Bon, j'ai testé le zoom et ça fonctionne vachement bien , sauf que j'ai un bug si je dézoome au maximum :
Le code :
Code : Tout sélectionner
Structure PixelsArray
Width.i
Height.i
Array Pixel.i(0)
EndStructure
Global zoom.d = 0.5
Procedure GetPixelsArray(Image, *PixelsArray.PixelsArray)
StartDrawing(ImageOutput(Image))
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
For y=0 To h2-1
If y2+y >= 0 And y2+y < OutputHeight()
py = y1+Int(y*y_ratio)
For x=0 To w2-1
If x2+x >= 0 And x2+x < OutputWidth()
px = x1+Int(x*x_ratio)
Color = *PixelsArray\Pixel(py**PixelsArray\Width+px)
If Alpha(Color)
Percent.f = Alpha/255
Plot(x2+x, y2+y, RGBA(Red(Color), Green(Color), Blue(Color), Alpha(Color)*Percent))
EndIf
EndIf
Next x
EndIf
Next y
EndProcedure
Procedure resize_zoom(image2, image)
StartDrawing(ImageOutput(Image2))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(255,255,255,0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaClippedImage(@PixelsArray, 0, 0, ImageWidth(image)*zoom, ImageHeight(image)*zoom, 0, 0, 640, 480, 255)
StopDrawing()
EndProcedure
;Exemple
PixelsArray.PixelsArray : UseJPEGImageDecoder() : UsePNGImageDecoder()
file$ = OpenFileRequester("image","","PNG|*.png|JPG|*.jpg",1)
If file$<>""
Image = LoadImage(#PB_Any, file$)
GetPixelsArray(Image, @PixelsArray)
FreeImage(Image)
Image2 = CreateImage(#PB_Any, 640, 480, 32)
StartDrawing(ImageOutput(Image2))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(255,255,255,0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaClippedImage(@PixelsArray, 0, 0, ImageWidth(image)*zoom, ImageHeight(image)*zoom, 0, 0, 640, 480, 255)
StopDrawing()
;resize_zoom(image2, image)
Window = OpenWindow(#PB_Any, 0, 0, 640, 480, "Window")
If Window
ImageGadget(0, 0, 0, 640, 480, ImageID(Image2))
Repeat
Event = WaitWindowEvent(1)
Select event
Case #WM_KEYDOWN
If EventwParam() = #VK_ADD
zoom - 0.5
ElseIf EventwParam() = #VK_SUBTRACT
zoom + 0.5
EndIf
StartDrawing(ImageOutput(Image2))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(255,255,255,0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaClippedImage(@PixelsArray, 0, 0, ImageWidth(image)*zoom, ImageHeight(image)*zoom, 0, 0, 640, 480, 255)
StopDrawing()
SetGadgetState(0,ImageID(Image2))
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Else
End
EndIf
Code : Tout sélectionner
array index out of bounds
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
Tu as un crash car ta zone de clip définie par les paramètres x1, y1, w1, h1 dépasse les limites de l'image, tu essayes de capturer du vide en gros.
J'ai modifié le code en page 1, au lieu de passer une Image à la fonction GetPixelsArray(), tu dois maintenant passer un DrawingOutput() du genre ImageOutput() ou CanvasOutput(), ça permet de faire des zoom à partir d'une image ou d'un canvas.
Concernant tes 2 questions, je dirais que c'est possible mais il faut que tu saches que GetPixelsArray() doit être appelé à chaque fois que ton image source est modifiée car cette fonction fait un instantané d'une image à un moment T.
PS : dans ton dernier code, je vois que tu as un FreeImage(Image) en ligne 66 et après tu appels des fonctions comme ImageWidth(Image) alors que l'image n'existe plus.
Le mieux à faire si tu n'as plus besoin de l'image après avoir récupéré ses pixels dans un tableau avec la fonction GetPixelsArray() c'est de supprimer celle-ci pour libérer de la mémoire et de faire appel aux champs Width et Height de ta variable structurée PixelsArray pour avoir ses dimensions comme ceci : PixelsArray\Width et PixelsArray\Height.
J'ai modifié le code en page 1, au lieu de passer une Image à la fonction GetPixelsArray(), tu dois maintenant passer un DrawingOutput() du genre ImageOutput() ou CanvasOutput(), ça permet de faire des zoom à partir d'une image ou d'un canvas.
Concernant tes 2 questions, je dirais que c'est possible mais il faut que tu saches que GetPixelsArray() doit être appelé à chaque fois que ton image source est modifiée car cette fonction fait un instantané d'une image à un moment T.
PS : dans ton dernier code, je vois que tu as un FreeImage(Image) en ligne 66 et après tu appels des fonctions comme ImageWidth(Image) alors que l'image n'existe plus.
Le mieux à faire si tu n'as plus besoin de l'image après avoir récupéré ses pixels dans un tableau avec la fonction GetPixelsArray() c'est de supprimer celle-ci pour libérer de la mémoire et de faire appel aux champs Width et Height de ta variable structurée PixelsArray pour avoir ses dimensions comme ceci : PixelsArray\Width et PixelsArray\Height.
Re: ZOOM Souris
Salut Atomo.
Merci pour les explications.
Sais-tu s'il est possible de dézoomer plus que la taille de base du tableau ?
Ou il faudrait que j'ajoute des pixels vides autour de mon image quand je la charge par exemple ?
En tout cas, un grand merci, car ça fonctionne super ce code.
Je posterai un petit exemple avec le "pan" (le déplacement avec le clic left +la touche espace appuyée comme dans toshopz
).
Merci pour les explications.
Sais-tu s'il est possible de dézoomer plus que la taille de base du tableau ?
Ou il faudrait que j'ajoute des pixels vides autour de mon image quand je la charge par exemple ?
En tout cas, un grand merci, car ça fonctionne super ce code.
Je posterai un petit exemple avec le "pan" (le déplacement avec le clic left +la touche espace appuyée comme dans toshopz

http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
salut Atomo
Voici un test avec calque et mode peinture
J'aimerai peindre sur le calque et lorsque je dézoome/zoome ou bouge le calque et bien ce que j'ai peint bouge ou soit zoomé/dézoomé.
Pour cela, comment dois-je m'y prendre ?
Merci encore 
Voici un test avec calque et mode peinture

J'aimerai peindre sur le calque et lorsque je dézoome/zoome ou bouge le calque et bien ce que j'ai peint bouge ou soit zoomé/dézoomé.
Pour cela, comment dois-je m'y prendre ?

Code : Tout sélectionner
;{ variable, global
Global zoom.d = 0.5, decal_x.w, decal_y.w
Global x1.w, y1.w,x2.w, y2.w
Global event.i, draw.b,
;}
;{ Init
If UseJPEGImageDecoder() =0 Or UsePNGImageDecoder() = 0
MessageRequester("Error", "Impossible de charger les decoders images")
End
EndIf
;}
;{ structures
Structure PixelsArray
Width.i
Height.i
Array Pixel.i(0)
EndStructure
Global PixelsArray.PixelsArray, layer1.PixelsArray
;}
;{ procedures
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
For y=0 To h2-1
If y2+y >= 0 And y2+y < OutputHeight()
py = y1+Int(y*y_ratio)
For x=0 To w2-1
If x2+x >= 0 And x2+x < OutputWidth()
px = x1+Int(x*x_ratio)
Color = *PixelsArray\Pixel(py**PixelsArray\Width+px)
If Alpha(Color)
Percent.f = Alpha/255
Plot(x2+x, y2+y, RGBA(Red(Color), Green(Color), Blue(Color), Alpha(Color)*Percent))
EndIf
EndIf
Next x
EndIf
Next y
EndProcedure
Procedure update_canvas_()
StartDrawing(CanvasOutput(1))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(0,0,0,0))
DrawingMode(#PB_2DDrawing_Default)
DrawImage(ImageID(1),0,0)
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(99),0,0)
DrawAlphaImage(ImageID(100),0,0)
StopDrawing()
EndProcedure
Procedure paint()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Select EventType()
Case #PB_EventType_MouseMove
If draw = 1
x1 = GetGadgetAttribute(1,#PB_Canvas_MouseX)
y1 = GetGadgetAttribute(1,#PB_Canvas_MouseY)
SetWindowTitle(0,Str(x1)+ ","+Str(y1))
StartDrawing(ImageOutput(100))
DrawingMode(#PB_2DDrawing_AlphaBlend)
LineXY(x1,y1,x2,y2,RGBA(0,0,0,255))
StopDrawing()
update_canvas_()
x2 = x1
y2 = y1
EndIf
Case #PB_EventType_LeftButtonDown
draw = 1
x1 = GetGadgetAttribute(1,#PB_Canvas_MouseX)
y1 = GetGadgetAttribute(1,#PB_Canvas_MouseY)
x2 = x1
y2 = y1
Case #PB_EventType_LeftButtonUp
draw = 0
EndSelect
EndSelect
EndSelect
EndProcedure
Procedure event_zoom()
Select event
Case #WM_KEYDOWN
If EventwParam() = #VK_ADD
If zoom > 1
zoom - 0.5
ElseIf zoom>0.2 And zoom<=1
zoom - 0.1
ElseIf zoom <=0.2 And zoom>0.02
zoom - 0.01
EndIf
ElseIf EventwParam() = #VK_SUBTRACT
If zoom <0.8 And zoom > 0.1
zoom + 0.1
ElseIf zoom>0.01 And zoom<=0.1
zoom +0.01
EndIf
EndIf
If EventwParam() = #VK_RIGHT
If decal_x <ImageWidth(0)+640/2
decal_x + 30
EndIf
ElseIf EventwParam() = #VK_LEFT
If decal_x >30
decal_x - 30
EndIf
EndIf
If EventwParam() = #VK_DOWN
If decal_y <ImageHeight(0)+480/2
decal_y + 20
EndIf
ElseIf EventwParam() = #VK_UP
If decal_y >30
decal_y - 30
EndIf
EndIf
StartDrawing(ImageOutput(99))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(255,255,255,0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaClippedImage(@PixelsArray, decal_X, decal_y, (PixelsArray\Width)*zoom, (PixelsArray\Height)*zoom, 0, 0, 640, 480, 255)
DrawAlphaClippedImage(@layer1, decal_X, decal_y, (layer1\Width)*zoom, (layer1\Height)*zoom, 0, 0, 640, 480, 50)
StopDrawing()
SetWindowTitle(0,"zoom : " +StrD(zoom))
update_canvas_()
EndSelect
EndProcedure
;}
;{ images (load and create)
file$ = OpenFileRequester("image","","JPG|*.jpg|PNG|*.png",1)
If file$<>""
LoadImage(0, file$)
GetPixelsArray(ImageOutput(0), @PixelsArray)
FreeImage(0)
; the Background
CreateImage(1, 640, 480, 32)
StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(180,180,180,255))
StopDrawing()
; a layer image
CreateImage(99, 640, 480, 32)
StartDrawing(ImageOutput(99))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(255,255,255,0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaClippedImage(@PixelsArray, 0, 0, 30+(PixelsArray\Width)*zoom, 30+(PixelsArray\Height)*zoom, 0, 0, 640, 480, 255)
StopDrawing()
; another layer
CreateImage(100, 640, 480, 32);layer
CreateImage(101, 640, 480, 32); image
GetPixelsArray(ImageOutput(101), @layer1)
StartDrawing(ImageOutput(100))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,640,480,RGBA(255,255,255,0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,640,480,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaClippedImage(@layer1, 0, 0, 30+ImageWidth(101)*zoom, 30+ImageHeight(101)*zoom, 0, 0, 640, 480, 50)
StopDrawing()
Else
End
EndIf
;}
;{ open widnow
If OpenWindow(0, 0, 0, 640, 480, "Zoom & Paint", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
ScrollAreaGadget(0,20,20,600,440,640,480,30)
CanvasGadget(1,0,0,640,480)
CloseGadgetList()
update_canvas_()
Else
End
EndIf
;}
;{ boucle
Repeat
Event = WaitWindowEvent(1)
paint()
event_zoom()
Until Event = #PB_Event_CloseWindow
;}

http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
Dis-moi si cet exemple te convient (il faut utiliser la molette pour zoomer) :
J'en ai aussi profité pour améliorer la fonction DrawAlphaClippedImage(), elle est beaucoup plus rapide lors d'affichage d'images zoomées.
Code : Tout sélectionner
Structure PixelsArray
Width.i
Height.i
Array Pixel.i(0)
EndStructure
Declare UpdateCanvas()
Declare SetZoom(z.f)
Declare SetCamera(x, y)
Declare DrawAlphaClippedImage(*PixelsArray.PixelsArray, x1, y1, w1, h1, x2, y2, w2, h2, Alpha)
Declare GetPixelsArray(Output, *PixelsArray.PixelsArray)
Global Zoom.f = 1
Global CameraX, CameraY
Global PixelsArray_ImageSource.PixelsArray
Global Image_Layer
Global CanvasGadget
UsePNGImageDecoder() : UseJPEGImageDecoder()
;Image Source
Image_Source = LoadImage(#PB_Any, OpenFileRequester("image","","JPG|*.jpg|PNG|*.png",1))
GetPixelsArray(ImageOutput(Image_Source), @PixelsArray_ImageSource.PixelsArray)
FreeImage(Image_Source)
;Image Layer
Image_Layer = CreateImage(#PB_Any, PixelsArray_ImageSource\Width, PixelsArray_ImageSource\Height, 32)
StartDrawing(ImageOutput(Image_Layer))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, OutputWidth(), OutputHeight(), RGBA(0, 0, 0, 0))
StopDrawing()
Window = OpenWindow(#PB_Any, 0, 0, 640, 480, "Zoom & Paint")
If Window
CanvasGadget = CanvasGadget(#PB_Any, 0, 0, 640, 480, #PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
UpdateCanvas()
Repeat
Event = WaitWindowEvent(1)
If Event = #PB_Event_Gadget And EventGadget() = CanvasGadget
rx.f = PixelsArray_ImageSource\Width/(PixelsArray_ImageSource\Width*Zoom)
ry.f = PixelsArray_ImageSource\Height/(PixelsArray_ImageSource\Height*Zoom)
MouseX = GetGadgetAttribute(CanvasGadget, #PB_Canvas_MouseX)
MouseY = GetGadgetAttribute(CanvasGadget, #PB_Canvas_MouseY)
Select EventType()
Case #PB_EventType_MouseMove ;{
Select GetGadgetAttribute(CanvasGadget, #PB_Canvas_Buttons)
Case #PB_Canvas_LeftButton ;{
;Draw
StartDrawing(ImageOutput(Image_Layer))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle((MouseX*rx)+CameraX, (MouseY*ry)+CameraY, 3, RGBA(0, 0, 0, 255))
StopDrawing()
UpdateCanvas()
;}
EndSelect
;}
Case #PB_EventType_MouseWheel ;{
If GetGadgetAttribute(CanvasGadget, #PB_Canvas_WheelDelta) = 1
;Zoom In
SetZoom(Zoom*2)
Else
;Zoom Out
SetZoom(Zoom/2)
EndIf
;}
Case #PB_EventType_KeyDown ;{
Select GetGadgetAttribute(CanvasGadget, #PB_Canvas_Key)
Case #PB_Shortcut_Up
SetCamera(CameraX, CameraY-5)
Case #PB_Shortcut_Right
SetCamera(CameraX+5, CameraY)
Case #PB_Shortcut_Down
SetCamera(CameraX, CameraY+5)
Case #PB_Shortcut_Left
SetCamera(CameraX-5, CameraY)
EndSelect
;}
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Procedure UpdateCanvas()
GetPixelsArray(ImageOutput(Image_Layer), @PixelsArray_ImageLayer.PixelsArray)
StartDrawing(CanvasOutput(CanvasGadget))
DrawingMode(#PB_2DDrawing_AlphaBlend)
;Background
Box(0, 0, OutputWidth(), OutputHeight(), RGBA(180, 180, 180, 255))
;Image Source
DrawAlphaClippedImage(PixelsArray_ImageSource, CameraX, CameraY, PixelsArray_ImageSource\Width, PixelsArray_ImageSource\Height, 0, 0, PixelsArray_ImageSource\Width*Zoom, PixelsArray_ImageSource\Height*Zoom, 255)
;Image Layer
DrawAlphaClippedImage(PixelsArray_ImageLayer, CameraX, CameraY, PixelsArray_ImageLayer\Width, PixelsArray_ImageLayer\Height, 0, 0, PixelsArray_ImageLayer\Width*Zoom, PixelsArray_ImageLayer\Height*Zoom, 255)
StopDrawing()
EndProcedure
Procedure SetZoom(z.f)
Zoom = z
UpdateCanvas()
EndProcedure
Procedure SetCamera(x, y)
CameraX = x
CameraY = y
UpdateCanvas()
EndProcedure
Procedure DrawAlphaClippedImage(*PixelsArray.PixelsArray, x1, y1, w1, h1, x2, y2, w2, h2, Alpha)
x_ratio.f = w1/w2
y_ratio.f = h1/h2
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)
Percent.f = Alpha/255
Plot(x2+x, y2+y, RGBA(Red(Color), Green(Color), Blue(Color), Alpha(Color)*Percent))
EndIf
EndIf
Next x
EndIf
Next y
EndProcedure
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
Re: ZOOM Souris
Atomo : comme ça c'est vraiment bien, mais par contre cette technique me semble en l'état un peu trop lente pour dessiner. Il faudrait que je réfléchisse à un moyen d'optimiser tout ça. En découpant par tile par exemple.
Mais là, c'est une autre paire de manche
Merci en tout cas, je me servirai sans doute de cette technique pour les zooms
Mais là, c'est une autre paire de manche

Merci en tout cas, je me servirai sans doute de cette technique pour les zooms

http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
pourquoi couper tout en tile ! pour ne pas travailler juste sur une zone x,y,w,h ? ça permet d'optimisé en fonction des besoins ! non ?blendman a écrit :Atomo : comme ça c'est vraiment bien, mais par contre cette technique me semble en l'état un peu trop lente pour dessiner. Il faudrait que je réfléchisse à un moyen d'optimiser tout ça. En découpant par tile par exemple.
Mais là, c'est une autre paire de manche![]()
Merci en tout cas, je me servirai sans doute de cette technique pour les zooms
Re: ZOOM Souris
Une solution pour optimiser le dessin serait de dessiner sur ton layer et sur le canvas en même temps au lieu de dessiner sur le layer puis de tout réafficher avec la fonction UpdateCanvas().
Au lieu d'avoir ça en ligne 49 :
tu aurais un truc du genre :
Au lieu d'avoir ça en ligne 49 :
Code : Tout sélectionner
StartDrawing(ImageOutput(Image_Layer))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box((MouseX*rx)+CameraX, (MouseY*ry)+CameraY, 3, 3, RGBA(0, 0, 0, 255))
StopDrawing()
UpdateCanvas()
Code : Tout sélectionner
StartDrawing(ImageOutput(Image_Layer))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box((MouseX*rx)+CameraX, (MouseY*ry)+CameraY, 3, 3, RGBA(0, 0, 0, 255))
StopDrawing()
StartDrawing(CanvasOutput(CanvasGadget))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(MouseX, MouseY, 3*Zoom, 3*Zoom, RGBA(0, 0, 0, 255))
StopDrawing()
Re: ZOOM Souris
Atomo : ah oui, c'est beaucoup mieux cette technique dis donc !! 
Mais le problème c'est si j'ai des calques au dessus du calque sur lequel je dessine, ça ne va pas poser problème ?
car je devrais dessiner, mais en dessous de ce calque , et je ne vois pas comment faire ça sans faire un update du canvas
.
De plus, comment puis-je créer de nouveaux calques ? je dois créer une procédure pour ajouter des images, puis les utiliser avec ta procédures GetPixelsArray() , c'est bien ça ?
En tout cas, encore merci car ton système est vraiment intéressant.
Thyphoon : on peut très bien mixer les 2 : utiliser le système d'Atomo, mais aussi des tiles sur lesquelles on dessine, en n'affichant que les pixels présents à l'écran, par exemple.
Je sais que Mypaint utilise des tiles et tu peux travailler sur des images en 20000*20000 avec 40 calques (mais pas de blendmode), c'est assez impressionnant
.
Mais bon, moi, je vise du 5000*5000 avec 15 calques& blendmode, si déjà j'arrive à avoir ça, je serai hyper heureux
Après un autre intérêt d'utiliser des tiles (des images en fait en 200*200 par exemple) pourrait être le undo-redo.
EDIT :
mypaint et les tiles :
http://wiki.mypaint.info/index.php?titl ... Developers

Mais le problème c'est si j'ai des calques au dessus du calque sur lequel je dessine, ça ne va pas poser problème ?
car je devrais dessiner, mais en dessous de ce calque , et je ne vois pas comment faire ça sans faire un update du canvas

De plus, comment puis-je créer de nouveaux calques ? je dois créer une procédure pour ajouter des images, puis les utiliser avec ta procédures GetPixelsArray() , c'est bien ça ?
En tout cas, encore merci car ton système est vraiment intéressant.
Thyphoon : on peut très bien mixer les 2 : utiliser le système d'Atomo, mais aussi des tiles sur lesquelles on dessine, en n'affichant que les pixels présents à l'écran, par exemple.
Je sais que Mypaint utilise des tiles et tu peux travailler sur des images en 20000*20000 avec 40 calques (mais pas de blendmode), c'est assez impressionnant

Mais bon, moi, je vise du 5000*5000 avec 15 calques& blendmode, si déjà j'arrive à avoir ça, je serai hyper heureux

Après un autre intérêt d'utiliser des tiles (des images en fait en 200*200 par exemple) pourrait être le undo-redo.
EDIT :
mypaint et les tiles :
http://wiki.mypaint.info/index.php?titl ... Developers
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: ZOOM Souris
............
Dernière modification par Backup le sam. 01/oct./2011 9:29, modifié 1 fois.