[5.20] IMA et drawingbuffer()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.20] IMA et drawingbuffer()

Message 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 :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [5.20] IMA et drawingbuffer()

Message par G-Rom »

Color.i = PeekL(Buffer + (x*4) + lineLength * (y*4))
..
..
..
PokeL(Buffer + (x*4) + lineLength * (y*4),RGB(r,g,b))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20] IMA et drawingbuffer()

Message par blendman »

ça ne marche pas ^^

Ima sur :

Code : Tout sélectionner

Color.i = PeekL(Buffer + (j*4) + lineLength * (i*4))
stombretrooper
Messages : 117
Inscription : dim. 21/déc./2008 18:39

Re: [5.20] IMA et drawingbuffer()

Message 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.
http://www.purebasicstreet.com/ - Site dédié à purebasic.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20] IMA et drawingbuffer()

Message 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 ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [5.20] IMA et drawingbuffer()

Message 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.
stombretrooper
Messages : 117
Inscription : dim. 21/déc./2008 18:39

Re: [5.20] IMA et drawingbuffer()

Message 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:
http://www.purebasicstreet.com/ - Site dédié à purebasic.
Répondre