¿Por qué aparece el mensaje "No es un archivo JPEG: comienza con 0x89 0x50" cuando intento abrir mi archivo jpg?
¿Por qué aparece el mensaje "No es un archivo JPEG: comienza con 0x89 0x50" cuando intento abrir mi archivo jpg?
Respuestas:
El archivo es en realidad un PNG con la extensión de archivo incorrecta. "0x89 0x50" es cómo se inicia un archivo PNG.
Su archivo no es un archivo JPEG, simplemente se le cambió el nombre de PNG a JPEG en algún momento. Algunos programas abrirán esto como una extensión de archivo reconocida e inferirán el tipo a partir del prefijo, pero obviamente no el que estás usando.
simplemente cambie el nombre de * .jpg a * .png. O abre este archivo en el navegador
Aquí hay un paso rápido para verificar el tipo real del archivo en una plataforma similar a Unix:
usando el comando "archivo", como:
file e3f8794a5c226d4.jpg
y la salida es
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
que imprimirá los detalles de la información del archivo y también puede verificar si el archivo especificado ha sido destruido.
Esta es la respuesta de error cuando intenta abrir un archivo PNG usando un visor de archivos JPEG que usa libjpeg para abrir archivos jpeg. Su archivo cambia de nombre de png a JPEG como se menciona en respuestas anteriores.
Aquí hay una secuencia de comandos de Python para identificar esas imágenes jpg de falla en un directorio.
import glob
import os
import re
import logging
import traceback
filelist=glob.glob("/path/to/*.jpg")
for file_obj in filelist:
try:
jpg_str=os.popen("file \""+str(file_obj)+"\"").read()
if (re.search('PNG image data', jpg_str, re.IGNORECASE)) or (re.search('Png patch', jpg_str, re.IGNORECASE)):
print("Deleting jpg as it contains png encoding - "+str(file_obj))
os.system("rm \""+str(file_obj)+"\"")
except Exception as e:
logging.error(traceback.format_exc())
print("Cleaning jps done")
Aquí hay una versión modificada del guión de Mohit. En lugar de eliminar archivos con nombres incorrectos, los renombra de forma no destructiva.
También intercambia las llamadas a os.system () por llamadas a subprocesos, lo que resuelve problemas de escape relacionados con las comillas en los nombres de archivo.
import glob
import subprocess
import os
import re
import logging
import traceback
filelist=glob.glob("/path/to/*.jpg")
for file_obj in filelist:
try:
jpg_str = subprocess.check_output(['file', file_obj]).decode()
if (re.search('PNG image data', jpg_str, re.IGNORECASE)) or (re.search('Png patch', jpg_str, re.IGNORECASE)):
old_path = os.path.splitext(file_obj)
if not os.path.isfile(old_path[0]+'.png'):
new_file = old_path[0]+'.png'
elif not os.path.isfile(file_obj+'.png'):
new_file = file_obj+'.png'
else:
print("Found PNG hiding as JPEG but couldn't rename:", file_obj)
continue
print("Found PNG hiding as JPEG, renaming:", file_obj, '->', new_file)
subprocess.run(['mv', file_obj, new_file])
except Exception as e:
logging.error(traceback.format_exc())
print("Cleaning JPEGs done")