为什么会出现错误:“不是JPEG文件:以0x89 0x50开头”?

107

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

7个回答

125

这个文件实际上是一个PNG文件,但文件扩展名不正确。PNG文件的起始标识是"0x89 0x50"。


我在我的iOS 12.0.1 iPhone 7上拍了一张截图,然后从照片中分享到Google Drive。保存时使用默认/建议的名称,在Ubuntu上使用图像查看器打开时出现错误。阅读了这个答案后,将扩展名更改为PNG,文件在不需要转换或重新保存到另一个程序的情况下打开了。 - Brent Self
1
谢谢您的回答。JPEG 文件以什么开头? - Adarsh TS

63

你的文件并不是一个JPEG文件,只是在某个环节中将PNG文件重命名为了JPEG文件。一些程序将此视为一个已识别的文件扩展名,并从前缀中推断类型,但显然你使用的那个程序无法这样做。


3
如果您想找到这些文件,可以使用此StackOverflow链接:https://dev59.com/AIvda4cB1Zd3GeqPcrGD - zigzag

15

你的'JPEG'文件扩展名错误,应该是'jpg'或'jpeg',它实际上很可能是一个PNG文件。

尝试将文件名从“xxx.jpg”或“xxx.jpeg”重命名为“xxx.png”。

在大多数情况下,程序根据文件扩展名方便地区分文件类型,但是如果我们将错误的文件扩展名(如“jpg”)指定给其他格式(如PNG文件),程序仍然会尝试使用JPG库加载PNG文件,这肯定会向用户抛出错误。

实际上,不同类型的文件总是有不同的文件头(前1024字节)。

以下是在类Unix平台上检查文件真实类型的快速方法:

可以使用“file”命令,例如:

file e3f8794a5c226d4.jpg 

输出结果为

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

它将打印文件信息细节,我们还可以检查指定的文件是否已被销毁。


10

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


2

当您尝试使用使用libjpeg打开jpeg文件的JPEG文件查看器打开PNG文件时,会出现以下错误响应。如之前的答案所述,您的文件将从png重命名为JPEG。


1
这是Mohit脚本的修改版。它不会删除名称错误的文件,而是以非破坏性方式将其重命名。
它还将os.system()调用替换为subprocess调用,从而解决了文件名中引号转义问题。
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")

1
在Different55的回答基础上补充一点。该脚本仅适用于Python 3.5及以上版本。 - Ashwin

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接