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:
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ệ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.
chỉ cần đổi tên * .jpg thành * .png. Hoặc mở tệp này trong trình duyệt
Đâ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.
Đâ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 đó.
Đâ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")
Đâ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")