Pourquoi est-ce que je reçois l'erreur: "pas un fichier JPEG: commence par 0x89 0x50"

Pourquoi reçois - je le message "Pas un fichier JPEG: commence par 0x89 0x50" lorsque j'essaie d'ouvrir mon fichier jpg?

57
demandé sur matt burns 2012-07-03 15:45:35

6 réponses

Le fichier est en fait un PNG avec la mauvaise extension de fichier. "0x89 0x50" est la façon dont un fichier PNG démarre.

59
répondu matt burns 2015-04-01 10:08:56

Votre fichier N'est pas un fichier JPEG, il a juste été renommé D'un PNG à un JPEG quelque part en cours de route. Certains programmes l'ouvriront en tant qu'extension de fichier reconnue et en déduiront le type du préfixe, mais évidemment pas celui que vous utilisez.

52
répondu David M 2012-07-03 11:49:06

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

2
répondu saurabheights 2016-05-17 13:34:57

Voici un script python pour identifier ces images JPG de défaut 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
répondu Mohit Arvind khakharia 2017-10-23 08:58:08

Renommez simplement *.jpg, *d'.png. Ou ouvrez ce fichier dans le Navigateur

1
répondu user9015721 2017-11-27 16:09:40

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 échange également le système d'exploitation.system() appelle des appels de sous-processus qui résolvent les problèmes d'échappement concernant les guillemets 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
répondu Different55 2018-04-15 23:19:13