[Soci SLIP] recupero file JPG

loredana llcfree a gmail.com
Ven 30 Ago 2013 20:41:09 CEST


On Thu, 2013-08-29 at 11:21 +0200, Giampiero Marconetto wrote:
> questo è il link per visualizzare (si fa per dire perchè il file è
> rotto e non si vede nulla!)
> https://docs.google.com/file/d/0B4rFqZTh4CAUMWNCZnpWZ3JmaWc/edit?usp=sharing
> 
> La foto non è mia (ma posso distribuirla) mi dicono che era su un
> disco esterno, penso sia succsso qualche errore durante il
> trasferimento.
> NON È AFFATTO INDISPENSABILE IL RECUPERO, se si può bene, senno
> l'autore andrà a rifare la foto!

Verdetto:

a mio parere, l'immagine non si recupera.

Se pero' volete sapere perche', allora potete leggere qui sotto.

Prima di tutto, bisogna sapere come dev'essere fatto un file jpeg,
cosi' possiamo vedere dove e quanto e' danneggiato quello che non
si riesca ad aprire.

A che serve tutto cio'? Beh, a capire per decidere come agire.

Per esempio:

E' praticamente certo che nessuna applicazione riesca ad aprire
quell'immagine? => abbastanza inutile tentare, piu' o meno a caso.

Ma come faccio a sapere se e' praticamente certo? Continuate a
leggere :)

E' possibile recuperarla?

Per recuperarla, bisognerebbe avere l'informazione che si e' persa. Se
si ha quest'informazione, ci sono editor che permettono di cambiare
file binari, correggendoli, piu' o meno come cambiate un file di
testo. Ma se non la si ha, questa informazione, allora l'immagine non
si recupera. 

Ma qual e' l'informazione che si e' persa?

Continuate a leggere :)

In soldoni, per quel che interessa a noi adesso, un'immagine jpeg e'
composta di segmenti compressi, dove ogni inizio di segmento e'
marcato con due bytes che hanno un valore definito dallo standard.

Sono costretta a mettervi la pagina in inglese di wikipedia perche'
quella in italiano non ha l'informazione che ci interessa:

http://en.wikipedia.org/wiki/JPEG

Se da quella pagina scaricate una delle immagini jpeg a piu' bassa
risoluzione (tanto vogliamo solo sapere quali sono i due bytes di una
"qualsiasi" immagine jpeg), da terminale:

  wget -c
http://upload.wikimedia.org/wikipedia/commons/3/38/JPEG_example_JPG_RIP_001.jpg

tutto su una riga

e usate, per esempio, exifprobe (probabilmente dovrete prima
installarlo)

  exifprobe JPEG_example_JPG_RIP_001.jpg

ottenete una serie di informazioni sulla vostra immagine:

File Name = JPEG_example_JPG_RIP_001.jpg
File Type = JPEG
File Size = 1523
@000000000=0       :  <JPEG_SOI>
@0x0000002=2       :    <JPEG_APP0> 0xffe0 length 16, 'JFIF'
[..]
@0x00005f1=1521    :  <JPEG_EOI> JPEG length 1523
-0x00005f2=1522    :  END OF FILE
@000000000=0       :  Start of JPEG baseline DCT compressed primary
image [313x234] length 1523 (APP0)
-0x00005f2=1522    :    End of JPEG primary image data
Number of images = 1
File Format = JPEG/APP0/JFIF

Sono le informazioni di cui una qualsiasi applicazione (gimp etc) ha
bisogno per interpretare un file jpeg, cioe' per assegnare un
significato ai byte in termini di pixel, valore dei colori etc e
farvi vedere l'immagine sullo schermo, stamparla etc

Se ora scaricate il file di Giampiero (quando lo salvate vi ritrovate
un file che si chiama P1010287.JPG) e fate la stessa operazione di
prima da terminale:

  exifprobe P1010287.JPG 

il risultato e' ben diverso:

File Name = P1010287.JPG
File Type = UNKNOWN
File Size = 4242298
 000000000=0       :    ff ff ff ff  ff ff ff ff  ff ff ff ff  ff ff ff
ff  |................|
 0x0000010=16      :    ff ff ff ff  ff ff ff ff  ff ff ff ff  ff ff ff
ff  |................|
 0x0000020=32      :    ff ff ff ff  ff ff ff ff  ff ff ff ff  ff ff ff
ff  |................|
 0x0000030=48      :    ff ff ff ff  ff ff ff ff  ff ff ff ff  ff ff ff
ff  |................| etc...

Se poi usate hexdump sui primi 10 byte e la loro traduzione (per i soli
caratteri stampabili) in ascii per il file jpeg da wikipedia ottenete:

  hexdump -n 10 -C JPEG_example_JPG_RIP_001.jpg 
00000000  ff d8 ff e0 00 10 4a 46  49 46                    |......JFIF|
0000000a

e per l'immagine di Giampiero:

  hexdump -n 10 -C P1010287.JPG 
00000000  ff ff ff ff ff ff ff ff  ff ff                    |..........|
0000000a

Vedete che al posto di ff d8 ff e0 nel file jpeg "buono" (se guardate
la tabella "common jpeg markers" alla pagina di cui sopra di wikipedia
saprete anche che cosa significano) l'immagine di Giampiero ha una
serie di ff.

Quindi: ahime', niente da fare, senza saper ricostruire l'informazione
che si e' persa.

Questo e' un buon esercizio, perche' vi spiega anche che cosa sia un
formato proprietario: in quel caso l'informazione non si e' persa, ma
e' nascosta e percio' un'applicazione si trova di fronte ad una serie
di byte che non sa interpretare. 

Posso inventare un formato proprietario al giorno, decido io cosa
significano dei byte, scrivo il codice in base al significato che solo
io so e percio' la mia applicazione funziona e fa quel che deve, ma a
voi non lo dico. Diventa un gran bel puzzle, si chiama "reverse
engineering" scoprire da valori binari dall'aspetto random quale sia il
significato che li rende in immagini, o testo, o audio, o video, o
altro.

Oppure posso aggiungere delle estensioni allo standard che, di nuovo,
conosco solo io, cosi' approfitto di tutto il lavoro di altri sullo
standard (lo posso riusare) ma non do' ad altri la possibilita' di
usare il mio, a cui ho aggiunto delle estensioni proprietarie, che cerco
di tener segrete.

Loredana





Maggiori informazioni sulla lista Soci