Comme vous l'avez peut-être vu, il y a un bug lorsqu'on sauvegarde un sprite avec grabsprite().
EDIT :
Voici ce que j'aimerai faire :
- cleanscreen (2 X pour pouvoir comparer les deux images obtenues) avec une couleur spéciale rgb(255,0,255) et rgb(0,255,0) par exemple
- grabsprite() de l'écran (ou la portion que je veux sauvegarder) sur deux sprites temporaires
- puis vérifier chaque pixel des 2 sprites, et "enlever" les couleurs spéciales (255,0,255) à la couleur que j'obtiens.
Je suis parvenu à trouver l'alpha ce qui est déjà très encourageant

Pour tester ma technique, je pars donc de deux images avec le fond rgb(255,0,255) et rgb(0,255,0) et j'essaie de trouver l'alpha de l'image originale ainsi que la couleur ^^.
Voici les images que j'utilise :


Et le résultat que je souhaite obtenir :

Et voici ce que j'obtiens pour le moment (l'alpha est ok, mais pas la couleur) :

OLD code :
Code : Tout sélectionner
#Window_main = 0
If InitSprite() =0 Or InitKeyboard() =0 Or UsePNGImageDecoder()=0 Or UsePNGImageEncoder() = 0
End
EndIf
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
WinW =800
WinH =600
If OpenWindow(#Window_main,0,0,WinW,WinH, "GrabSprite bug", Flag) = 0
End
EndIf
If OpenWindowedScreen(WindowID(0), 0,0,WinW,WinH) = 0
End
EndIf
File$ = OpenFileRequester("Open a png with alpha","","PNG(*.png)|*.png",0)
If File$ = ""
End
EndIf
LoadSprite(0,file$,#PB_Sprite_AlphaBlending)
SaveSprite(0,"save_original.png",#PB_ImagePlugin_PNG)
ClearScreen(0)
If StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,WinW,WinH,RGB(255,0,126))
DrawingMode(#PB_2DDrawing_AlphaBlend)
StopDrawing()
EndIf
DisplayTransparentSprite(0,0,0)
temp = GrabSprite(#PB_Any, 0,0,WinW,WinH,#PB_Sprite_AlphaBlending )
FlipBuffers()
w = SpriteWidth(temp)
h = SpriteHeight(temp)
temp2 = CreateSprite(#PB_Any,w,h,#PB_Sprite_AlphaBlending)
Dim color.q(w,h)
Dim AlphaC(w,h)
If StartDrawing(SpriteOutput(temp))
;DrawingMode(#PB_2DDrawing_AllChannels)
;Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For i=0 To SpriteWidth(temp)-1
For j=0 To SpriteHeight(temp)-1
AlphaC(i,j) = 255
color(i,j) = Point(i,j)
;Debug ""+ color(i,j)+"/"+Str(RGB(255,0,126) & $FFFFFFFF)
;Debug ""+ Red(color(i,j))+"/"+Green(color(i,j))+"/"+Blue(color(i,j))+"/"+Alpha(color(i,j))
If color(i,j) = 4286447871
alphaC(i,j) = 0
EndIf
Next
Next
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(temp2))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For i=0 To SpriteWidth(temp2)-1
For j=0 To SpriteHeight(temp2)-1
If alphaC(i,j) >0
Plot(i,j,RGBA(Red(color(i,j)),Green(color(i,j)),Blue(color(i,j)),alphaC(i,j)))
EndIf
Next
Next
StopDrawing()
EndIf
SaveSprite(temp,"savetemp.png",#PB_ImagePlugin_PNG)
SaveSprite(temp2,"save.png",#PB_ImagePlugin_PNG)
End