web-dev-qa-db-fra.com

Pourquoi ai-je le message d'erreur suivant: "Ce n'est pas un fichier JPEG: commence par 0x89 0x50"

Pourquoi ai-je le message "Ce n'est pas un fichier JPEG: commence par 0x89 0x50" lorsque j'essaie d'ouvrir mon fichier jpg?

72
matt burns

Le fichier est en fait un fichier PNG avec une extension de fichier incorrecte. "0x89 0x50" est comment un fichier PNG commence.

84
matt burns

Votre fichier n'est pas un fichier JPEG, il vient juste d'être renommé d'un fichier PNG en un fichier JPEG quelque part sur le chemin. Certains programmes l'ouvriront en tant qu'extension de fichier reconnue et déduiront le type du préfixe, mais évidemment pas celui que vous utilisez.

54
David M

Voici une passe rapide pour vérifier le type réel du fichier sur une plate-forme de type Unix:

en utilisant la commande "file", comme:

file e3f8794a5c226d4.jpg 

et la sortie est

e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced

qui imprimera les informations sur le fichier et pourra également vérifier si le fichier spécifié a été détruit.

3
Liu Hao

renommer simplement * .jpg en * .png. Ou ouvrez ce fichier dans le navigateur

3
user9015721

Voici un script python pour identifier les images jpg défectueuses dans un répertoire.

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")
1

C'est la réponse d'erreur lorsque vous essayez d'ouvrir un fichier PNG à l'aide d'un visualiseur de fichiers JPEG qui utilise libjpeg pour ouvrir des fichiers jpeg. Votre fichier est renommé de png en JPEG, comme indiqué dans les réponses précédentes.

1
saurabheights

Voici une version modifiée du script de Mohit. Au lieu de supprimer les fichiers mal nommés, il les renomme de manière non destructive.

Il permute également les appels os.system () pour les appels de sous-processus, ce qui résout les problèmes liés aux citations dans les noms de fichiers.

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")
1
Different55