Mengapa saya mendapatkan pesan kesalahan: "Bukan file JPEG: dimulai dengan 0x89 0x50" [ditutup]

Jawaban:

102

File tersebut sebenarnya adalah PNG dengan ekstensi file yang salah. "0x89 0x50" adalah bagaimana file PNG dimulai.

luka bakar matt
sumber
Saya mengambil tangkapan layar di iPhone 7 saya dengan iOS 12.0.1, lalu dari Foto yang dibagikan ke Google Drive. Menggunakan nama default / yang disarankan saat menyimpan dan mengalami kesalahan ini saat mencoba membuka di Ubuntu dengan Image Viewer. Setelah membaca jawaban ini, ubah ekstensi ke PNG dan file dibuka tanpa mengubah atau menyimpan ulang di program lain.
Brent Self
Terima kasih atas jawabannya. Dengan apa file jpeg dimulai?
maddypie
60

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.

David M
sumber
2
Jika Anda ingin menemukan file-file itu, Anda dapat menggunakan tautan StackOverflow ini: stackoverflow.com/questions/30684796/…
zigzag
9

cukup ganti nama * .jpg menjadi * .png. Atau buka file ini di browser

pengguna9015721
sumber
9

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.

Liu Hao
sumber
2

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.

saurabheights
sumber
1

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")
Mohit Arvind khakharia
sumber
1

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")
Berbeda55
sumber
1
Menambah jawaban Different55. Skrip hanya berfungsi untuk Python versi 3.5 dan yang lebih baru.
Ashwin