Page 1 sur 1

[ok] [5.42] Grabsprite() et savesprite()

Publié : lun. 25/avr./2016 19:46
par blendman
Salut

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 :). Maintenant, il me reste à récupérer la bonne couleur pour chaque pixel, mais c'est là que j'ai encore quelques bugs.

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 :
Image
Image

Et le résultat que je souhaite obtenir :
Image

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




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

Re: [5.42] Grabsprite() et savesprite()

Publié : mar. 26/avr./2016 11:02
par blendman
J'ai fait quelques tests ce matin et je pense qu'il serait mieux que je compare 2 images (avec 2 clearScreen() différents).

Par exemple, si j'ai les deux images suivantes :
Couleur fond : rgb(255,0,255)
Image
couleur fond : rgb(0,255,0)
Image

Savez-vous comment je pourrais obtenir le résultat suivant (donc, en supprimer par exemple le rgb(255,0,128) de l'image2)?
Image

EDIT : j'ai changé les images, elles étaient trop petites et j'ai ajouté plus de transparence.

Re: [5.42] Grabsprite() et savesprite()

Publié : mar. 26/avr./2016 13:25
par Fig
Affiche le sprite en rendant la couleur transparente avec transparentstpritecolor et grab le resultat, non ?

Re: [5.42] Grabsprite() et savesprite()

Publié : mar. 26/avr./2016 14:23
par blendman
Fig a écrit :Affiche le sprite en rendant la couleur transparente avec transparentstpritecolor et grab le resultat, non ?
hélas non, car il y a un bug avec savesprite(), ça crée plein d'artefacts. Donc, en attendant que ça soit corrigé, j'essaie de trouver une solution pour pallier à ça.

J'ai déjà trouvé une piste, j'ai fait quelques tests avec des couleurs simples et ça a l'air de fonctionner :

Code : Tout sélectionner


UsePNGImageEncoder()
CreateImage(2,32,32,32,#PB_Image_Transparent)

Procedure.d GetPixelColor(CouleurFond1,CouleurFond2,CouleurResultat1,CouleurResultat2,alpha=0)
    
        ; Ai = AlphaInconnu en % (donc, il faudra faire Ai *255 pour connaitre l'alpha total après la procédure
        ; utiliser de préférence des couleur de fond aux valeurs RGB différentes

    ; CouleurInconnue sera un R, G ou B
    ; CouleurResultat1 & CouleurResultat2 sera un R, G ou B
    ; CouleurFond1 & CouleurFond2 sera un R, G ou B
    ; A) CouleurResultat1 = (CouleurFond1 + CouleurInconnue) * (1-Ai)
    ; B) CouleurResultat2 = (CouleurFond2 + CouleurInconnue) * (1-Ai)
    
 
    ; CouleurResultat1/(1-Ai) = (CouleurFond1 + CouleurInconnue)
    ; donc :
    ; CouleurInconnue = (CouleurResultat1/(1-Ai)) - CouleurFond1
    
    ; on remplace CouleurInconnue dans B)
    
    ; CouleurResultat2 = (CouleurFond2 + (CouleurResultat1/(1-Ai)) - CouleurFond1) * (1-Ai)
    ; CouleurResultat2 = CouleurFond2*(1-Ai) + CouleurResultat1 - CouleurFond1 * (1-Ai)
    ; CouleurResultat2 = (CouleurFond2- CouleurFond1)*(1-Ai)+ CouleurResultat1  
    ; CouleurResultat2-CouleurResultat1  = (CouleurFond2- CouleurFond1)*(1-Ai)
    ; (1-Ai) = (CouleurResultat2-CouleurResultat1)/(CouleurFond2- CouleurFond1)
    ; -Ai = -1+(CouleurResultat2-CouleurResultat1)/(CouleurFond2- CouleurFond1)
    ; Ai = 1-(CouleurResultat2-CouleurResultat1)/(CouleurFond2- CouleurFond1)

    if CouleurFond2- CouleurFond1 <> 0
         Ai.d = 1- ((CouleurResultat2-CouleurResultat1) / (CouleurFond2- CouleurFond1)) 
    endif

    If 1-Ai <>0        
        CouleurInconnue = (CouleurResultat1/(1-Ai)) - CouleurFond1
    EndIf
        
    If alpha= 0        
       ProcedureReturn CouleurInconnue
    Else
       ProcedureReturn Ai
    EndIf

EndProcedure


If StartDrawing(ImageOutput(2))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Box(0,0,32,32,RGBA(255,0,127,255)) ; un super rose en fond
    Box(0,0,32,32,RGBA(120,0,0,255*0.5)) ; R = 120, Alpha = 127
    
    color=Point(0,0)
    r1= Red(color)
        
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Box(0,0,32,32,RGBA(0,255,0,255)) ; on mets un bon gros vert en fond
    Box(0,0,32,32,RGBA(120,0,0,255*0.5))  ; R = 120, Alpha = 127
    
    color=Point(0,0)
    r2 = Red(color)
    
    Debug GetPixelColor(255,0,r1,r2) ; couleur R devrait être 120
    Debug GetPixelColor(255,0,r1,r2,1)*255 ; alpha devrait $etre 255*0.5 soit 127
     
    StopDrawing()
EndIf

; SaveImage(2,"image_test.png",#PB_ImagePlugin_PNG) ; si besoin, on sauve l'image
Je pense que c'est ok, non ?

EDIT :
j'ai corrigé une erreur, il fallait que j'utilise 1-AI (le pourcentage de l'a couleur affichée sur le fond) et non Ai tout seul pour l'alpha ^^.

Re: [5.42] Grabsprite() et savesprite()

Publié : mar. 26/avr./2016 14:30
par Ar-S
Comme toi j'aurai utilisé le point().
C'est très propre,

Je me suis amusé à faire l'inverse ^^

Code : Tout sélectionner

Declare Stock(Array tableau(2), Largeur, Hauteur, NUMIMAGE)
Declare Recreate()

Enumeration
  #im1
  #im1copy
EndEnumeration


UsePNGImageDecoder()
 UsePNGImageEncoder()


i0 = LoadImage(#im1,"compar2.png")

Global largeur = ImageWidth(#im1)
Global hauteur = ImageHeight(#im1)
Global BGC ; couleur du fond
Global Dim pixel(LARGEUR,HAUTEUR)


 
 
CreateImage(#im1copy,largeur,hauteur,32,#PB_Image_Transparent)

Stock(pixel(), Largeur, Hauteur, #im1)

If Recreate() = 1
  SaveImage(#im1copy,"compare_test.png",#PB_ImagePlugin_PNG) ; si besoin, on sauve l'image
EndIf




;- *** STOCK
; On stock les couleurs de l'image NUMIMAGE dans un tableau tableau() à 2 dimensions
Procedure Stock(Array tableau(2), Largeur, Hauteur, NUMIMAGE)  ; Le 2 représente le nombre de dimensions du tableau
  StartDrawing(ImageOutput(NUMIMAGE))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  
  BGC = Point(5,2)
  Debug "BGC = " + BGC
  
  For y = 0 To Hauteur-1
    For x = 0 To Largeur-1
      Tableau(x,y) = Point(x,y)
     Next x
   Next y
   StopDrawing()
   Debug "ok"
 EndProcedure
 
 
 
 Procedure Recreate()
   
   
   If StartDrawing(ImageOutput(#im1copy))
     DrawingMode(#PB_2DDrawing_AlphaBlend)
     
     For y = 0 To Hauteur-1
       For x = 0 To Largeur-1
         
         col = pixel(x,y)
         
         R = Red(COL)
         G = Green(COL)
         B = Blue(COL)
         
         Rn = Red(BGC)
         Gn = Green(BGC)
         Bn = Blue(BGC)
         
         
         If col = BGC
           If R > (Rn+5) Or G > (Gn+5) Or B > (Bn+5) Or R < (Rn-5) Or G < (Gn-5) Or B < (Bn-5); Histoire de gérer les pixels contigues
             Plot (x, y , RGBA(0,0,0,0))
           Else
             Plot (x, y , col)
           EndIf
         EndIf
         
         Next x
     Next y
     
     Debug "OK 2"
   
   StopDrawing()
   ProcedureReturn 1
 Else
   ProcedureReturn 0
   EndIf
     
 EndProcedure
 
 
 

Re: [5.42] Grabsprite() et savesprite()

Publié : mar. 26/avr./2016 17:25
par blendman
Bon, mon système ne fonctionne pas complètement, j'ai l'impression que c'est prémultiplié. L'alpha semble ok, mais pas la couleur, auquel est ajouté du noir.

Il faut que je trouve d'où ça peut venir ^^

Code : Tout sélectionner


UsePNGImageEncoder()
UsePNGImageDecoder()

Structure sColor
    
    r1.a
    g1.a
    b1.a
    r2.a
    g2.a
    b2.a
    
EndStructure
Global c.sColor
With c
    ;rgb(255,0,255)
    \r1 = 255
    \g1 = 0
    \b1 = 255
    ; rgb(0,255,0)
    \r2 = 0
    \g2 = 255
    \b2 = 0
EndWith


Procedure.d GetPixelColor(ColorBg1,ColorBg2,ColorResult1,ColorResult2,alpha=0)
    
    ; it's better to use background color with differents colors

    ; Ai = Alpha Unknown in % (at return, we have to use Ai *255 to know the complete alpha
    
    ; ColorUnknown will be R, G or B
    ; ColorResult1 & ColorResult2 will be R, G or B
    ; ColorBg1 & ColorBg2 will be R, G or B
    
    ; A) ColorResult1 = (ColorBg1 + ColorUnknown) * (1-Ai)
    ; B) ColorResult2 = (ColorBg2 + ColorUnknown) * (1-Ai)
    
 
    ; ColorResult1/(1-Ai) = (ColorBg1 + ColorUnknown)
    
    ; so :
    ; ColorUnknown = (ColorResult1/(1-Ai)) - ColorBg1
    ; ColorUnknown = (ColorResult2/(1-Ai)) - ColorBg2
    
    ; replace ColorUnknown in B)
    
    ; ColorResult2 = (ColorBg2 + (ColorResult1/(1-Ai) - ColorBg1)) * (1-Ai)
    ; ColorResult2 = ColorBg2*(1-Ai) + ColorResult1 - ColorBg1*(1-Ai)
    ; ColorResult2 = (ColorBg2- ColorBg1)*(1-Ai) + ColorResult1  
    ; ColorResult2-ColorResult1  = (ColorBg2- ColorBg1)*(1-Ai) 
    ; (1-Ai) = (ColorResult2-ColorResult1) / (ColorBg2- ColorBg1)
    ; -Ai = ((ColorResult2-ColorResult1) / (ColorBg2- ColorBg1))-1
    ; Ai = 1-((ColorResult2-ColorResult1) / (ColorBg2- ColorBg1))
    
    ; Alpha unknown
    If (ColorBg2 - ColorBg1) <> 0
        Ai.d = 1 - ((ColorResult2-ColorResult1) / (ColorBg2- ColorBg1))
    EndIf
    
    ; color unkonwn
    If ai <> 0 
        
        ColorUnknown  = (ColorResult1)/(1-ai) - ColorBg1
                
        ColorUnknown2 = (ColorResult2/(1-ai)) - ColorBg2
        
        If ColorUnknown <> ColorUnknown2
            Debug ""+ColorUnknown+"/"+ColorUnknown2
        EndIf
        
        Debug ColorUnknown
    EndIf
    
    
    
    If alpha = 0      
       ProcedureReturn ColorUnknown
    Else
       ProcedureReturn Ai
    EndIf

EndProcedure

File$ = OpenFileRequester("Open a png with alpha","","PNG(*.png)|*.png",0)
If File$ = ""
    End
EndIf


If LoadImage(1,file$) =0
    Debug "erreur"
    End
EndIf


w= ImageWidth(1)
h= ImageHeight(1)

CreateImage(2,w,h,32,#PB_Image_Transparent)

Dim color1(w,h)
Dim color2(w,h)

If StartDrawing(ImageOutput(2))
    
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0,0,w,h,RGBA(c\r1,c\g1,c\b1,255))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawAlphaImage(ImageID(1),0,0)
    
    ; SaveImage(2,"img1.png",#PB_ImagePlugin_PNG)      
    
    For i=0 To w-1
        For j =0 To h-1
            color1(i,j)=Point(i,j)
        Next
    Next
    
    ; color=Point(0,0)
    ; r1= Red(color)
    
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0,0,w,h,RGBA(c\r2,c\g2,c\b2,255))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawAlphaImage(ImageID(1),0,0)
    
    ; SaveImage(2,"img2.png",#PB_ImagePlugin_PNG)  
    
    For i=0 To w-1
        For j =0 To h-1
            color2(i,j)=Point(i,j)
        Next
    Next
    
    ;color=Point(0,0)
    ;r2 = Red(color)
    
    ;     Debug GetPixelColor(c\r1,c\r2,r2,r1) ; couleur devrait être 120
    ;     Debug GetPixelColor(255,0,r1,r2) ; couleur devrait être 120
    ;     Debug GetPixelColor(255,0,r1,r2,1)*255 ; alpha devrait etre 255*0.5 soit 127
    ;     Debug GetPixelColor(0,255,r2,r1,1)*255 ; alpha devrait etre 255*0.5 soit 127
           
    StopDrawing()
EndIf


CreateImage(3,w,h,32,#PB_Image_Transparent)
If StartDrawing(ImageOutput(3))
    
    ;DrawingMode(#PB_2DDrawing_AlphaChannel)
    ;Box(0,0,w,h,RGBA(0,0,255,0))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    
    For i=0 To w-1
        For j =0 To h-1
            
            r2 = Red(color2(i,j))  
            g2 = Green(color2(i,j))  
            b2 = Blue(color2(i,j))  
            
            r1 = Red(color1(i,j))
            g1 = Green(color1(i,j))
            b1 = Blue(color1(i,j))
            
            r = r1
            g = g1
            b = b1
            
            a1.d = GetPixelColor(c\r1,c\r2,r1,r2,1)
            a=a1*255
            
            If a > 0  
                If a >255
                    a= 255
                ElseIf a <0
                    a=0
                EndIf
                
                If a <> 0  
                    If a <> 255
                        r = GetPixelColor(c\r1,c\r2,r1,r2)
                        If r <0 : r=0 : EndIf
                        
                        ;If r>255 : R=255 : EndIf                 
                        
                        g = GetPixelColor(c\g1,c\g2,g1,g2)
                        If g<0 : g=0 : EndIf
                        ;If g>255 : g=255 : EndIf   
                        
                        b = GetPixelColor(c\b1,c\b2,b1,b2)
                        If b<0 : b=0 : EndIf 
                        ;If b>255 : b=255 : EndIf  
                        
                        ; Debug ""+r+"/"+g+"/"+b
                    EndIf
                                        
                    Plot(i,j,RGBA(r,g,b,a)) 
                EndIf
            EndIf
        Next
    Next
    
    StopDrawing()
EndIf

SaveImage(3,"original2.png",#PB_ImagePlugin_PNG)
EDIT :
j'ai corrigé le code, j'utilisais Ai au lieu de 1-Ai (pour connaître le pourcentage de couleur sur la couleur de fond. Mais j'ai toujours le problème avec les couleurs obtenues, elles ne sont pas bonnes :(

Re: [5.42] Grabsprite() et savesprite()

Publié : sam. 30/avr./2016 10:20
par Fig
Est ce que tu peux nous en dire plus là dessus ?
Comme vous l'avez peut-être vu, il y a un bug lorsqu'on sauvegarde un sprite avec grabsprite().
Est ce que j'ai bien compris: Tu charge un sprite au format PNG avec canal alpha. Tu applique à ce sprite un niveau de transparence avec ton programme. Tu souhaite ensuite ressauvegarder ce sprite au format Png ?

Re: [5.42] Grabsprite() et savesprite()

Publié : sam. 30/avr./2016 15:50
par blendman
En fait, j'ai oublié de mettre à jour ce sujet ^^. Un utilisateur du forum anglais a trouvé une solution qui fonctionne plutôt bien.

Voici le code d'Alter Mann :

Code : Tout sélectionner

EnableExplicit

Global w.i,h.i

Global HX1.l,HX2.l

Procedure FilterCallback(x, y, SourceCol, DestCol)
  Protected AB.d,AG.d,AR.d,B1.d,B2.d,B3.d,G1.d,G2.d,G3.d,R1.d,R2.d,R3.d,HB1.d,HB2.d,HG1.d,HG2.d,HR1.d,HR2.d,AX.d,Tx.d
  Protected t.i = 0
  Protected R.l,B.l,G.l,A.l,A1.l,A2.l
 
  SourceCol & $FFFFFFFF
  DestCol   & $FFFFFFFF
 
  If SourceCol = HX2 And DestCol = HX1  ; both with background colour
    ProcedureReturn RGBA(255,255,255,0) ; white - fully transparent
  EndIf
 
  A1 = Alpha(SourceCol) ; only for test
  A2 = Alpha(DestCol)    ; only for test
 
  B1 = Blue(SourceCol)
  B2 = Blue(DestCol)
  HB2 = Blue(HX1)
  HB1 = Blue(HX2)
  If HB1 <> HB2
    AB = 1 - (B2-B1) / (HB2-HB1)   
    t + 1
  EndIf
  G1 = Green(SourceCol)
  G2 = Green(DestCol)
  HG2 = Green(HX1)
  HG1 = Green(HX2)
  If HG1 <> HG2
    AG = 1 - (G2-G1) / (HG2-HG1)
    t + 2
  EndIf
  R1 = Red(SourceCol)
  R2 = Red(DestCol)
  HR2 = Red(HX1)
  HR1 = Red(HX2)
  If HR1 <> HR2
    AR = 1 - (R2-R1) / (HR2-HR1)
    t + 4
  EndIf
  If t = 0 ; both pixels with the same colour - can't calculate the alpha
    Debug "Pixel " + Str(x) + "," + Str(y) + "undefined"
    ProcedureReturn DestCol
  EndIf
  AX = 0.0
  Tx = 0.0
  If t&1 : AX + AB : Tx + 1.0 : EndIf
  If t&2 : AX + AG : Tx + 1.0 : EndIf
  If t&4 : AX + AR : Tx + 1.0 : EndIf
 
  AX / Tx
  B3 = (B1 - (1-AX) * HB1 + B2 - (1-AX) * HB2) / (2 * AX)
  G3 = (G1 - (1-AX) * HG1 + G2 - (1-AX) * HG2) / (2 * AX)
  R3 = (R1 - (1-AX) * HR1 + R2 - (1-AX) * HR2) / (2 * AX)
 
  A = Int(AX*255)
  B = Int(B3) : If B > 255 : B = 255 : ElseIf B < 0 : B = 0 : EndIf
  G = Int(G3) : If G > 255 : G = 255 : ElseIf G < 0 : G = 0 : EndIf
  R = Int(R3) : If R > 255 : R = 255 : ElseIf R < 0 : R = 0 : EndIf
 
  ProcedureReturn RGBA(R,G,B,A)
 
EndProcedure

; bachground colours must be known
HX1.l = RGBA(255,  0,255,255)
HX2.l = RGBA(  0,255,  0,255)

UsePNGImageDecoder()
UsePNGImageEncoder()

LoadImage(1,"compar_1.png")
LoadImage(2,"compar_2.png")

w = ImageWidth(1)
h = ImageHeight(1)
CreateImage(3,w,h,32)

If StartDrawing(ImageOutput(3))
  DrawImage(ImageID(1),0,0)
  DrawingMode(#PB_2DDrawing_CustomFilter)     
  CustomFilterCallback(@FilterCallback())
  DrawImage(ImageID(2),0,0)
  StopDrawing()
EndIf

SaveImage(3,"savesprite_final.png",#PB_ImagePlugin_PNG,0,32)
End
Fig a écrit :Est ce que tu peux nous en dire plus là dessus ?
Comme vous l'avez peut-être vu, il y a un bug lorsqu'on sauvegarde un sprite avec grabsprite().
Est ce que j'ai bien compris: Tu charge un sprite au format PNG avec canal alpha. Tu applique à ce sprite un niveau de transparence avec ton programme. Tu souhaite ensuite ressauvegarder ce sprite au format Png ?
Pas tout à fait ^^.
Ce que je souhaitais faire (j'utilise cette méthode dans certaines de mes applications) c'est sauvegarder ce qu'on voit sur l'écran (le screen, pas le moniteur), autrement dit l'ensemble des sprites avec les transformations/blendmode, etc...
Donc, pour ça, je faisais Grabsprite() puis savesprite().
Mais actuellement, il y a un bug cela crée des artefacts sur l'image sauvegardées : en réalité, si alpha=0 sur les sprites, c'est transparent, mais si alpha>0 avec sur l'image sauvegardée cet alpha=255.
Donc, pour éviter ça, j'avais tenté de trouver une technique, qui était de sauvegarder deux fois l'image du screen, avec une couleur de fond différentes, puis de comparer ces deux images pour retrouver la bonne couleur et le bon alpha ^^ (ce que permet le code d'alter mann ^^).