je veux juste lire la valeur alpha d'un pixel sur une image mais ça ne marche pas
voici l'image qui va avec le code
http://www.thyphoon.com/tmp_download/dirt3.png
vous remarquerez une fonction (qui n'a rien a voir avec le problème) qui permet de copier une image sur un sprite ! (chose bien pratique dans certain cas)
Edit: petit correction pour l'affichage de la valeur mais qui ne change rien au problème
Code : Tout sélectionner
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
Procedure Image2Sprite(Image,Sprite)
   Protected Pitch,Width,Height,SourceLineLen,X,Y,DestY,Format
   Protected *ImageBuffer,*SpriteBuffer,*SourcePixel.LONG,*DestPixel.LONG
   
   Macro BGRA2RGBA(Pixel)
      (Pixel & $FF00FF00) | (Pixel & $FF) << 16 | ((Pixel >> 16) & $FF)
   EndMacro
   
   #PB_PixelFormat_32Bits_BGR_ReversedY = #PB_PixelFormat_32Bits_BGR | #PB_PixelFormat_ReversedY
   #PB_PixelFormat_32Bits_RGB_ReversedY = #PB_PixelFormat_32Bits_RGB | #PB_PixelFormat_ReversedY
   
   StartDrawing(ImageOutput(Image))
   *ImageBuffer = DrawingBuffer()
   Format = DrawingBufferPixelFormat()
   StopDrawing()
   
   StartDrawing(SpriteOutput(Sprite))   
   *SpriteBuffer = DrawingBuffer()
   Pitch = DrawingBufferPitch()   
   Width = OutputWidth()
   Height = OutputHeight()
   SourceLineLen = Width * 4
   Select Format
      Case #PB_PixelFormat_32Bits_BGR
      If Pitch = SourceLineLen
         CopyMemory(*ImageBuffer,*SpriteBuffer,SourceLineLen * Height)
      Else
         Height - 1
         
         For Y = 0 To Height
            CopyMemory(*ImageBuffer + (SourceLineLen * Y),*SpriteBuffer + (Pitch * Y),SourceLineLen)
         Next
      EndIf
      
      Case #PB_PixelFormat_32Bits_RGB
      Height - 1
      Width - 1      
      *SourcePixel = *ImageBuffer
      
      For Y = 0 To Height
         *DestPixel = *SpriteBuffer + (Pitch * Y)
         
         For X = 0 To Width
            *DestPixel\l = BGRA2RGBA(*SourcePixel\l)
            *SourcePixel + 4
            *DestPixel + 4
         Next
      Next
      
      Case #PB_PixelFormat_32Bits_BGR_ReversedY
      Height - 1
      DestY = Height
      For Y = 0 To Height
         CopyMemory(*ImageBuffer + (SourceLineLen * Y),*SpriteBuffer + (Pitch * DestY),SourceLineLen)
         DestY - 1
      Next
      
      Case #PB_PixelFormat_32Bits_RGB_ReversedY   
      Height - 1
      Width - 1
      *SourcePixel = *ImageBuffer
      DestY = Height
      
      For Y = 0 To Height
         *DestPixel = *SpriteBuffer + (Pitch * DestY)
         
         For X = 0 To Width
            *DestPixel\l = BGRA2RGBA(*SourcePixel\l)
            *SourcePixel + 4
            *DestPixel + 4
         Next
         
         DestY - 1
      Next      
      
      Default
      StopDrawing()
      ProcedureReturn 0
   EndSelect
   
   StopDrawing()
EndProcedure
If OpenWindow(0,0,0,800,600,"Artillery",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
EndIf
#Spr_background=0
LoadImage(#Spr_background,"dirt3.png")
ResizeImage(#Spr_background,800,600)
;je decoupe dans l'image une partie
StartDrawing(ImageOutput(#Spr_background))
;DrawingMode(#PB_2DDrawing_AlphaChannel);<<mon ancienn façon d'effacer la partie de l'image
DrawingMode(#PB_2DDrawing_AllChannels);<<la nouvelle façon, ça affect aussi la couche rgb alors qu'avant non !
y=300
  For x= 0 To 799
    y=y+Random(2)-1
    LineXY(x, y, x, 0,RGBA(0,0,0,0))
    
  Next x
  StopDrawing()
  CreateSprite(#Spr_background,800,600,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
  ;je copie l'image sur un sprite!! :o)
Image2Sprite(#Spr_background,#Spr_background)
CreateSprite3D(#Spr_background,#Spr_background)
Repeat
  Event.l = WindowEvent()     
  ExamineKeyboard()
  ExamineMouse()
  FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
  ClearScreen(#Blue)
  
  ;lecture de l'alpha sur l'image 
  StartDrawing(ImageOutput(#Spr_background))
  a=Alpha(Point(MouseX(),MouseY()))
  StopDrawing()
  ;j'affiche l'image mais en version sprite plus rapide
  Start3D()
  DisplaySprite3D(#Spr_background,0,0)
  Stop3D()
  ;affichage 
  StartDrawing(ScreenOutput())
  ;DrawAlphaImage(ImageID(#Spr_background),0,0)
  Circle(MouseX(),MouseY(),3,#Red) ;affichage du curseur
  DrawText(20,20,"alpha:"+Str(a)) ;affichage de l'alpha
  StopDrawing()
  Delay(1)
  
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
End  

 .
.
 
  .
.