Quelqu'un pourrait tester ce code sous vista pour me dire si le fichier gif créé est une séquence d'images (j'ai pas dit un gif animé) ?
Je n'arrive à sauvegarder le gif qu'avec la première image et j'ai lu sur 2 sites que c'est impossible avec GDI+ version 1.0 (donc la version XP) mais cela fonctionnerait (?) avec la version 1.1
il contient les fichiers include de l'exemple + l'exemple (fichier GdipSaveAddImage_format_gif_vista.pb) et les 4 images. Il faut mettre les chemins corrects des images et des includefiles.
Le résultat devrait être un fichier gif contenant 4 images.
Code : Tout sélectionner
XIncludeFile "../../../gdiplus.pbi"
EnableExplicit
#MainWindow = 0
#ButtonGadget = 0
#Fichier1 = "../images/chien.bmp"
#Fichier2 = "../images/chat.png"
#Fichier3 = "../images/Rose_1.jpg"
#Fichier4 = "../images/chien_2.gif"
Define .l
Global *token, *image1, *image2, *image3, *image4
Global Params.EncoderParameters, erreur.l, texte$, size.q, quit.l, Valeurparametre.l, OldProc.l
Global encoderCLSID.GUID, rc.rect, rc1.rect, NomFichier$, FichierParDefaut$, status.l
Procedure GetEncoderClsid(format.s, *Clsid.CLSID)
Protected nombre.l ; nombre d'encodeurs d'image
Protected Size.l ; taille du tableau image encoder en octets
Protected *pImageCodecInfo.ImageCodecInfo ; pointeur sur le tableau image encoder
Protected i.l, Memoire.l
GdipGetImageEncodersSize(@nombre.l, @Size.l)
If Size = 0
ProcedureReturn - 1 ; Echec
EndIf
Memoire = AllocateMemory(Size)
If Memoire = #Null
ProcedureReturn - 1 ; Echec
EndIf
*pImageCodecInfo = Memoire
GdipGetImageEncoders(nombre, Size, *pImageCodecInfo)
For i = 1 To nombre
If format = PeekS(@*pImageCodecInfo\MimeType, -1, #PB_Unicode)
CopyMemory(@*pImageCodecInfo\clsid, *Clsid, SizeOf(CLSID))
FreeMemory(Memoire)
ProcedureReturn i ; Succes
EndIf
*pImageCodecInfo + SizeOf(ImageCodecInfo)
Next i
FreeMemory(Memoire)
ProcedureReturn - 1 ; Echec
EndProcedure
Procedure GDIpCallback(window, message, wParam, lParam)
Protected dc.l, ps.PAINTSTRUCT
Protected *Localtoken, *Localgfx
Select message
Case #WM_CLOSE
If *token
GdipDisposeImage(*image1)
GdipDisposeImage(*image2)
GdipDisposeImage(*image3)
GdipDisposeImage(*image4)
GdiplusShutdown(*token)
*token = 0
EndIf
OldProc = SetWindowLong_(WindowID(#MainWindow), #GWL_WNDPROC, OldProc)
quit + 1
ProcedureReturn 0
EndSelect
ProcedureReturn CallWindowProc_(OldProc, window, message, wParam, lParam)
EndProcedure
If OpenWindow(#MainWindow, 0, 0, 650, 220, "GdiPlus 1.0 - GdipSaveAddImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#MainWindow))
ButtonGadget(#ButtonGadget, 10, 140, 630, 70, "Enregistrer les 4 images ci-dessus" + Chr(10) + "en un seul fichier au format gif", #PB_Button_MultiLine)
SetGadgetFont(#ButtonGadget, LoadFont(0, "Arial", 12))
*token = Gdiplus_New()
If *token
; retrouve le CLSID of de l'encodeur gif
If GetEncoderClsid("image/gif", @encoderCLSID) = -1
; impossible de retrouver le CLSID de l'encoder gif
MessageRequester("Erreur", "Impossible de retrouver l'identifiant de l'encodeur" + Chr(10) + "l'application va fermer", 16)
Else
; création des 4 images qui serviront à créer la séquence d'images pour le gif
GdipLoadimageFromFile(#Fichier1, @*image1)
GdipLoadimageFromFile(#Fichier2, @*image2)
GdipLoadimageFromFile(#Fichier3, @*image3)
GdipLoadimageFromFile(#Fichier4, @*image4)
; création du tableau d'encoder
; un EncoderParameters object est un tableau d'EncoderParameter.
; Initialise le seul élément du tableau pour cet exemple
Params\Count = 1
CopyMemory(?EncoderSaveFlag, Params\Parameter\guid, SizeOf(guid))
With Params\Parameter[0]
\NumberOfValues = 1
\Type = #EncoderparameterValueTypeLong
\Value = @Valeurparametre
EndWith
OldProc = SetWindowLong_(WindowID(#MainWindow), #GWL_WNDPROC, @GDIpCallback())
; boucle
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
erreur = 0
; ouvre la boite d'enregistrement des fichiers
NomFichier$ = SaveFileRequester("Enregistrer le fichier gif", "../images/", "gif (*.gif)|*.gif", 0)
If NomFichier$ = ""
erreur = 1
ElseIf GetExtensionPart(NomFichier$) = ""
If Right(NomFichier$, 1) = "."
NomFichier$ = Left(NomFichier$, Len(NomFichier$) - 1)
EndIf
NomFichier$ = GetPathPart(NomFichier$) + GetFilePart(NomFichier$) + ".gif"
ElseIf LCase(GetExtensionPart(NomFichier$)) <> "tif"
MessageRequester("Erreur", "L'extension du fichier n'est pas 'gif'", 16)
erreur = 1
EndIf
If CheckFilename(GetFilePart(NomFichier$)) = 0
erreur = 1
EndIf
size = FileSize(NomFichier$)
If (erreur = 0) And (size > - 1)
texte$ = "Le fichier " + GetFilePart(NomFichier$) + " existe" + Chr(10) + Chr(10)
texte$ + "Voulez-vous l'écraser ?"
If MessageRequester("Fichier existant", texte$, #PB_MessageRequester_YesNoCancel) <> #PB_MessageRequester_Yes
erreur = 1
EndIf
EndIf
If erreur = 0
; Sauvegarde la première page
Valeurparametre = #EncoderValueMultiFrame
status = GdipSaveImageToFile(*Image1, NomFichier$, @encoderCLSID, @Params)
If status = #Ok
; la première page a été sauvegardée correctement, on sauvegarde la seconde page
Valeurparametre = #EncoderValueFrameDimensionTime
status = GdipSaveAddImage(*Image1, *Image2, Params)
If status = #Ok
; la seconde page a été sauvegardée correctement, on sauvegarde la troisième page
Valeurparametre = #EncoderValueFrameDimensionTime
status = GdipSaveAddImage(*Image1, *Image3, Params)
If status = #Ok
; la troisième page a été sauvegardée correctement, on sauvegarde la quatrième page
Valeurparametre = #EncoderValueFrameDimensionTime
status = GdipSaveAddImage(*Image1, *Image4, Params)
If status = #Ok
; la quatrième page a été sauvegardée correctement, ferme le fichier (séquence d'image)
Valeurparametre = #EncoderValueFlush
status = GdipSaveAdd(*Image1, @Params)
If status = #Ok
size = FileSize(NomFichier$)
texte$ = "Le fichier " + GetFilePart(NomFichier$) + Chr(10) + "a été enregistré avec succès" + Chr(10) + Chr(10)
texte$ + "Taille du fichier : " + StrQ(size) + " octets (" + StrQ(size / 1024) + " Ko)"
MessageRequester("Enregistrement du fichier gif", texte$)
Else
MessageRequester("Erreur", "La fonction GdipSaveAdd a échouée" + Chr(10) + " et a retournée l'erreur " + Str(status), 16)
EndIf
Else
MessageRequester("Erreur", "La fonction GdipSaveAddImage a échouée (4ième image)" + Chr(10) + " et a retournée l'erreur " + Str(status), 16)
EndIf
Else
MessageRequester("Erreur", "La fonction GdipSaveAddImage a échouée (3ième image)" + Chr(10) + " et a retournée l'erreur " + Str(status), 16)
EndIf
Else
MessageRequester("Erreur", "La fonction GdipSaveAddImage a échouée (2ième image)" + Chr(10) + " et a retournée l'erreur " + Str(status), 16)
EndIf
Else
MessageRequester("Erreur", "La fonction GdipSaveImageToFile a échouée" + Chr(10) + " et a retournée l'erreur " + Str(status), 16)
EndIf
EndIf
EndSelect
Until quit
EndIf
EndIf
EndIf
EndIf
End
DataSection
;/ EncoderSaveFlag
EncoderSaveFlag :
Data.l $292266FC
Data.w $AC40, $47BF
Data.b $8C, $FC, $A8, $5B, $89, $A6, $55, $DE
EndDataSection