Por qué aparece el error: "No es un archivo JPEG: comienza con 0x89 0x50" [cerrado]

86

¿Por qué aparece el mensaje "No es un archivo JPEG: comienza con 0x89 0x50" cuando intento abrir mi archivo jpg?

quemaduras mate
fuente

Respuestas:

100

El archivo es en realidad un PNG con la extensión de archivo incorrecta. "0x89 0x50" es cómo se inicia un archivo PNG.

quemaduras mate
fuente
Tomé una captura de pantalla en mi iPhone 7 con iOS 12.0.1, luego de Fotos compartidas a Google Drive. Usé el nombre predeterminado / sugerido al guardar y tuve este error al intentar abrir en Ubuntu con Image Viewer. Después de leer esta respuesta, cambió la extensión a PNG y el archivo se abrió sin convertir o volver a guardar en otro programa.
Brent Self
Gracias por la respuesta. ¿Con qué comienza un archivo jpeg ?
maddypie
60

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.

David M
fuente
2
Si desea encontrar esos archivos, puede usar este enlace de StackOverflow: stackoverflow.com/questions/30684796/…
zigzag
9

simplemente cambie el nombre de * .jpg a * .png. O abre este archivo en el navegador

usuario9015721
fuente
7

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.

Liu Hao
fuente
2

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.

saurabheights
fuente
1

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")
Mohit Arvind khakharia
fuente
1

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")
Diferente55
fuente
1
Agregando a la respuesta de Different55. El script funciona solo para Python versión 3.5 y superior.
Ashwin