101

Why am I getting the message "Not a JPEG file: starts with 0x89 0x50" when I try to open my jpg file?

4

7 回答 7

115

The file is actually a PNG with the wrong file extension. "0x89 0x50" is how a PNG file starts.

于 2012-07-03T11:45:36.200 回答
62

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

于 2012-07-03T11:49:06.660 回答
12

您的“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

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

于 2018-11-27T05:03:24.027 回答
10

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

于 2017-11-27T16:09:40.667 回答
2

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

于 2016-05-17T13:34:57.790 回答
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")
于 2018-04-15T23:19:13.103 回答
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")
于 2017-10-23T08:58:08.957 回答