Почему я получаю сообщение об ошибке: «Не файл JPEG: начинается с 0x89 0x50» [закрыто]

86

Почему я получаю сообщение «Не файл JPEG: начинается с 0x89 0x50», когда я пытаюсь открыть свой файл jpg?

Мэтт Бернс
источник

Ответы:

100

На самом деле это PNG с неправильным расширением. «0x89 0x50» - так начинается файл PNG.

Мэтт Бернс
источник
Я сделал снимок экрана на своем iPhone 7 с iOS 12.0.1, затем из фотографий, опубликованных на Google Диске. При сохранении использовалось имя по умолчанию / предлагаемое имя, и возникала эта ошибка при попытке открыть в Ubuntu с помощью Image Viewer. Прочитав этот ответ, изменил расширение на PNG, и файл открылся без преобразования или повторного сохранения в другой программе.
Brent Self
Спасибо за ответ. С чего начинается файл jpeg ?
maddypie
60

Ваш файл не является файлом JPEG, он просто был переименован из PNG в JPEG где-то в процессе. Некоторые программы открывают это как распознанное расширение файла и выводят тип по префиксу, но, очевидно, не тот, который вы используете.

Дэвид М
источник
2
Если вы хотите , чтобы найти эти файлы, вы можете использовать эту ссылку StackOverflow: stackoverflow.com/questions/30684796/...
зигзаг
9

просто переименуйте * .jpg в * .png. Или откройте этот файл в браузере

user9015721
источник
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, как упоминалось в предыдущих ответах.

saurabheights
источник
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

Вот модифицированная версия сценария Мохита. Вместо того, чтобы удалять файлы с неправильными названиями, он переименовывает их неразрушающим образом.

Он также заменяет вызовы 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")
Разное55
источник
1
Добавление к ответу Different55. Скрипт работает только для Python версии 3.5 и выше.
Эшвин