2010-09-22 29 views
6

¿Hay alguna forma rápida de determinar si algún archivo de imagen arbitrario es un archivo png o un archivo jpeg o ninguno de ellos?C++ - Detecta si un archivo es PNG o JPEG

Estoy bastante seguro de que hay alguna manera y estos archivos probablemente tienen algún tipo de firma propia y debería haber alguna forma de distinguirlos.

Si es posible, también podría proporcionar los nombres de las rutinas correspondientes en libpng/libjpeg/boost::gil::io.

Respuesta

2

Aparte de sugerencia de Tim Yates de leer el número mágico "a mano", la documentación GIL Boost dice:

  • png_read_image arroja std::ios_base::failure si el archivo no es un archivo PNG válido.
  • jpeg_read_image arroja std::ios_base::failure si el archivo no es un archivo JPEG válido.

De forma similar para otras rutinas de Boost GIL. Si solo desea el tipo, puede intentar leer solo el dimensions, en lugar de cargar todo el archivo.

+0

Hubo otra pregunta sobre SO diciendo que jpeg_read_image no lanza una excepción. – jiggunjer

17

Mire el magic number al principio del archivo. De la página de Wikipedia:

Los archivos de imagen JPEG comienzan con FF D8 y terminan con FF D9. Los archivos JPEG/JFIF contienen el código ASCII para "JFIF" (4A 46 49 46) como una cadena terminada nula. Los archivos JPEG/Exif contienen el código ASCII para "Exif" (45 78 69 66) también como una cadena terminada nula , seguida de más metadatos sobre el archivo.

archivos de imagen PNG comienzan con una firma de 8 bytes que identifica el archivo como un archivo PNG y permite la detección de problemas de transferencia de archivos comunes: \ 211 P GN \ r \ n \ 032 \ n

3

La pregunta es respondida esencialmente por las respuestas anteriores, pero pensé que agregaría lo siguiente: Si alguna vez necesita determinar tipos de archivos más allá de "JPEG, PNG, otros", siempre hay libmagic. Esto es lo que alimenta el archivo de la utilidad Unix, que es bastante mágico de hecho, en muchos de los sistemas operativos modernos.

Cuestiones relacionadas