Чому я отримую повідомлення про помилку: «Не JPEG-файл: починається з 0x89 0x50» [закрито]


86

Чому при спробі відкрити файл JPG я отримую повідомлення "Не файл JPEG: починається з 0x89 0x50"?

Відповіді:


99

Файл насправді є PNG із неправильним розширенням. "0x89 0x50" - це те, як починається файл PNG.


Я зробив знімок екрана на своєму iPhone 7 з iOS 12.0.1, а потім із Фотографії, якими поділились на Google Drive. Використовував ім’я за замовчуванням / запропоноване ім’я під час збереження та мав цю помилку при спробі відкрити в Ubuntu за допомогою програми перегляду зображень. Прочитавши цю відповідь, змінив розширення на PNG і файл відкрився без перетворення або повторного збереження в іншій програмі.
Brent Self

Дякую за відповідь. З чого починається файл jpeg ?
maddypie

60

Ваш файл не є файлом JPEG, його просто перейменовано з PNG у JPEG десь по дорозі. Деякі програми відкриють це як розпізнане розширення файлу та виведуть тип із префіксу, але, очевидно, не той, який ви використовуєте.


2
Якщо ви хочете , щоб знайти ці файли, ви можете використовувати це посилання StackOverflow: stackoverflow.com/questions/30684796 / ...
зигзаг


7

Ось короткий прохід для перевірки реального типу файлу на Unix-подібній платформі:

за допомогою команди "файл", наприклад:

file e3f8794a5c226d4.jpg 

і вихідний результат

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

який надрукує деталі інформації про файл, а також зможе перевірити, чи не було знищено вказаний файл.


2

Це відповідь на помилку під час спроби відкрити файл PNG за допомогою засобу перегляду файлів JPEG, який використовує libjpeg для відкриття файлів jpeg. Ваш файл перейменовано з png на JPEG, як згадувалося в попередніх відповідях.


1

Ось сценарій python для ідентифікації цих несправних jpg-зображень у каталозі.

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

Ось модифікована версія сценарію Mohit. Замість того, щоб видаляти неправильно названі файли, він неруйнівно їх перейменовує.

Він також замінює виклики os.system () на виклики підпроцесу, що вирішує проблеми, що виникають щодо лапок у іменах файлів.

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
Додаючи відповідь Different55. Сценарій працює лише для версії Python 3.5 і вище.
Ашвін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.