Как отрегулировать подушку EPS в JPG качестве - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь конвертировать EPS-изображения в JPEG с помощью подушки. Но результаты низкого качества. Я пытаюсь использовать метод resize, но он полностью игнорируется. Я установил размер изображения JPEG как (3600, 4700), но полученное изображение имеет размер (360, 470). Мой код:

eps_image = Image.open('img.eps')
height = eps_image.height * 10
width = eps_image.width * 10
new_size = (height, width)
print(new_size)  # prints (3600, 4700)
eps_image.resize(new_size, Image.ANTIALIAS)
eps_image.save(
    'img.jpeg',
    format='JPEG'
    dpi=(9000, 9000),
    quality=95)

UPD. Vasu Deo.S заметил одну мою ошибку, и благодаря ему изображение JPG стало больше, но качество все еще низкое. Я пробовал разные DPI, размеры, значения повторной выборки для функции resize, но результат не сильно меняется. Как я могу сделать это лучше?

enter image description here

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Проблема заключается в том, что PIL является растровым процессором изображения, в отличие от векторного процессора изображений.Он "растеризует" векторных изображений (таких как файл EPS и SVG-файлы) в сетку при их открытии, поскольку может работать только с растрами.

Если эта сетка не имеетдостаточно разрешения, вы никогда не сможете восстановить его.Обычно он растеризуется со скоростью 100 точек на дюйм, поэтому, если вы хотите сделать большие изображения, вам нужно растеризовать их на большую сетку, прежде чем вы начнете.

Сравните:

from PIL import Image

eps_image = Image.open('image.eps')
eps_image.save('a.jpg')

Результат540x720:

enter image description here

И это:

from PIL import Image

eps_image = Image.open('image.eps')
# Rasterise onto 4x higher resolution grid
eps_image.load(scale=4)   
eps_image.save('a.jpg') 

Результат 2160x2880:

enter image description here

Теперь у вас достаточно качества для изменения размера, как вам нравится.

Обратите внимание, что вам вообще не нужно писать Python для этого - ImageMagick сделает все за вас.Он включен в большинство дистрибутивов Linux и доступен для macOS и Windows, и вы просто используете его в терминале.Эквивалентная команда выглядит следующим образом:

magick -density 400 input.eps -resize 800x600 -quality 95  output.jpg
1 голос
/ 12 июня 2019

Это потому, что eps_image.resize(new_size, Image.ANTIALIAS) возвращает измененную копию изображения. Поэтому вы должны хранить его в отдельной переменной. Просто измените: -

eps_image.resize(new_size, Image.ANTIALIAS)

до

eps_image = eps_image.resize(new_size, Image.ANTIALIAS)

UPDATE: -

Это может не решить проблему полностью, но все равно поможет.

  • Вы пытаетесь сохранить свое выходное изображение как .jpeg, который является формат сжатия с потерями, поэтому информация теряется во время сжатие / преобразование (по большей части). Изменить вывод расширение файла до формата сжатия без потерь, например .png, чтобы данные не будут скомпрометированы во время сжатия. Также изменить quality=95 до quality=100 в Image.save()
  • Вы используете Image.ANTIALIAS для передискретизации изображения, которое не очень хорошо при увеличении масштаба изображения (оно было заменено Image.LANCZOS в более новой версии предложение все еще существует для Обратная совместимость). Попробуйте использовать Image.BICUBIC, который производит довольно благоприятные результаты (по большей части) при увеличении масштаба изображения.
...