Mengapa saya mendapatkan pesan "Bukan file JPEG: dimulai dengan 0x89 0x50" ketika saya mencoba membuka file jpg saya?
Mengapa saya mendapatkan pesan "Bukan file JPEG: dimulai dengan 0x89 0x50" ketika saya mencoba membuka file jpg saya?
Jawaban:
File tersebut sebenarnya adalah PNG dengan ekstensi file yang salah. "0x89 0x50" adalah bagaimana file PNG dimulai.
File Anda bukan file JPEG, itu hanya diubah namanya dari PNG menjadi JPEG di suatu tempat di sepanjang jalan. Beberapa program akan membukanya sebagai ekstensi file yang dikenali dan menyimpulkan jenisnya dari awalan, tetapi jelas bukan yang Anda gunakan.
cukup ganti nama * .jpg menjadi * .png. Atau buka file ini di browser
Berikut cara cepat untuk memeriksa jenis file yang sebenarnya di platform mirip Unix:
menggunakan perintah "file", seperti:
file e3f8794a5c226d4.jpg
dan keluarannya adalah
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
yang akan mencetak detail informasi file, dan juga dapat memeriksa apakah file yang ditentukan telah dihancurkan.
Ini adalah respons kesalahan saat Anda mencoba membuka file PNG menggunakan penampil file JPEG yang menggunakan libjpeg untuk membuka file jpeg. File Anda diubah namanya dari png menjadi JPEG seperti yang disebutkan dalam jawaban sebelumnya.
Berikut ini skrip python untuk mengidentifikasi gambar jpg yang salah dalam direktori.
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")
Ini adalah versi modifikasi dari skrip Mohit. Alih-alih menghapus file yang salah nama, itu mengganti namanya secara non-destruktif.
Ini juga menukar panggilan os.system () untuk panggilan subproses yang memecahkan masalah pelarian terkait kutipan dalam nama file.
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")