Por que estou recebendo o erro: “Não é um arquivo JPEG: começa com 0x89 0x50” [fechado]

86

Por que estou recebendo a mensagem "Não é um arquivo JPEG: começa com 0x89 0x50" quando tento abrir meu arquivo jpg?

matt burns
fonte

Respostas:

99

O arquivo é na verdade um PNG com a extensão de arquivo errada. "0x89 0x50" é como um arquivo PNG é iniciado.

matt burns
fonte
Eu fiz uma captura de tela no meu iPhone 7 com iOS 12.0.1 e, em seguida, do Fotos compartilhadas no Google Drive. Usou o nome padrão / sugerido ao salvar e teve este erro ao tentar abrir no Ubuntu com o Image Viewer. Depois de ler esta resposta, mudou a extensão para PNG e o arquivo foi aberto sem converter ou salvar novamente em outro programa.
Brent Self
Obrigado pela resposta. Com o que um arquivo jpeg começa?
maddypie
60

Seu arquivo não é um arquivo JPEG, ele apenas foi renomeado de PNG para JPEG em algum lugar ao longo do caminho. Alguns programas irão abrir isso como uma extensão de arquivo reconhecida e inferir o tipo do prefixo, mas obviamente não aquele que você está usando.

David M
fonte
2
Se desejar encontrar esses arquivos, você pode usar este link StackOverflow: stackoverflow.com/questions/30684796/…
ziguezague
9

simplesmente renomeie * .jpg para * .png. Ou abra este arquivo no navegador

user9015721
fonte
7

Aqui está uma passagem rápida para verificar o tipo real do arquivo em uma plataforma semelhante ao Unix:

usando o comando "arquivo", como:

file e3f8794a5c226d4.jpg 

e a saída é

e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced

que imprimirá os detalhes das informações do arquivo e também pode verificar se o arquivo especificado foi destruído.

Liu Hao
fonte
2

Esta é a resposta de erro quando você tenta abrir um arquivo PNG usando um visualizador de arquivo JPEG que usa libjpeg para abrir arquivos jpeg. Seu arquivo é renomeado de png para JPEG conforme mencionado nas respostas anteriores.

Saurabheights
fonte
1

Aqui está um script python para identificar essas imagens jpg com falha em um diretório.

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")
Mohit Arvind khakharia
fonte
1

Aqui está uma versão modificada do script de Mohit. Em vez de excluir arquivos com nomes incorretos, ele os renomeia de forma não destrutiva.

Ele também troca as chamadas os.system () por chamadas de subprocesso, o que resolve problemas de escape relacionados a citações em nomes de arquivos.

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")
Diferente 55
fonte
1
Adicionando a resposta de Different55. O script funciona apenas para Python versão 3.5 e superior.
Ashwin