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.


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.


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


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.


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.


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")

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")

1
Menambah jawaban Different55. Skrip hanya berfungsi untuk Python versi 3.5 dan yang lebih baru.
Ashwin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.