Warum erhalte ich die Meldung "Keine JPEG-Datei: beginnt mit 0x89 0x50", wenn ich versuche, meine JPG-Datei zu öffnen?
Warum erhalte ich die Meldung "Keine JPEG-Datei: beginnt mit 0x89 0x50", wenn ich versuche, meine JPG-Datei zu öffnen?
Antworten:
Die Datei ist eigentlich ein PNG mit der falschen Dateierweiterung. "0x89 0x50" ist der Start einer PNG-Datei.
Ihre Datei ist keine JPEG-Datei, sondern wurde irgendwo auf dem Weg von einem PNG in ein JPEG umbenannt. Einige Programme öffnen dies als erkannte Dateierweiterung und leiten den Typ aus dem Präfix ab, aber offensichtlich nicht den, den Sie verwenden.
Benennen Sie einfach * .jpg in * .png um. Oder öffnen Sie diese Datei im Browser
Hier ist ein kurzer Überblick über den tatsächlichen Dateityp auf einer Unix-ähnlichen Plattform:
Verwenden Sie den Befehl "Datei" wie:
file e3f8794a5c226d4.jpg
und Ausgabe ist
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
Dadurch werden Details zu Dateiinformationen gedruckt und es kann auch überprüft werden, ob die angegebene Datei zerstört wurde.
Dies ist die Fehlerantwort, wenn Sie versuchen, eine PNG-Datei mit einem JPEG-Datei-Viewer zu öffnen, der libjpeg zum Öffnen von JPEG-Dateien verwendet. Ihre Datei wird wie in früheren Antworten erwähnt von PNG in JPEG umbenannt.
Hier ist ein Python-Skript, um diese fehlerhaften JPG-Bilder in einem Verzeichnis zu identifizieren.
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")
Hier ist eine modifizierte Version von Mohits Skript. Anstatt falsch benannte Dateien zu löschen, werden sie zerstörungsfrei umbenannt.
Außerdem werden die Aufrufe von os.system () gegen Unterprozessaufrufe ausgetauscht, wodurch Probleme im Zusammenhang mit Anführungszeichen in Dateinamen behoben werden.
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")