Page 1 sur 1

Rotation image de qualité

Publié : ven. 27/juil./2012 17:33
par Mesa
Exécuter une rotation à une image est assez simple mais quand on l'imprime, c'est vraiment moche alors j'ai trouvé divers codes qui permettent une rotation de qualité comme celui-ci :

Code : Tout sélectionner

;Fast and clean rotation
;Original Code : LSI (le soldat inconnu) for his effects library (http://www.purearea.net/pb/download/userlibs/Effect.zip)
;Optimisation (not fully optimised) by djes (djes@free.fr)
;Not needing assembly inline by psychophanta

;#PI.f=3.14159265

;******************************************************************************************************
; RotateImageEx2
;>= Angle (in degrees :()
ProcedureDLL.l RotateImageEx2(ImageID, Angle.f,ColeurFond=#Black) 
	 
	
  Protected bmi.BITMAPINFO, bmi2.BITMAPINFO, Hdc.l, NewImageID, Mem, n, nn, bm.BITMAP
 
  ;radian conversion
  ;Debug "Angle : "+Str(angle)
  Angle*#PI/180
 
  Protected Cos.f = Cos(Angle)
  Protected Sin.f = Sin(Angle)
 
 ColeurFond=ColeurFond&$ff00 | ColeurFond>>16 | (ColeurFond&$FF)<<16 
 
  GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
 
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
 
  bmi2\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi2\bmiHeader\biWidth = bm\bmWidth * Abs(Cos) + bm\bmHeight * Abs(Sin)
  bmi2\bmiHeader\biHeight = bm\bmHeight * Abs(Cos) + bm\bmWidth * Abs(Sin)
  bmi2\bmiHeader\biPlanes = 1
  bmi2\bmiHeader\biBitCount = 32
  bmi2\bmiHeader\biCompression = #BI_RGB
  
  
;   Debug bm\bmWidth
;   Debug bm\bmHeight

  Mem = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
  If Mem
    Protected Mem2 = AllocateMemory(bmi2\bmiHeader\biWidth * bmi2\bmiHeader\biHeight * 4)
    If Mem2
     
      ;retrieves the bits of the specified bitmap and copies them into a buffer
      Hdc = CreateCompatibleDC_(GetDC_(ImageID))
      If Hdc
        GetDIBits_(Hdc, ImageID, 0, bm\bmHeight, Mem, @bmi, #DIB_RGB_COLORS)
        ReleaseDC_(0, Hdc)
      EndIf
     
      Protected CX1 = bm\bmWidth - 1
      Protected CY1 = bm\bmHeight - 1
      Protected CX2 = bmi2\bmiHeader\biWidth - 1
      Protected CY2 = bmi2\bmiHeader\biHeight - 1
     
      Protected Mem01 = Mem + bm\bmWidth * 4
      Protected Mem10 = Mem + 4
      Protected Mem11 = Mem01 + 4
     
      Protected Mem2Temp = Mem2
      Protected deb=-CX2/2
      Protected fin=deb+CX2;= Round(CX2/2,#PB_Round_Up) but <> (CX2*2-CX2)/2
         
      For nn = 0 To CY2 ;y

        Protected x1b.l
        Protected y1b.l = (nn * 2) - CY2

        Protected Temp1.f = (CX1 - (y1b * Sin))/2
        Protected Temp2.f = (CY1 + (y1b * Cos))/2       

        Protected x1.f = Temp1 + (deb * Cos)
        Protected y1.f = Temp2 + (deb * Sin)

        For x1b = deb To fin  ;x
         
          ;could be faster with arrays
         
          Protected x2.l = x1
          Protected y2.l = y1
         
          If x1 < x2
            !dec dword[p.v_x2]
          EndIf
          If y1 < y2
            !dec dword[p.v_y2]
          EndIf
         
          Protected x2b.l = x2 + 1
          Protected y2b.l = y2 + 1
         
          ;test boundaries
          If x2b >= 0 And x2 <= CX1 And y2b >= 0 And y2 <= CY1 
         
            Protected fx.f = x1 - x2
            Protected fy.f = y1 - y2
            Protected f00.f = 1 - fx
            Protected f10.f = 1 - fy
            Protected f01.f = f00 * fy
            f00 * f10
            f10 * fx
            Protected f11.f = fx * fy
         
            Protected MemTemp = (x2 + y2 * bm\bmWidth) * 4
            Protected c00.l, c01.l, c11.l, c10.l
           
            If x2 >= 0 And x2 <= CX1
              If y2 >= 0 And y2 <= CY1
                !mov eax,dword[p.v_Mem]
                !add eax,dword[p.v_MemTemp]
                !mov eax,dword[eax]
                !mov dword[p.v_c00],eax
                ;c00 = PeekL(Mem + MemTemp)
              Else
                c00 = 0
              EndIf
              If y2b >= 0 And y2b <= CY1
                !mov eax,dword[p.v_Mem01]
                !add eax,dword[p.v_MemTemp]
                !mov eax,dword[eax]
                !mov dword[p.v_c01],eax
                ;c01 = PeekL(Mem01 + MemTemp)
              Else
                c01 = 0
              EndIf
            Else
              c00 = 0
              c01 = 0
            EndIf
            If x2b >= 0 And x2b <= CX1
              If y2 >= 0 And y2 <= CY1
                !mov eax,dword[p.v_Mem10]
                !add eax,dword[p.v_MemTemp]
                !mov eax,dword[eax]
                !mov dword[p.v_c10],eax
                ;c10 = PeekL(Mem10 + MemTemp)
              Else
                c10 = 0
              EndIf
              If  y2b >= 0 And y2b <= CY1
                !mov eax,dword[p.v_Mem11]
                !add eax,dword[p.v_MemTemp]
                !mov eax,dword[eax]
                !mov dword[p.v_c11],eax
                ;c11 = PeekL(Mem11 + MemTemp)
              Else
                c11 = 0
              EndIf
            Else
              c10 = 0
              c11 = 0
            EndIf
   
            Protected r1.l,r2.l,r3.l,r4.l,g1.l,g2.l,g3.l,g4.l,b1.l,b2.l,b3.l,b4.l

            !mov eax,dword[p.v_c00]
            !mov ebx,eax
            !mov ecx,eax

            !and eax,$FF
            !mov dword[p.v_r1],eax
            !and ebx,$FF00
            !mov dword[p.v_g1],ebx
            !and ecx,$FF0000
            !mov dword[p.v_b1],ecx

            !mov eax,dword[p.v_c10]
            !mov ebx,eax
            !mov ecx,eax

            !and eax,$FF
            !mov dword[p.v_r2],eax
            !and ebx,$FF00
            !mov dword[p.v_g2],ebx
            !and ecx,$FF0000
            !mov dword[p.v_b2],ecx

            !mov eax,dword[p.v_c01]
            !mov ebx,eax
            !mov ecx,eax

            !and eax,$FF
            !mov dword[p.v_r3],eax
            !and ebx,$FF00
            !mov dword[p.v_g3],ebx
            !and ecx,$FF0000
            !mov dword[p.v_b3],ecx

            !mov eax,dword[p.v_c11]
            !mov ebx,eax
            !mov ecx,eax

            !and eax,$FF
            !mov dword[p.v_r4],eax
            !and ebx,$FF00
            !mov dword[p.v_g4],ebx
            !and ecx,$FF0000
            !mov dword[p.v_b4],ecx
     
           ;pure knows well how to do this
            Protected r.l = r1 * f00 + r2 * f10 + r3 * f01 + r4 * f11
            Protected g.l = g1 * f00 + g2 * f10 + g3 * f01 + g4 * f11
            Protected b.l = b1 * f00 + b2 * f10 + b3 * f01 + b4 * f11
         
            !mov eax,dword[p.v_r]
            !mov ebx,dword[p.v_g]
            !mov ecx,dword[p.v_b]
            ;one trick is to let triplets at the same place to avoid shifting
            !and eax,$FF                                     
            !and ebx,$FF00
            !and ecx,$FF0000
            !or eax,ebx
            !or eax,ecx

            !mov ebx,dword[p.v_Mem2Temp]
            !mov dword[ebx],eax
         
          Else

            !mov ebx,dword[p.v_Mem2Temp]
            ;!xor eax,eax; black background 
            !mov eax,dword[p.v_ColeurFond]; user defined background
            !mov dword[ebx],eax

          EndIf
         
          Mem2Temp + 4
          x1 + cos
          y1 + sin
         
        Next x1b
      Next nn
     
      ; On crée la nouvelle image
      NewImageID = CreateImage(#PB_Any, bmi2\bmiHeader\biWidth, bmi2\bmiHeader\biHeight)
      Hdc = CreateCompatibleDC_(GetDC_(ImageID(NewImageID)))
      If Hdc
        SetDIBits_(Hdc, ImageID(NewImageID), 0, bmi2\bmiHeader\biHeight, Mem2, @bmi2, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
        ReleaseDC_(0, Hdc)
      EndIf
     
      FreeMemory(Mem2)
    EndIf
    FreeMemory(Mem)
  EndIf
 
  ProcedureReturn NewImageID
EndProcedure

;******************************************************************************************************
;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ScrollArea_0
  #Image_1
EndEnumeration
;}
;{ Images
Enumeration
  #Image_Image_1
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 381, 30, 625, 628, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ScrollAreaGadget(#ScrollArea_0, 5, 10, 610, 605, 3000, 3000, 10, #PB_ScrollArea_Single)
      ImageGadget(#Image_1, 10, 15, 405, 320, 0, #PB_Image_Border)
    CloseGadgetList()
  EndIf
EndProcedure

OpenWindow_Window_0()

ImageID=CreateImage(#PB_Any,200,200)
StartDrawing(ImageOutput(ImageID))
Box(0,0,200-1,200-1,#White)
For Angle = 0 To 360 Step 3
        LineXY(100, 100, 100+Cos(Angle)*90, 100+Sin(Angle)*90, RGB(Random(255), Random(255), Random(255)))
      Next Angle
Box(0,100,200-1,200-1,#Red)      
      StopDrawing()
SetGadgetState(#Image_1,ImageID(ImageID))      


;Im1=LoadImage(#PB_Any,"ok.bmp")
;GrabImage(Im1, ImageID, 0, 0, 245, 720)

;Je recherche un RotateImageEx2(ImageID, Angle.f, Pivotx, Pivoty, ColeurFond=#Black)
 im2=RotateImageEx2(ImageID(ImageID), 30, #White)
 
 SetGadgetState(#Image_1,ImageID(Im2))


;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #ScrollArea_0
      ElseIf EventGadget = #Image_1
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
L'embêtant, c'est que la rotation se fait sur le point milieu de l'image en x et en y, le pivot a pour coordonnées (width/2, height/2) et je voudrais faire une rotation à partir de n'importe quel point.
De plus, je n’arrive pas à retrouver la formule de rotation dans ce code.:

pivot(x0,y0)
X=x0 + (x - x0)*cos(angle) + (y - y0)*sin(Angle)
Y=y0 - (x - x0)*sin(Angle) + (y - y0)*cos(Angle)

Il semble que l'auteur utilise des astuces de calcul pour simplifier son code...

Je cherche à faire ceci :
RotateImageEx2(ImageID, Angle.f, Pivotx, Pivoty, ColeurFond=#Black)

Une idée ?

Mesa.

Re: Rotation image de qualité

Publié : sam. 28/juil./2012 11:42
par kernadec
bonjour Mesa
pour ta demande de rotation excentrée
il y a peut être la solution de la librairie "gDrawing.pbi" de Danilo

http://www.purebasic.fr/english/viewtop ... 2&t=46987&

http://www.purebasic.fr/german/viewtopi ... 8&t=24539&


j'ai modifié la coordonnée x de la gbox de 300 à 200 cela semble faire ce que tu recherche avec le fichier "exemple20.pb"

Code : Tout sélectionner

EnableExplicit

XIncludeFile "gDrawing.pbi"

Define mainWin, quit
Global logo

Procedure CanvasUpdate()
  Static rotate.f = 0
  Static s.f      = 0
  Protected scale.f, i.f
  If gStartDrawing(CanvasOutput(1))
    rotate + 5
    s      + 0.15
    i      = Sin(s)*300
    scale  = 1.1 + Sin(s)
    gSetPenImage(logo)
    gSetPenTransform(100,100,rotate*2,scale,scale)
    gBox(0,0,800,600)
    gSetPenSize(5)
    gBezier(0,300,200,i,400,600-i,800,300,RGBA(0,0,0,$FF))
    gRotateAt(400,300,-rotate*0.1)
    gBox(200,200,200,200,RGBA($80,$80,$FF,$AA))
    gDrawingMode(#PB_2DDrawing_Outlined)
    gSetPenSize(2)
    gBox(200,200,200,200,RGBA($FF,$FF,$00,$FF))
    gStopdrawing()
  EndIf
  
  FlipBuffers()
EndProcedure

Define event

If gInit()
  
  mainWin = OpenWindow(#PB_Any,0,0,800,600,"gDrawing on CanvasGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CanvasGadget(1,0,0,800,600)
  
  CatchImage(1,?img)
  logo = gBufferImage(ImageID(1))
  
  Repeat
    Repeat
      event=WindowEvent()
      If event=#PB_Event_CloseWindow : quit = #True : EndIf
    Until event=0
    CanvasUpdate()
  Until quit=#True
  
  gEnd()
EndIf

DataSection
  img:
  IncludeBinary #PB_Compiler_Home+"\Examples\Sources\Data\PureBasicLogo.bmp"
EndDataSection

Cordialement

Re: Rotation image de qualité

Publié : lun. 30/juil./2012 14:52
par Mesa
Merci, je vais faire des essais...
A priori, c'est grotateat() qui permet de placer le pivot.

Mesa.

Re: Rotation image de qualité

Publié : mar. 31/juil./2012 13:13
par Mesa
Ça doit marcher :

Avec un canvas:

Code : Tout sélectionner

;EnableExplicit


XIncludeFile "gDrawing.pbi"

Define mainWin, quit


;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ScrollArea_0
  #ImageGadget_0
  #Canvas_0
  #Button_Ouvrir
  #Button_Sauver
  #ComboBox_0
  #Text_0
EndEnumeration
;}
;{ Images
Enumeration
  #Image_Image_1
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu

Declare CreationImage()
Declare RedimCanvas(rotationEnDegres.f)
Declare OuvrirImage()
Declare SauverImage()
;}

Procedure rotation(Canvas.l,image.l, pivotX.l, PivotY.l, Angle.f, WrapMode.l)
  ;If gInit() ; à cet endroit, ça dégrade les performances 
  If gStartDrawing(CanvasOutput(Canvas))
    logo = gBufferImage(ImageID(image))
    gSetPenImage(logo,WrapMode)
    ;gSetPenTransform(pivotX,PivotY,Angle) ; Texture :pivot par rapport à ???
    gRotateAt(pivotX,PivotY,Angle)
    gBox(0,0, GadgetWidth(Canvas), GadgetHeight(Canvas))
    
    gStopdrawing()
  EndIf
  
  ;FlipBuffers()
  ;  gEnd()
  ; EndIf
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 383, 91, 633, 400, "Rotation de Qualité", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ButtonGadget(#Button_Ouvrir, 15, 6, 140, 30, "Ouvrir")
    ButtonGadget(#Button_Sauver, 195, 6, 145, 30, "Sauver")
    ComboBoxGadget(#ComboBox_0, 445, 6, 140, 30)
    TextGadget(#Text_0, 380, 9, 45, 30, "Warp", #PB_Text_Center)
    ScrollAreaGadget(#ScrollArea_0, 0, 50, 630, 315, 3000, 3000, 10, #PB_ScrollArea_Single)
    ImageGadget(#ImageGadget_0, 0, 0, 350, 260, 0)
    CanvasGadget(#Canvas_0, 400, 0, 400, 250)
    CloseGadgetList()
  EndIf
EndProcedure

If gInit() ; plus rapide ici  que dans une procedure
  OpenWindow_Window_0()
  
  CreationImage()
  rotationEnDegres=-45
  RedimCanvas(rotationEnDegres)
  
  rotation(#Canvas_0, #Image_Image_1, 128, 75, rotationEnDegres, #WrapModeClamp)
  ;   Enumeration ; WrapMode
  ;     #WrapModeTile         ; 0 ; fonctionne avec un grand canvas
  ;     #WrapModeTileFlipX    ; 1
  ;     #WrapModeTileFlipY    ; 2
  ;     #WrapModeTileFlipXY   ; 3
  ;     #WrapModeClamp        ; 4
  ; EndEnumeration
  
  ;{- Event loop
  Repeat
    Event = WaitWindowEvent()
    Select Event
        ; ///////////////////
      Case #PB_Event_Gadget
        EventGadget = EventGadget()
        EventType = EventType()
        If EventGadget = #ScrollArea_0
        ElseIf EventGadget = #ImageGadget_0
        ElseIf EventGadget = #Canvas_0
        ElseIf EventGadget = #Button_Ouvrir
          OuvrirImage()
        ElseIf EventGadget = #Button_Sauver
          SauverImage()
        ElseIf EventGadget = #ComboBox_0
          If EventType() = #PB_EventType_Change          
            ; 
          EndIf
        ElseIf EventGadget = #Text_0
        EndIf
        ; ////////////////////////
      Case #PB_Event_CloseWindow
        EventWindow = EventWindow()
        If EventWindow = #Window_0
          CloseWindow(#Window_0)
          Break
        EndIf
    EndSelect
  ForEver
  ;
  gEnd()
EndIf
;}

Procedure CreationImage()
  
  If CreateImage(#Image_Image_1, 255, 255)
    StartDrawing(ImageOutput(#Image_Image_1))
    Box(0,0,255,255,#White)
    Box (75,50,50,50,#Red)
    LineXY(128,0,128,255,#Green)
    LineXY(0,75,255,75,#Green)
    StopDrawing()
    
    SetGadgetState(#ImageGadget_0,ImageID(#Image_Image_1)) ; afficher image dans imagegadget
    
  EndIf
  
EndProcedure

Procedure RedimCanvas(rotationEnDegres.f)
  
  w=ImageWidth(image)
  h=ImageHeight(image)
  newWidth = Int(W * Abs(Cos(rotationEnDegres*#PI/180)) + H * Abs(Sin(rotationEnDegres*#PI/180)) )
  newHeight = Int(H * Abs(Cos(rotationEnDegres*#PI/180)) + W * Abs(Sin(rotationEnDegres*#PI/180)))
  
  ResizeGadget(#Canvas_0, GadgetX(#ImageGadget_0)+GadgetWidth(#ImageGadget_0)+10,#PB_Ignore, newWidth, newHeight) ; redim le canvas
  
EndProcedure


Procedure OuvrirImage()
  MessageRequester("Ooops","A Faire...")
EndProcedure

Procedure SauverImage()
  MessageRequester("Ooops","A Faire...")
EndProcedure
Avec une image :

Code : Tout sélectionner

;EnableExplicit

XIncludeFile "gDrawing.pbi"

Define mainWin, quit


;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ScrollArea_0
  #ImageGadget_0
  #ImageGadget_1
  #Button_Ouvrir
  #Button_Sauver
  #ComboBox_0
  #Text_0
EndEnumeration
;}
;{ Images
Enumeration
  #Image_Image_1
  #Image_Image_2
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu

Declare CreationImage()
Declare RedimCanvas(rotationEnDegres.f)
Declare OuvrirImage()
Declare SauverImage()
;}

Procedure rotation(Image2.l,image.l, pivotX.l, PivotY.l, Angle.f, WrapMode.l)
  
  ;If gInit() ; à cet endroit, ça dégrade les performances 
  If gStartDrawing(ImageOutput(Image2))
    logo = gBufferImage(ImageID(image))
    gSetPenImage(logo,WrapMode)
    ;gSetPenTransform(pivotX,PivotY,Angle) ; Texture :pivot par rapport à ???
    gRotateAt(pivotX,PivotY,Angle)
    gBox(0,0, 360, 360)
    
    gStopdrawing()
  EndIf
  
  ;FlipBuffers()
  ;  gEnd()
  ; EndIf
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 383, 91, 633, 400, "Rotation de Qualité", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ButtonGadget(#Button_Ouvrir, 15, 6, 140, 30, "Ouvrir")
    ButtonGadget(#Button_Sauver, 195, 6, 145, 30, "Sauver")
    ComboBoxGadget(#ComboBox_0, 445, 6, 140, 30)
    TextGadget(#Text_0, 380, 9, 45, 30, "Warp", #PB_Text_Center)
    ScrollAreaGadget(#ScrollArea_0, 0, 50, 630, 315, 3000, 3000, 10, #PB_ScrollArea_Single)
    ImageGadget(#ImageGadget_0, 0, 0, 350, 260, 0)
    ImageGadget(#ImageGadget_1, 400, 0, 400, 250,0)
    CloseGadgetList()
  EndIf
EndProcedure

If gInit() ; plus rapide ici  que dans une procedure
  OpenWindow_Window_0()
  
  CreationImage()
  CreateImage(#Image_Image_2,255,255)
  
  rotationEnDegres=-45
  RedimCanvas(rotationEnDegres)
  
  rotation(#Image_Image_2, #Image_Image_1, 128, 75, rotationEnDegres, #WrapModeClamp)
  ;   Enumeration ; WrapMode
  ;     #WrapModeTile         ; 0 ; fonctionne avec une grande image
  ;     #WrapModeTileFlipX    ; 1
  ;     #WrapModeTileFlipY    ; 2
  ;     #WrapModeTileFlipXY   ; 3
  ;     #WrapModeClamp        ; 4
  ; EndEnumeration
  SetGadgetState(#ImageGadget_1,ImageID(#Image_Image_2))
  
  ;{- Event loop
  Repeat
    Event = WaitWindowEvent()
    Select Event
        ; ///////////////////
      Case #PB_Event_Gadget
        EventGadget = EventGadget()
        EventType = EventType()
        If EventGadget = #ScrollArea_0
        ElseIf EventGadget = #ImageGadget_0
        ElseIf EventGadget = #ImageGadget_1
        ElseIf EventGadget = #Button_Ouvrir
          OuvrirImage()
        ElseIf EventGadget = #Button_Sauver
          SauverImage()
        ElseIf EventGadget = #ComboBox_0
          If EventType() = #PB_EventType_Change          
            ; 
          EndIf
        ElseIf EventGadget = #Text_0
        EndIf
        ; ////////////////////////
      Case #PB_Event_CloseWindow
        EventWindow = EventWindow()
        If EventWindow = #Window_0
          CloseWindow(#Window_0)
          Break
        EndIf
    EndSelect
  ForEver
  ;
  gEnd()
EndIf
;}

Procedure CreationImage()
  
  If CreateImage(#Image_Image_1, 255, 255)
    StartDrawing(ImageOutput(#Image_Image_1))
    Box(0,0,255,255,#White)
    Box (75,50,50,50,#Red)
    LineXY(128,0,128,255,#Green)
    LineXY(0,75,255,75,#Green)
    StopDrawing()
    
    SetGadgetState(#ImageGadget_0,ImageID(#Image_Image_1)) ; afficher image dans imagegadget
    
  EndIf
  
EndProcedure

Procedure RedimCanvas(rotationEnDegres.f)
  
  w=ImageWidth(image)
  h=ImageHeight(image)
  newWidth = Int(W * Abs(Cos(rotationEnDegres*#PI/180)) + H * Abs(Sin(rotationEnDegres*#PI/180)) )
  newHeight = Int(H * Abs(Cos(rotationEnDegres*#PI/180)) + W * Abs(Sin(rotationEnDegres*#PI/180)))
  
  ResizeGadget(#ImageGadget_1, GadgetX(#ImageGadget_0)+GadgetWidth(#ImageGadget_0)+10,#PB_Ignore, newWidth, newHeight) ; redim le canvas
  
EndProcedure


Procedure OuvrirImage()
  MessageRequester("Ooops","A Faire...")
EndProcedure

Procedure SauverImage()
  MessageRequester("Ooops","A Faire...")
EndProcedure
Mesa.