Pourquoi ai-je le message "Ce n'est pas un fichier JPEG: commence par 0x89 0x50" lorsque j'essaie d'ouvrir mon fichier jpg?
Le fichier est en fait un fichier PNG avec une extension de fichier incorrecte. "0x89 0x50" est comment un fichier PNG commence.
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.
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.
renommer simplement * .jpg en * .png. Ou ouvrez ce fichier dans le navigateur
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")
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.
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")