2010-09-22 14 views
6

Esiste un modo rapido per determinare se un file di immagine arbitrario è un file png o un file jpeg o nessuno di essi?C++ - Rileva se un file è PNG o JPEG

Sono sicuro che esiste un modo e questi file hanno probabilmente una sorta di firma personale e dovrebbero esserci alcuni modi per distinguerli.

Se possibile, è possibile fornire anche i nomi delle routine corrispondenti in libpng/libjpeg/boost::gil::io.

risposta

2

A parte il suggerimento Tim Yates' di leggere il numero magico "a mano", il Boost documentazione GIL dice:

  • png_read_image genera std::ios_base::failure se il file non è un file PNG valido.
  • jpeg_read_image genera std::ios_base::failure se il file non è un file JPEG valido.

Analogamente ad altre routine GIL Boost. Se si desidera solo il tipo, è possibile provare a leggere solo lo dimensions anziché caricare l'intero file.

+0

C'è un'altra domanda su SO che dice jpeg_read_image non lancia un'eccezione. – jiggunjer

17

Vedere lo magic number all'inizio del file. Dalla pagina Wikipedia:

I file di immagine JPEG iniziano con FF D8 e terminano con FF D9. I file JPEG/JFIF contengono il codice ASCII per "JFIF" (4A 46 49 46) come stringa terminata da null. I file JPEG/Exif contengono il codice ASCII per "Exif" (45 78 69 66) anche come stringa terminata da null , seguita da ulteriori metadati sul file.

file immagine PNG iniziano con una firma 8 byte che identifica il file come un file PNG e consente di rilevare problemi di trasferimento di file più comuni: \ 211 P NG \ r \ n \ 032 \ n

3

Alla domanda viene essenzialmente risposto dalle risposte di cui sopra, ma ho pensato di aggiungere quanto segue: Se è necessario determinare i tipi di file oltre solo "JPEG, PNG, altro", c'è sempre libmagic. Questo è ciò che alimenta l'utilità Unix file, che è davvero piuttosto magico, su molti dei moderni sistemi operativi.

Problemi correlati