Differenze tra le versioni di "Estrarre i fotogrammi che compongono un file immagine di tipo GIF animata"
(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>[[[#Note|Nota 1]]]</sup> | + | Un file immagine di tipo GIF, sia esso unico-statico o animato, è comunque organizzato da vari blocchi di dati. <SUP>[[[#Note|Nota 1]]]</sup> |
− | In grandi linee possiamo dire che del file immagine GIF animata vanno | + | 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]]. | ||
− | |||
− | |||
− | |||
− | |||
− |
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.