Why am I getting the message "Not a JPEG file: starts with 0x89 0x50" when I try to open my jpg file?
7 回答
The file is actually a PNG with the wrong file extension. "0x89 0x50" is how a PNG file starts.
您的文件不是 JPEG 文件,它只是在途中从 PNG 重命名为 JPEG。某些程序会将其作为可识别的文件扩展名打开并从前缀推断类型,但显然不是您正在使用的类型。
您的“JPEG”文件的文件扩展名为“jpg”或“jpeg”错误,它的真实类型很可能是 PNG 文件。
只需尝试将文件名从“xxx.jpg”或“xxx.jpeg”重命名为“xxx.png”。
在大多数情况下,程序为了方便区分文件类型和文件扩展名,但是,如果我们为其他格式的文件(如 PNG 文件)指定了错误的文件扩展名(如 'jpg'),程序仍会尝试加载带有 JPG 库的 PNG 文件,肯定会向用户抛出错误。
实际上,不同类型的文件总是有不同的文件头(前 1024 字节)
这是在类 Unix 平台上检查文件真实类型的快速方法:
使用“文件”命令,例如:
file e3f8794a5c226d4.jpg
输出是
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
这将打印文件信息详细信息,我们还可以检查指定文件是否已被破坏。
只需将 *.jpg 重命名为 *.png。或者在浏览器中打开这个文件
这是当您尝试使用使用 libjpeg 打开 jpeg 文件的 JPEG 文件查看器打开 PNG 文件时的错误响应。如前面的答案所述,您的文件已从 png 重命名为 JPEG。
这是 Mohit 脚本的修改版本。它不是删除错误命名的文件,而是非破坏性地重命名它们。
它还将 os.system() 调用换成子进程调用,这解决了文件名中引号的转义问题。
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")
这是一个 python 脚本,用于识别目录中的那些故障 jpg 图像。
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")