Чому при спробі відкрити файл JPG я отримую повідомлення "Не файл JPEG: починається з 0x89 0x50"?
Чому при спробі відкрити файл JPG я отримую повідомлення "Не файл JPEG: починається з 0x89 0x50"?
Відповіді:
Файл насправді є 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")
Ось модифікована версія сценарію 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")