Perché ricevo l'errore: "Non è un file JPEG: inizia con 0x89 0x50" [chiuso]


Risposte:


102

Il file è in realtà un PNG con l'estensione del file sbagliata. "0x89 0x50" è il modo in cui inizia un file PNG.


Ho fatto uno screenshot sul mio iPhone 7 con iOS 12.0.1, quindi da Foto condivise su Google Drive. Ha utilizzato il nome predefinito / suggerito durante il salvataggio e si è verificato questo errore durante il tentativo di apertura su Ubuntu con Image Viewer. Dopo aver letto questa risposta, ha cambiato l'estensione in PNG e il file si è aperto senza convertirlo o salvarlo nuovamente in un altro programma.
Brent Self

Grazie per la risposta. Con cosa inizia un file jpeg ?
maddypie

60

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.


2
Se desideri trovare quei file, puoi utilizzare questo link StackOverflow: stackoverflow.com/questions/30684796/…
zigzag

9

rinomina semplicemente * .jpg in * .png. Oppure apri questo file nel browser


9

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.


2

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.


1

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

1

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

1
Aggiungendo alla risposta di Different55. Lo script funziona solo per Python versione 3.5 e successive.
Ashwin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.