Differenze tra le versioni di "Estrarre i fotogrammi che compongono un file immagine di tipo GIF animata"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Un file immagine di tipo GIF animata è formato, come ogni media capace di rappresentare e riprodurre virtualmente e visivamente movimento, da due o più immagini (fotogrammi). Pertanto tale file immagine GIF animata contiene i dati immagine di ciascuna immagine facente parte del video. Per estrarre ed ottenere un file mono-immagine di ciascuna immagine, che costituisce la GIF animata, sarà necessario evidentemente individuare il byte iniziale e il byte finale dei dati di ogni predetta mono-immagine gif.
 
Un file immagine di tipo GIF animata è formato, come ogni media capace di rappresentare e riprodurre virtualmente e visivamente movimento, da due o più immagini (fotogrammi). Pertanto tale file immagine GIF animata contiene i dati immagine di ciascuna immagine facente parte del video. Per estrarre ed ottenere un file mono-immagine di ciascuna immagine, che costituisce la GIF animata, sarà necessario evidentemente individuare il byte iniziale e il byte finale dei dati di ogni predetta mono-immagine gif.
  
Un file immagine di tipo GIF, sia esso unico-statico o animato, è comunque organizzato da vari blocchi. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
Un file immagine di tipo GIF, sia esso unico-statico o animato, è comunque organizzato da vari blocchi di dati. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
  
In grandi linee possiamo dire che del file immagine GIF animata vanno presi in considerazione una parte iniziale che va dal primo byte del file medesimo sino al byte immediatamente precedente al byte del blocco chiamato "''Graphic Control Extension''". Va detto che il byte che precede i dati del "''Graphic Control Extension''" è sempre uguale a zero (&h00), e che i primi due byte del "''Graphic Control Extension''" sono sempre &h21 e &hF9. Questi tre byte sono sufficienti per individuare efficacemente e in modo certo il blocco in questione.
+
In grandi linee possiamo dire che del file immagine GIF animata vanno prese in considerazione:
 +
<BR>1) una parte iniziale che va dal primo byte del file medesimo sino al byte immediatamente precedente al byte del blocco chiamato "''Graphic Control Extension''" dei dati appartenenti alla prima mono-immagine GIF costituente la GIF animata.
 +
<BR>Va precisato che il byte che precede i dati del "''Graphic Control Extension''" è sempre uguale a zero (&h00), e che i primi due byte del blocco "''Graphic Control Extension''" sono sempre &h21, &hF9 e &h04. Questi quattro byte sono necessari e sufficienti per individuare efficacemente e in modo certo il blocco di dati in questione.
 +
<BR>2) i dati afferenti a ciascuna mono-immagine di tipo GIF costituente la GIF animata. Tali dati vanno dal primo byte del blocco "''Graphic Control Extension''" della mono-immagine in questione sino al byte immediatamente precedente al byte del blocco "''Graphic Control Extension''" ovviamente appartenente alla mono-immagine GIF successiva.
 +
<BR>Nel caso in cui tali dati si riferiscano all'ultima mono-immagine GIF, costituente la GIF animata, essi sono quelli compresi dal primo byte del blocco "''Graphic Control Extension''" della mono-immagine in questione sino al byte finale della GIF animata, chiamato "''Trailer''", che corrisponde al valore &h3B.
  
 +
Ricavate così le suddette parti, ad ogni blocco di dati estratti (di cui al precedente punto 2), cioè quelli appartenenti a ciascuna mono-immagine GIF costituente la GIF animata, si aggiungerà in testa il blocco generico di cui al precedente punto 1).
  
  
 +
Mostriamo di seguito un semplice esempio:
 +
Private Const GCE As String = "\x00\x21\xF9\x04"
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim s, parz1, parz2 As String
 +
  Dim i As Integer
 +
  Dim ii As New Integer[]
 +
 
 +
  s = File.Load("<FONT Color=gray>''/percorso/del/file/animato.gif''</font>")
 +
 
 +
  i = InStr(s, GCE, i + 1)
 +
  If i == 0 Then
 +
    Error.Raise("Il file immagine gif non possiede alcun blocco 'Graphics Control Extension' !")
 +
  Endif
 +
 
 +
<FONT Color=gray>' ''Applica un ciclo per ottenere tutte le ricorrenze dell'inizio del blocco "Graphics Control Extension"''</font>
 +
  Repeat
 +
    ii.Push(i)
 +
    i = InStr(s, GCE, i + 1)
 +
  Until i == 0
 +
 
 +
  For i = 0 To ii.Max
 +
    parz1 = Mid(s, 1, ii[0])
 +
    If i = ii.Max Then
 +
      parz2 = Mid(s, ii[ii.Max] + 1, Len(s) - ii[ii.Max])
 +
    Else
 +
      parz2 = Mid(s, ii[i] + 1, ii[i + 1] - ii[i]) & Chr(&3B)
 +
    Endif
 +
    File.Save("<FONT Color=gray>''/percorso/di/ciascun/fotogramma''</font>" & CStr(i) & "<FONT Color=gray>''.gif''</font>", parz1 & parz2)
 +
  Next
 +
 
 +
'''End'''
  
  
Riga 12: Riga 51:
 
=Note=
 
=Note=
 
[1] Al riguardo si rinvia a quest'altra pagina della Wiki: [[Struttura_del_formato_GIF|Struttura del formato GIF]].
 
[1] Al riguardo si rinvia a quest'altra pagina della Wiki: [[Struttura_del_formato_GIF|Struttura del formato GIF]].
 
 
 
 
<FONT Color=red size=4><B>Pagina in costruzione !</b></font>
 

Versione attuale delle 01:08, 25 ago 2020

Un file immagine di tipo GIF animata è formato, come ogni media capace di rappresentare e riprodurre virtualmente e visivamente movimento, da due o più immagini (fotogrammi). Pertanto tale file immagine GIF animata contiene i dati immagine di ciascuna immagine facente parte del video. Per estrarre ed ottenere un file mono-immagine di ciascuna immagine, che costituisce la GIF animata, sarà necessario evidentemente individuare il byte iniziale e il byte finale dei dati di ogni predetta mono-immagine gif.

Un file immagine di tipo GIF, sia esso unico-statico o animato, è comunque organizzato da vari blocchi di dati. [Nota 1]

In grandi linee possiamo dire che del file immagine GIF animata vanno prese in considerazione:
1) una parte iniziale che va dal primo byte del file medesimo sino al byte immediatamente precedente al byte del blocco chiamato "Graphic Control Extension" dei dati appartenenti alla prima mono-immagine GIF costituente la GIF animata.
Va precisato che il byte che precede i dati del "Graphic Control Extension" è sempre uguale a zero (&h00), e che i primi due byte del blocco "Graphic Control Extension" sono sempre &h21, &hF9 e &h04. Questi quattro byte sono necessari e sufficienti per individuare efficacemente e in modo certo il blocco di dati in questione.
2) i dati afferenti a ciascuna mono-immagine di tipo GIF costituente la GIF animata. Tali dati vanno dal primo byte del blocco "Graphic Control Extension" della mono-immagine in questione sino al byte immediatamente precedente al byte del blocco "Graphic Control Extension" ovviamente appartenente alla mono-immagine GIF successiva.
Nel caso in cui tali dati si riferiscano all'ultima mono-immagine GIF, costituente la GIF animata, essi sono quelli compresi dal primo byte del blocco "Graphic Control Extension" della mono-immagine in questione sino al byte finale della GIF animata, chiamato "Trailer", che corrisponde al valore &h3B.

Ricavate così le suddette parti, ad ogni blocco di dati estratti (di cui al precedente punto 2), cioè quelli appartenenti a ciascuna mono-immagine GIF costituente la GIF animata, si aggiungerà in testa il blocco generico di cui al precedente punto 1).


Mostriamo di seguito un semplice esempio:

Private Const GCE As String = "\x00\x21\xF9\x04"


Public Sub Main()
 
 Dim s, parz1, parz2 As String
 Dim i As Integer
 Dim ii As New Integer[]
 
 s = File.Load("/percorso/del/file/animato.gif")
 
 i = InStr(s, GCE, i + 1)
 If i == 0 Then
   Error.Raise("Il file immagine gif non possiede alcun blocco 'Graphics Control Extension' !")
 Endif
  
' Applica un ciclo per ottenere tutte le ricorrenze dell'inizio del blocco "Graphics Control Extension"
 Repeat
   ii.Push(i)
   i = InStr(s, GCE, i + 1)
 Until i == 0
 
 For i = 0 To ii.Max
   parz1 = Mid(s, 1, ii[0])
   If i = ii.Max Then
     parz2 = Mid(s, ii[ii.Max] + 1, Len(s) - ii[ii.Max])
   Else
     parz2 = Mid(s, ii[i] + 1, ii[i + 1] - ii[i]) & Chr(&3B)
   Endif
   File.Save("/percorso/di/ciascun/fotogramma" & CStr(i) & ".gif", parz1 & parz2)
 Next
  
End


Note

[1] Al riguardo si rinvia a quest'altra pagina della Wiki: Struttura del formato GIF.