Tại sao tôi gặp lỗi: “Không phải tệp JPEG: bắt đầu bằng 0x89 0x50” [đã đóng]


87

Tại sao tôi nhận được thông báo "Không phải tệp JPEG: bắt đầu bằng 0x89 0x50" khi tôi cố gắng mở tệp jpg của mình?

Câu trả lời:


101

Tệp thực sự là PNG với phần mở rộng tệp sai. "0x89 0x50" là cách tệp PNG bắt đầu.


Tôi đã chụp ảnh màn hình trên iPhone 7 của mình với iOS 12.0.1, sau đó từ Ảnh được chia sẻ lên Google Drive. Đã sử dụng tên mặc định / được đề xuất khi lưu và gặp lỗi này khi cố gắng mở trên Ubuntu bằng Trình xem ảnh. Sau khi đọc câu trả lời này, hãy thay đổi phần mở rộng thành PNG và tệp được mở mà không cần chuyển đổi hoặc lưu lại trong chương trình khác.
Brent Self

Cảm ơn vì câu trả lời. Gì một jpeg bắt đầu tập tin với?
maddypie

60

Tệp của bạn không phải là tệp JPEG, nó chỉ được đổi tên từ PNG thành JPEG ở đâu đó. Một số chương trình sẽ mở phần mở rộng này dưới dạng phần mở rộng tệp được công nhận và suy ra loại từ tiền tố, nhưng rõ ràng không phải loại bạn đang sử dụng.


2
Nếu bạn muốn tìm những tệp đó, bạn có thể sử dụng liên kết StackOverflow này: stackoverflow.com/questions/30684796/…
zigzag,


7

Đây là một cách nhanh chóng để kiểm tra loại tệp thực sự trên nền tảng giống Unix:

bằng cách sử dụng lệnh "tệp", như:

file e3f8794a5c226d4.jpg 

và đầu ra là

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

sẽ in chi tiết thông tin tệp và cũng có thể kiểm tra xem tệp được chỉ định đã bị hủy chưa.


2

Đây là phản hồi lỗi khi bạn cố gắng mở tệp PNG bằng trình xem tệp JPEG sử dụng libjpeg để mở tệp jpeg. Tệp của bạn được đổi tên từ png thành JPEG như đã đề cập trong các câu trả lời trước đó.


1

Đây là một tập lệnh python để xác định những hình ảnh jpg bị lỗi đó trong một thư mục.

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

Đây là phiên bản sửa đổi của kịch bản của Mohit. Thay vì xóa các tệp có tên sai, nó sẽ đổi tên chúng một cách không phá hủy.

Nó cũng hoán đổi các lệnh gọi os.system () cho các lệnh gọi quy trình con giải quyết các vấn đề thoát liên quan đến dấu ngoặc kép trong tên tệp.

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
Thêm vào câu trả lời của Different55. Tập lệnh chỉ hoạt động cho Python phiên bản 3.5 trở lên.
Ashwin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.