[RESOLU] GIF Transparent

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[RESOLU] GIF Transparent

Message par Progi1984 »

Voilà, grâce à ce code, j'arrive à afficher sans problème un GIF...

Mais petit problème : il affiche en zone noire la partie transparente.
On m'a dit qu'il y avait des possibilités avec GDI+ mais n'étant pas un expert de ce type de code, j'en appelle à vous...
Lien intéressant : http://marknelson.us/2002/07/01/renderi ... -revisited

Code : Tout sélectionner

; Pour quitter, clic droit 
Procedure LoadPictureFile(image,szFile.s)  
  ;  
  ; Loads  
  ;        BMP, GIF, JPG, WMF, EMF, ICO  
  ;  
  hFile = CreateFile_(szFile, #GENERIC_READ, 0, #Null, #OPEN_EXISTING, 0, #Null)  
  If hFile  
    dwFileSize = GetFileSize_(hFile, #Null)  
    HGLOBAL    = GlobalAlloc_(#GMEM_MOVEABLE, dwFileSize)  
    If HGLOBAL  
      pvData = GlobalLock_(HGLOBAL)  
 
      bRead = ReadFile_(hFile, pvData, dwFileSize, @dwBytesRead, #Null)  
      GlobalUnlock_(HGLOBAL)  
       
      If bRead  
        If CreateStreamOnHGlobal_(HGLOBAL, #True, @pstm.IStream) = #S_OK  
          If OleLoadPicture_(pstm, dwFileSize, #False,?IID_IPicture, @Bild.IPicture) = #S_OK  
 
            ; Here we got the IPicture Object  
 
            Bild\get_Height(@Height)  
            Bild\get_Width(@Width)  
             
            hDC = GetDC_(GetDesktopWindow_())  
            ScreenPixels_X = GetDeviceCaps_(hDC,#LOGPIXELSX)  
            ScreenPixels_Y = GetDeviceCaps_(hDC,#LOGPIXELSY)  
            ReleaseDC_(GetDesktopWindow_(),hDC)  
 
            PicHeight = (Height * ScreenPixels_X) / 2540  
            PicWidth  = (Width  * ScreenPixels_Y) / 2540  
             
            result = CreateImage(image,PicWidth,PicHeight)  
             
            If result  
              hDC = StartDrawing(ImageOutput(image))  
                Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)  
              StopDrawing()  
            EndIf  
             
            Bild\Release()  
          EndIf  
          pstm\Release()  
        EndIf  
      EndIf  
    EndIf  
    CloseHandle_(hFile)  
  EndIf  
  ProcedureReturn Image  
 
  DataSection  
    IID_IPicture:  
      Data.l $7BF80980  
      Data.w $BF32,$101A  
      Data.b $8B,$BB,$00,$AA,$00,$30,$0C,$AB  
  EndDataSection  
EndProcedure  


Image = LoadPictureFile(1,"C:\Perso\PureBasic\CodeArchiv\Graphics\Gfx\anim_surprize.gif")
If Image
  OpenWindow(1,0,0,ImageWidth(Image),ImageHeight(Image),"ImageV!ew",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
  CreateGadgetList(WindowID(1))
  ImageGadget(1,0,0,ImageWidth(Image),ImageHeight(Image),ImageID(Image))
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : End
      Case #WM_RBUTTONUP         : End
      Case #WM_LBUTTONDOWN       : SendMessage_(WindowID(1),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
    EndSelect
  ForEver
EndIf
Dernière modification par Progi1984 le lun. 30/avr./2007 15:31, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Salut Progi1984

je ne pense pas que GDI+ corrigera ton problème (tout au moins en conservant la même manière de faire).

Voilà ce que je pense :
Tu affiches ton image non pas sur la fenêtre avec l'identifiant statique 1 (ta fenêtre principale) mais sur une imagegadget qui n'est rien d'autre qu'une fenêtre qui a le fond noir. Une imageGadget est une fenêtre Windows avec la classe "Static" (c'était comme ça juste avant la version 4, je n'ai pas recontrôlé).

La classe "Static" est enregistrée avec le paramètre hbrBackground de la structure WNDCLASSEX valant 0, qui n'est ni plus ni moins que du noir. MS dit que si ce paramètre est à 0, l'application doit repeindre son fond etc etc... (j'ai testé ton code avec l'API GetClassInfoEx_() et j'ai bien ce paramètre à 0). Ton image applique bien la transparence sur du noir.

Si on utilise GDI+ en affichant sur une imageGadget, on aura le même problème.

Mais que veux-tu faire ?

Avoir une image mobile que tu puisses déplacer sur tout l'écran dont les pixels transparents laisseraient passer le fond ?
Si c'est ça, reportes-toi à l'excellent exemple de l'horloge d'erix14. Tu pourrais t'en inspirer, en particulier de l'API UpdateLayeredWindow_().
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Denis a écrit :Mais que veux-tu faire ?
Je souhaite que la couleur de transparence soit égale à la couleur de fond des fenêtres... soit en général le gris et non pas le noir !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

J'ai peut être dit des conneries, c'est plutôt du à la création de l'image avec createimage qui d'origine à le fond noir (les variables mise à 0 par défaut
Sinon un simple StartDrawing doit faire l'affaire.
Bizarre ton histoire de fond de fenêtre grise, en général c'est beige, voire blanc.

voilà comment modifier le code dans ta procedure LoadPictureFile, j'ai ajouté Box(0, 0, PicWidth, PicHeight , 255) qui mettra le fond en rouge

Moi j'utilise ceci pour avoir la couleur système des fenêtres :

Code : Tout sélectionner

GetSysColor_(#COLOR_BTNFACE)

Code : Tout sélectionner

            If result 
              hDC = StartDrawing(ImageOutput(image))
                Box(0, 0, PicWidth, PicHeight , 255)  ; <---   ici
                Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0) 
              StopDrawing() 
            EndIf 

ce qui donne pour le fond couleur système

Code : Tout sélectionner

            If result 
              hDC = StartDrawing(ImageOutput(image))
                Box(0, 0, PicWidth, PicHeight , GetSysColor_(#COLOR_BTNFACE))  ; <---   ici
                Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0) 
              StopDrawing() 
            EndIf 
Si ca ne va pas , regarde les nombreuses constantes de Getsyscolor (en particulier #COLOR_WINDOW)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est nickel ! Merci Denis !
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

C'est nickel pour une fenetre avec une couleur comme fond mais pas pour une fenetre avec comme fond une image!

Y-a-t'il un code pour ce cas?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

RV a écrit :C'est nickel pour une fenetre avec une couleur comme fond mais pas pour une fenetre avec comme fond une image!

Y-a-t'il un code pour ce cas?

RV, commences par poster ton code de base car s'il faut tout faire de a à z, t'auras pas beaucoup de réponse.
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Salut Denis,

C'est vrai, j'aurais du.
En même temps je n'attends plus de soluces car j'en ai une!

Donc ce post est [RESOLU]

PS: ma soluce ne concerne pas les GIFs, mais simplement les images.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

RV a écrit :PS: ma soluce ne concerne pas les GIFs, mais simplement les images.
ce qui est dommage c'est de ne pas en faire profiter le forum, de ta soluce .. :?
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Salut Dobro,

Je suis hors sujet sur ce post car je ne parle pas de GIFs.
Je bosse sur les skins de gadgets et je voulais savoir comment récupérer un bout d'image de fond pour dessiner dessus afin de créer genre un bouton avec ImageGadget(), ce que fait très bien GrabImage().

Désolé pour le dérangement!
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour à tous

Et pour les GIF animés ....

Quelqu'un aurait il trouvé quelque chose de mieux que le webgadget pour les afficher ????
Répondre