Por que estou recebendo a mensagem "Não é um arquivo JPEG: começa com 0x89 0x50" quando tento abrir meu arquivo jpg?
Por que estou recebendo a mensagem "Não é um arquivo JPEG: começa com 0x89 0x50" quando tento abrir meu arquivo jpg?
Respostas:
O arquivo é na verdade um PNG com a extensão de arquivo errada. "0x89 0x50" é como um arquivo PNG é iniciado.
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.
simplesmente renomeie * .jpg para * .png. Ou abra este arquivo no navegador
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.
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.
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")
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")