Почему я получаю сообщение об ошибке: "не файл JPEG: начинается с 0x89 0x50"
Почему я получаю сообщение "Не файл JPEG: начинается с 0x89 0x50", когда я пытаюсь открыть свой файл jpg?
6 ответов:
файл на самом деле PNG с неправильным расширением файла. "0x89 0x50" - это способ запуска файла PNG.
ваш файл не является файлом JPEG, он просто был переименован из PNG в JPEG где-то по пути. Некоторые программы откроют это как распознанное расширение файла и выведут тип из префикса, но явно не тот, который вы используете.
Это ответ на ошибку при попытке открыть файл 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")
вот модифицированная версия скрипта Мохита. Вместо того, чтобы удалять файлы с неправильными именами, он без разрушения переименовывает их.
Он также меняет местами ОС.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")