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

问题描述 投票:67回答:7

当我尝试打开我的jpg文件时,为什么会收到消息“不是JPEG文件:以0x89 0x50开头”?

image png jpeg corruption
7个回答
81
投票

该文件实际上是一个文件扩展名错误的PNG。 “0x89 0x50”是PNG文件的启动方式。


54
投票

您的文件不是JPEG文件,它刚刚从PNG重命名为JPEG文件。某些程序会将其作为可识别的文件扩展名打开,并从前缀推断出类型,但显然不是您正在使用的类型。


3
投票

只需将* .jpg重命名为* .png即可。或者在浏览器中打开此文件


3
投票

这是一个快速通过,以检查类Unix平台上的文件的真实类型:

使用“file”命令,如:

file e3f8794a5c226d4.jpg 

和输出是

e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced

它将打印文件信息详细信息,还可以检查指定的文件是否已被破坏。


1
投票

当您尝试使用使用libjpeg打开jpeg文件的JPEG文件查看器打开PNG文件时,这是错误响应。您的文件已从png重命名为JPEG,如前面的答案中所述。


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

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")
© www.soinside.com 2019 - 2024. All rights reserved.