Perché ricevo il messaggio "Non è un file JPEG: inizia con 0x89 0x50" quando provo ad aprire il mio file jpg?
Perché ricevo il messaggio "Non è un file JPEG: inizia con 0x89 0x50" quando provo ad aprire il mio file jpg?
Risposte:
Il file è in realtà un PNG con l'estensione del file sbagliata. "0x89 0x50" è il modo in cui inizia un file PNG.
Il tuo file non è un file JPEG, è stato semplicemente rinominato da PNG a JPEG da qualche parte lungo la strada. Alcuni programmi lo apriranno come estensione di file riconosciuta e dedurranno il tipo dal prefisso, ma ovviamente non quello che stai utilizzando.
rinomina semplicemente * .jpg in * .png. Oppure apri questo file nel browser
Ecco un passaggio rapido per controllare il tipo reale del file su una piattaforma simile a Unix:
utilizzando il comando "file", come:
file e3f8794a5c226d4.jpg
e l'output è
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
che stamperà i dettagli delle informazioni sul file e può anche controllare se il file specificato è stato distrutto.
Questa è la risposta di errore quando si tenta di aprire un file PNG utilizzando un visualizzatore di file JPEG che utilizza libjpeg per aprire i file jpeg. Il tuo file viene rinominato da png a JPEG come menzionato nelle risposte precedenti.
Ecco uno script Python per identificare quelle immagini jpg difettose in una directory.
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")
Ecco una versione modificata dello script di Mohit. Invece di eliminare i file con nomi errati, li rinomina in modo non distruttivo.
Scambia anche le chiamate os.system () per chiamate di sottoprocesso che risolvono i problemi di escape riguardanti le virgolette nei nomi dei file.
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")