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

Da Gambas-it.org - Wikipedia.
Riga 5: Riga 5:
 
In grandi linee possiamo dire che del file immagine GIF animata vanno prese in considerazione:
 
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>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 e &hF9. Questi tre byte sono necessari e sufficienti per individuare efficacemente e in modo certo il blocco di dati in questione.
+
<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>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.
 
<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.
Riga 22: Riga 22:
 
    
 
    
 
   Do  <FONT Color=gray>' ''Applichiamo un ciclo per ottenenre tutte le ricorrenze dell'inizio del blocco "Graphics Control Extension"''</font>
 
   Do  <FONT Color=gray>' ''Applichiamo un ciclo per ottenenre tutte le ricorrenze dell'inizio del blocco "Graphics Control Extension"''</font>
     i = InStr(s, Chr(&00) & Chr(&21) & Chr(&F9), i + 1)
+
     i = InStr(s, Chr(&00) & Chr(&21) & Chr(&F9) & Chr(&04), i + 1)
 
     If i = 0 Then Break
 
     If i = 0 Then Break
 
     ii.Push(i)
 
     ii.Push(i)

Versione delle 17:01, 15 set 2017

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:

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")
  
  Do   ' Applichiamo un ciclo per ottenenre tutte le ricorrenze dell'inizio del blocco "Graphics Control Extension"
    i = InStr(s, Chr(&00) & Chr(&21) & Chr(&F9) & Chr(&04), i + 1)
    If i = 0 Then Break
    ii.Push(i)
  Loop
  
  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.