Почему я получаю ошибку: "не файл JPEG: начинается с 0x89 0x50"
Почему я получаю сообщение "Не файл JPEG: начинается с 0x89 0x50", когда я пытаюсь открыть свой файл jpg?
6 ответов
ваш файл не является файлом 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")