เหตุใดฉันจึงได้รับข้อผิดพลาด:“ ไม่ใช่ไฟล์ JPEG: เริ่มต้นด้วย 0x89 0x50” [ปิด]


88

เหตุใดฉันจึงได้รับข้อความ "ไม่ใช่ไฟล์ JPEG: ขึ้นต้นด้วย 0x89 0x50" เมื่อฉันพยายามเปิดไฟล์ jpg

คำตอบ:


102

ไฟล์นี้เป็น PNG ที่มีนามสกุลไฟล์ไม่ถูกต้อง "0x89 0x50" คือการเริ่มต้นไฟล์ PNG


ฉันจับภาพหน้าจอบน iPhone 7 ที่ใช้ iOS 12.0.1 แล้วจากรูปภาพที่แชร์ไปยัง Google ไดรฟ์ ใช้ชื่อเริ่มต้น / แนะนำเมื่อบันทึกและมีข้อผิดพลาดนี้เมื่อพยายามเปิดบน Ubuntu ด้วย Image Viewer หลังจากอ่านคำตอบนี้เปลี่ยนนามสกุลเป็น PNG และไฟล์จะเปิดขึ้นโดยไม่ต้องแปลงหรือบันทึกซ้ำในโปรแกรมอื่น
Brent Self

ขอบคุณสำหรับคำตอบ. อะไรJPEGไฟล์เริ่มต้นด้วย?
maddypie

60

ไฟล์ของคุณไม่ใช่ไฟล์ JPEG แต่เพิ่งถูกเปลี่ยนชื่อจาก PNG เป็น JPEG ระหว่างทาง บางโปรแกรมจะเปิดเป็นนามสกุลไฟล์ที่รู้จักและอนุมานประเภทจากคำนำหน้า แต่เห็นได้ชัดว่าไม่ใช่ประเภทที่คุณใช้


2
หากคุณต้องการค้นหาไฟล์เหล่านั้นคุณสามารถใช้ลิงก์ StackOverflow นี้: stackoverflow.com/questions/30684796/…
zigzag


9

นี่คือบัตรผ่านด่วนเพื่อตรวจสอบประเภทไฟล์จริงบนแพลตฟอร์มที่เหมือน Unix:

โดยใช้คำสั่ง "file" เช่น:

file e3f8794a5c226d4.jpg 

และเอาต์พุตคือ

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

ซึ่งจะพิมพ์รายละเอียดข้อมูลไฟล์และตรวจสอบได้ด้วยว่าไฟล์ที่ระบุถูกทำลายหรือไม่


2

นี่คือการตอบสนองข้อผิดพลาดเมื่อคุณพยายามเปิดไฟล์ PNG โดยใช้โปรแกรมดูไฟล์ JPEG ซึ่งใช้ libjpeg เพื่อเปิดไฟล์ jpeg ไฟล์ของคุณเปลี่ยนชื่อจาก 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")

1
เพิ่มคำตอบของ Different55 สคริปต์ใช้งานได้กับ Python เวอร์ชัน 3.5 ขึ้นไปเท่านั้น
Ashwin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.