Re: ZOOM Souris
Publié : lun. 18/juil./2011 18:35
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.
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
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.
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
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
;}
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
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
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()