ZOOM Souris

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: ZOOM Souris

Message par Atomo »

Tu peux me passer le code que tu utilises ainsi que l'image d'origine ?
Je n'arrive pas à reproduire le bug.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

yep ;)

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 
l'image :

Image

Système :
windows xp
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: ZOOM Souris

Message par Atomo »

Ca devrait être bon, j'ai édité le code en première page, merci pour ta colaboration :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

yep, ça marche nickel :D

merci à toi ;)
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: ZOOM Souris

Message par Atomo »

Je viens de corriger un autre bug lié au redimentionnement, j'ai mis à jour le code en première page.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

Atomo a écrit :Je viens de corriger un autre bug lié au redimensionnement, j'ai mis à jour le code en première page.
super , je regarde ça tout de suite :)

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
Autre problème, je n'ai pas réussi à utiliser la procédure (copié du code startdrawing()/stopdrawing()), j'ai le même bug :

Code : Tout sélectionner

array index out of bounds
Mais en tout cas, c'est superbe comme code, ça va m'être très utile.
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: ZOOM Souris

Message par Atomo »

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.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

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 :)).
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

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 ? :)

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
;}
Merci encore :)
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: ZOOM Souris

Message par Atomo »

Dis-moi si cet exemple te convient (il faut utiliser la molette pour zoomer) :

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
J'en ai aussi profité pour améliorer la fonction DrawAlphaClippedImage(), elle est beaucoup plus rapide lors d'affichage d'images zoomées.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

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 :mrgreen:

Merci en tout cas, je me servirai sans doute de cette technique pour les zooms ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: ZOOM Souris

Message par Thyphoon »

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 :mrgreen:

Merci en tout cas, je me servirai sans doute de cette technique pour les zooms ;)
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 ?
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: ZOOM Souris

Message par Atomo »

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 :

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()
tu aurais un truc du genre :

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()
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ZOOM Souris

Message par blendman »

Atomo : ah oui, c'est beaucoup mieux cette technique dis donc !! :D
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 :D.

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 :D

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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ZOOM Souris

Message par Backup »

............
Dernière modification par Backup le sam. 01/oct./2011 9:29, modifié 1 fois.
Répondre