Почему я получаю сообщение «Не файл JPEG: начинается с 0x89 0x50», когда я пытаюсь открыть свой файл jpg?
Почему я получаю сообщение «Не файл JPEG: начинается с 0x89 0x50», когда я пытаюсь открыть свой файл jpg?
Ответы:
На самом деле это PNG с неправильным расширением. «0x89 0x50» - так начинается файл PNG.
Ваш файл не является файлом JPEG, он просто был переименован из PNG в JPEG где-то в процессе. Некоторые программы открывают это как распознанное расширение файла и выводят тип по префиксу, но, очевидно, не тот, который вы используете.
просто переименуйте * .jpg в * .png. Или откройте этот файл в браузере
Вот быстрый способ проверить настоящий тип файла на Unix-подобной платформе:
используя команду "файл", например:
file e3f8794a5c226d4.jpg
и выход
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
который распечатает подробную информацию о файле, а также может проверить, был ли указанный файл уничтожен.
Это реакция с ошибкой, когда вы пытаетесь открыть файл PNG с помощью программы просмотра файлов JPEG, которая использует libjpeg для открытия файлов jpeg. Ваш файл переименован из png в JPEG, как упоминалось в предыдущих ответах.
Вот скрипт на 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")
Вот модифицированная версия сценария Мохита. Вместо того, чтобы удалять файлы с неправильными названиями, он переименовывает их неразрушающим образом.
Он также заменяет вызовы 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")