为什么我收到消息"不是JPEG文件:以0x89 0x50&#34开头;当我尝试打开我的jpg文件时?
答案 0 :(得分:77)
该文件实际上是一个文件扩展名错误的PNG。 “0x89 0x50”是PNG文件的启动方式。
答案 1 :(得分:54)
您的文件不是JPEG文件,它刚刚从PNG重命名为JPEG文件。某些程序会将其作为可识别的文件扩展名打开,并从前缀推断出类型,但显然不是您正在使用的类型。
答案 2 :(得分:3)
以下是在类似Unix的平台上检查文件真实类型的快速通道:
使用“文件”命令,例如:
file e3f8794a5c226d4.jpg
输出为
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
它将打印文件信息的详细信息,还可以检查指定的文件是否已被破坏。
答案 3 :(得分:1)
当您尝试使用使用libjpeg打开jpeg文件的JPEG文件查看器打开PNG文件时,这是错误响应。您的文件已从png重命名为JPEG,如前面的答案中所述。
答案 4 :(得分:1)
这是一个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")
答案 5 :(得分:1)
这是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")