问题
Why am I getting the message "Not a JPEG file: starts with 0x89 0x50" when I try to open my jpg file?
回答1:
The file is actually a PNG with the wrong file extension. "0x89 0x50" is how a PNG file starts.
回答2:
Your file is not a JPEG file, it's just been renamed from a PNG to a JPEG somewhere along the way. Some programs will open this as a recognised file extension and infer the type from the prefix, but obviously not the one you're using.
回答3:
simply rename *.jpg to *.png. Or open this file in browser
回答4:
Here's a quick pass to check real type of the file on Unix-like platform:
using the "file" command, like:
file e3f8794a5c226d4.jpg
and output is
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
which will print file information details, and can also check if the specified file has been destructed.
回答5:
This is the error response when you try to open a PNG file using a JPEG file viewer which uses libjpeg to open jpeg files. Your file is renamed from png to JPEG as mentioned in earlier answers.
回答6:
Here is a python script to identify those fault jpg images in a 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")
回答7:
Here's a modified version of Mohit's script. Instead of deleting misnamed files, it non-destructively renames them.
It also swaps out the os.system() calls for subprocess calls which solves escaping issues regarding quotes in filenames.
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")
来源:https://stackoverflow.com/questions/11310220/why-am-i-getting-the-error-not-a-jpeg-file-starts-with-0x89-0x50