Differenze tra le versioni di "Creare una GIF animata con le funzioni esterne del API di Libgd"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La libreria '''GD''' consente anche di creare un file di formato GIF contenente una immagine animata.
 
La libreria '''GD''' consente anche di creare un file di formato GIF contenente una immagine animata.
  
Per poter fruire in Gambas delle risorse della libreria ''GD'', è necessario installare e richiamare la libreria dinamica e condivisa: "''libgd.so.3.0.0''"
+
Per poter fruire in Gambas delle risorse della libreria ''GD'', è necessario installare e richiamare la libreria condivisa: "''libgd.so.3.0.5'' "
 
 
  
 
Mostriamo di seguito un semplice esempio, nel quale da quattro file immagine di formato ''PNG'' si genererà una ''GIF'' animata:
 
Mostriamo di seguito un semplice esempio, nel quale da quattro file immagine di formato ''PNG'' si genererà una ''GIF'' animata:
  Library "libgd:3.0.0"
+
  Library "libgd:3.0.5"
 
   
 
   
 
  <FONT Color=gray>' ''gdImagePtr gdImageCreateFromPng (FILE * fd)''</font>
 
  <FONT Color=gray>' ''gdImagePtr gdImageCreateFromPng (FILE * fd)''</font>
Riga 39: Riga 38:
 
   Dim i As Integer
 
   Dim i As Integer
 
   
 
   
    ex = fopen("/tmp/file.gif", "wb")
+
  ex = fopen("/tmp/file.gif", "wb")
    If ex = 0 Then Error.Raise("Impossibile creare il file di formato GIF !")
+
  If ex == 0 Then Error.Raise("Impossibile creare il file di formato GIF !")
 
      
 
      
 
  <FONT Color=gray>' ''Inserisce la prima immagine:''</font>
 
  <FONT Color=gray>' ''Inserisce la prima immagine:''</font>
    imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/primo/file.png''</font>", "rb"))
+
  imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/primo/file.png''</font>", "rb"))
    If imago = 0 Then Error.Raise("Impossibile creare la GIF animata!")
+
  If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
 
    
 
    
    gdImageGifAnimBegin(imago, ex, 1, -1)
+
  gdImageGifAnimBegin(imago, ex, 1, -1)
 
    
 
    
    prev = imago
+
  prev = imago
 
    
 
    
    For i = 0 To 47
+
  For i = 0 To 47
   
 
 
  <FONT Color=gray>' ''Inserisce le altre immagini:''</font>
 
  <FONT Color=gray>' ''Inserisce le altre immagini:''</font>
      imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/secondo/file.png''</font>", "rb"))
+
    imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/secondo/file.png''</font>", "rb"))
      If imago = 0 Then Error.Raise("Impossibile creare la GIF animata!")
+
    If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
      
+
     gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
      gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
+
     prev = imago
      
+
    imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/terzo/file.png''</font>", "rb"))
      prev = imago
+
    If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
     
+
     gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
      imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/terzo/file.png''</font>", "rb"))
+
     prev = imago
      If imago = 0 Then Error.Raise("Impossibile creare la GIF animata!")
+
    imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/quarto/file.png''</font>", "rb"))
      
+
    If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
      gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
+
     gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
      
+
     prev = imago
      prev = imago
+
    imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/primo/file.png''</font>", "rb"))
     
+
    If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
      imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/quarto/file.png''</font>", "rb"))
+
     gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
      If imago = 0 Then Error.Raise("Impossibile creare la GIF animata!")
+
     prev = imago
      
 
      gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
 
      
 
      prev = imago
 
     
 
      imago = gdImageCreateFromPng(fopen("<FONT Color=gray>''/percorso/del/primo/file.png''</font>", "rb"))
 
      If imago = 0 Then Error.Raise("Impossibile creare la GIF animata!")
 
      
 
      gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
 
      
 
      prev = imago
 
   
 
    Next
 
   
 
 
      
 
      
 +
  Next 
 +
 
  <FONT Color=gray>' ''Genera in fine il file della GIF animata:''</font>
 
  <FONT Color=gray>' ''Genera in fine il file della GIF animata:''</font>
    gdImageGifAnimEnd(ex)
+
  gdImageGifAnimEnd(ex)
   
+
 
   
 
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
    gdImageDestroy(imago)
+
  gdImageDestroy(imago)
    fclose(ex)
+
  fclose(ex)
 
      
 
      
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 20:17, 30 nov 2021

La libreria GD consente anche di creare un file di formato GIF contenente una immagine animata.

Per poter fruire in Gambas delle risorse della libreria GD, è necessario installare e richiamare la libreria condivisa: "libgd.so.3.0.5 "

Mostriamo di seguito un semplice esempio, nel quale da quattro file immagine di formato PNG si genererà una GIF animata:

Library "libgd:3.0.5"

' gdImagePtr gdImageCreateFromPng (FILE * fd)
Private Extern gdImageCreateFromPng(fd As Pointer) As Pointer

' void gdImageGifAnimBegin(gdImagePtr im, FILE *outFile, int GlobalCM, int Loops)
Private Extern gdImageGifAnimBegin(im As Pointer, outFile As Pointer, GCM As Integer, Loops As Integer)

' void gdImageGifAnimAdd(gdImagePtr im, FILE *outFile, int LocalCM, int LeftOfs, int TopOfs, int Delay, int Disposal, gdImagePtr previm)
Private Extern gdImageGifAnimAdd(im As Pointer, outFile As Pointer, LCM As Integer, LeftOfs As Integer, TopOfs As Integer, Delay As Integer, Disposal As Integer, previm As Pointer)

' void gdImageGifAnimEnd(FILE *outFile)
Private Extern gdImageGifAnimEnd(outFile As Pointer)

' void gdImageDestroy (gdImagePtr im)
Private Extern gdImageDestroy(gdImage As Pointer)


Library "libc:6"

' FILE *fopen(const char *filename, const char *mode)
' Opens the filename pointed to by filename using the given mode.
Private Extern fopen(filename As String, mode As String) As Integer

' int fclose(FILE *stream)
' Closes the stream. All buffers are flushed.
Private Extern fclose(flstream As Pointer) As Integer


Public Sub Main()
 
 Dim imago, flin, ex, prev As Pointer
 Dim i As Integer

 ex = fopen("/tmp/file.gif", "wb")
 If ex == 0 Then Error.Raise("Impossibile creare il file di formato GIF !")
   
' Inserisce la prima immagine:
 imago = gdImageCreateFromPng(fopen("/percorso/del/primo/file.png", "rb"))
 If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
 
 gdImageGifAnimBegin(imago, ex, 1, -1)
 
 prev = imago
 
 For i = 0 To 47  
' Inserisce le altre immagini:
   imago = gdImageCreateFromPng(fopen("/percorso/del/secondo/file.png", "rb"))
   If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
   gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
   prev = imago
   imago = gdImageCreateFromPng(fopen("/percorso/del/terzo/file.png", "rb"))
   If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
   gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
   prev = imago
   imago = gdImageCreateFromPng(fopen("/percorso/del/quarto/file.png", "rb"))
   If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
   gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
   prev = imago
   imago = gdImageCreateFromPng(fopen("/percorso/del/primo/file.png", "rb"))
   If imago == 0 Then Error.Raise("Impossibile creare la GIF animata!")
   gdImageGifAnimAdd(imago, ex, 1, 0, 0, 10, 1, prev)
   prev = imago
   
 Next  

' Genera in fine il file della GIF animata:
 gdImageGifAnimEnd(ex)
  
' Va in chiusura:
 gdImageDestroy(imago)
 fclose(ex)
   
End


Riferimenti