Насколько я понимаю, существует несколько разновидностей файлов JPEG . Детали, необходимые для изменения метаданных DPI варианта JFIF, объясняются здесь. Основываясь на этом, я написал свой собственный Python-скрипт, который позволяет изменить настройку DPI для разновидности JFIF JPEG без перекодирования:
import sys,os
filename = sys.argv[1]
x_density = int(sys.argv[2])
y_density = int(sys.argv[3])
echo = True
if len(sys.argv) > 4:
if sys.argv[4] == 'quiet':
echo = False
assert x_density > 0 and x_density < 65536
assert y_density > 0 and y_density < 65536
# JPEG markers
APP0 = bytes.fromhex('FFD8FFE0') # JFIF
APP1 = bytes.fromhex('FFD8FFE1') # EXIF
with open(filename, 'rb+') as f: # 'w+b'
chunk = f.read(4)
if chunk == APP0:
f.seek(2,1) # relative seek
chunk = f.read(5)
if chunk == bytes.fromhex('4A46494600'): # JFIF indentfier
f.seek(2,1) # relative seek
print('Setting density of ' + os.path.split(filename)[1] + ' to ' + str(x_density) + 'x' + str(y_density) + ' dpi.') if echo else None
f.write(bytes.fromhex('01'))
f.write(x_density.to_bytes(2,'big'))
f.write(y_density.to_bytes(2,'big'))
else:
print('File hasn''t got the JFIF indentifier, nothing was done.')
elif chunk == APP1:
f.close() # needed otherwise exiftool cannot operate on file
print('This is an EXIF-JPEG, using exiftool to set DPI...')
os.system('exiftool -P -overwrite_original -XResolution={} -YResolution={} "{}"'.format(x_density,y_density,filename))
else:
print('File is not JFIF nor EXIF, cannot set DPI, nothing was done.')
print('Done.') if echo else None
Применение:
python this_script.py some-image.jpg Xdpi Ydpi [quiet]
Скрипт не читает полное изображение и не изменяет длину файла, он просто изменяет несколько байтов непосредственно в файле JPEG. Кроме того, временная/резервная копия не создается, потому что я хотел, чтобы скрипт работал с жестко связанными файлами, поэтому в целом процесс для JFIF JPEG выполняется довольно быстро.
Скрипт может идентифицировать EXIF JPEG и использовать exiftool для изменения DPI. Если на вашем компьютере не установлен exiftool, не забудьте соответствующим образом настроить скрипт. Причиной использования этого скрипта, даже если у вас установлен exiftool, является скорость; в моем тесте этот скрипт намного быстрее, чем exiftool.
JFIF и EXIF являются наиболее распространенными разновидностями файлов JPEG, но я надеюсь, что кто-то сможет улучшить этот сценарий или сообщить способ установки DPI (без перекодирования) также для файлов Adobe JPEG с маркером APP14, которые не так уж редки.
person
mmj
schedule
02.06.2021
magick identify -verbose image.jpg
. Также обратите внимание, что в Imagemagick 7 используйте только магию, а не преобразование или преобразование магии. - person fmw42   schedule 05.08.2018magick identify -verbose image.jpg
- person fmw42   schedule 05.08.2018@mmj
Как я уже сказал выше, Imagemagick будет распаковывать и повторно сжимать, даже если вы просто измените dpi. Итак, вы хотите использовать какой-то другой инструмент, который этого не делает. Есть много причин, по которым размер файла изменится при распаковке и повторном сжатии JPG. - person fmw42   schedule 06.08.2018