为什么我收到错误:“不是JPEG文件:以0x89 0x50开头”

时间:2012-07-03 11:45:36

标签: image png jpeg corruption

为什么我收到消息"不是JPEG文件:以0x89 0x50&#34开头;当我尝试打开我的jpg文件时?

6 个答案:

答案 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")