Page 1 sur 1

[5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 17:24
par blendman
salut

J'ai une IMA sur ce code, quelqu'un pourrait-il m'éclairer ?

Code : Tout sélectionner

UsePNGImageDecoder()
UseJPEGImageDecoder()


CreateImage(0, 640, 480, 32, #PB_Image_Transparent)

Procedure OpenImage()
  
  file$ = OpenFileRequester("Ouvrir une image", "", "Png, Jpg|*.png|*.jpg",0)
  
  If file$ <> ""
    
    If LoadImage(0, file$)
      
    W = ImageWidth(0)
    H = ImageHeight(0)
      
      If StartDrawing(ImageOutput(0))
        
        Buffer = DrawingBuffer()
        
        If Buffer <> 0
          
          pixelFormat = DrawingBufferPixelFormat()
          
          lineLength = DrawingBufferPitch()
          
          If pixelFormat = #PB_PixelFormat_32Bits_BGR | #PB_PixelFormat_ReversedY
            
            For i = 0 To W - 1 
              
              For j = 0 To H - 1 
                
                
                b1 = PeekA(Buffer + 4 * j + i * lineLength);Bleu
                g1 = PeekA(Buffer + 4 * j + i * lineLength + 1);Vert
                r1 = PeekA(Buffer + 4 * j + i * lineLength + 2);Rouge 
                
                ;Debug Str(r1) + "/" + Str(g1) + "/" + Str(b1) 
                
                ; on effectue l'operation
                
                r = 255 - r1                
                g = 255 - g1
                b = 255 - b1
                
                ; on poke le pixel
                PokeA(Buffer + 4 * j + i * lineLength,      b);Bleu
                PokeA(Buffer + 4 * j + i * lineLength + 1,  g);Vert
                PokeA(Buffer + 4 * j + i * lineLength + 2,  r);Rouge  
                
                
              Next j
              
            Next i
            
          EndIf
          
          StopDrawing()
          
        EndIf
        
        Debug "ok"
        
      EndIf
      
      SetGadgetState(0, ImageID(0))
      
    EndIf
    
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 640, 480, "Inverse color",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_Maximize)
  
  ImageGadget(0, 0,0,640,480,ImageID(0))
  
  CreateMenu(0,WindowID(0))
  MenuTitle("Image")
  MenuItem(0, "Ouvrir une image")
  
  Repeat
    
    Event       = WaitWindowEvent()
    EventMenu   = EventMenu()
    EventWindow = EventWindow()
    
    Select Event
        
      Case #PB_Event_Menu
        
        Select EventMenu
            
          Case 0
            OpenImage()
            
        EndSelect
        
      Case #PB_Event_CloseWindow         
        End
        
    EndSelect
    
  Until Quit = 1
EndIf
avec cette image-ci :

Image

merci :)

Re: [5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 18:24
par G-Rom
Color.i = PeekL(Buffer + (x*4) + lineLength * (y*4))
..
..
..
PokeL(Buffer + (x*4) + lineLength * (y*4),RGB(r,g,b))

Re: [5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 18:36
par blendman
ça ne marche pas ^^

Ima sur :

Code : Tout sélectionner

Color.i = PeekL(Buffer + (j*4) + lineLength * (i*4))

Re: [5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 19:11
par stombretrooper
Tu t'es gouré entre ligne et colonne !

Le code de position pour bien placé tes opérations de lecture / ecriture c'est celui ci :

DebutBufferImage + PixelX * TaillePixel+ PixelY * LongueurLigne

TaillePixel ; 4 Octet en RGBA.

Or toi tu fais :
DebutBufferImage + PixelY * TaillePixel + PixelX * LongueurLigne

Suffit dans ton code d'inverser les j et les i dans les PeekA et PokeA.

Re: [5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 19:35
par blendman
Ah oui, tu as raison, ça marche. Merci beaucoup!

Mais je suis parti de l'exemple que tu m'avais filé, donc c'est toi qui t'étais gourré lol ;)

Re: [5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 20:19
par G-Rom
blendman a écrit :ça ne marche pas ^^

Ima sur :

Code : Tout sélectionner

Color.i = PeekL(Buffer + (j*4) + lineLength * (i*4))
je me suis trompé , c'est pas lineLenght qu'il faut dans ce cas, c'est la taille en pixel en X, ou tu divise lineLenght par ton format de pixel ce qui devrais te donner la taille en X en toute logique.

Re: [5.20] IMA et drawingbuffer()

Publié : ven. 11/oct./2013 21:36
par stombretrooper
blendman a écrit :Ah oui, tu as raison, ça marche. Merci beaucoup!

Mais je suis parti de l'exemple que tu m'avais filé, donc c'est toi qui t'étais gourré lol ;)
C'est possible, j'utiliser une image carré (donc taille largeur = taille hauteur, donc pas d'IMA). Autant pour moi. :mrgreen: