Как преобразовать SVG в PNG или JPEG в Python?

Я использую svgwrite и создаю svg-файлы, как мне преобразовать их в PNG или JPEG?

Я не нашел подобного вопроса в SO. Проголосовали.

qräbnö 20.07.2018 22:50

Кажется, здесь есть ответ на ваш вопрос: stackoverflow.com/questions/6589358/…

domochevski 20.07.2018 22:50

Но ... это еще одна библиотека, верно? Но может тебе это нужно.

qräbnö 20.07.2018 22:51

@ qräbnö Ну, поскольку svgwrite, похоже, не обрабатывает преобразование svg в png, тогда ... да, вам нужна другая библиотека. Другой пример того же вопроса можно найти здесь: stackoverflow.com/questions/2932408/…

domochevski 20.07.2018 22:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
14
4
9 791
4

Ответы 4

Я могу придумать два способа преобразования svg в png:

1. Вот библиотека, которая может делать то, что вам нужно: https://cairosvg.org/documentation/

$ pip3 install cairosvg

код python3:

cairosvg.svg2png(url = "/path/to/input.svg", write_to = "/tmp/output.png")

Использовал его в Linux (debian 9+ и ubuntu 18+) и MacOS. Он работает, как и ожидалось, для больших файлов размером около 1 МБ svg. Пример: карта мира. Lib также позволяет экспортировать файл pdf.

Совет: cairosvg обеспечивает масштабирование выходного изображения png, поскольку размер по умолчанию выглядит размытым после работы с векторной графикой svg :). Мне не удалось заставить работать параметр DPI.

2. Есть еще один способ сделать то же самое, используя браузер, чтобы открыть файл svg и сделать снимок экрана с помощью веб-драйвера Selenium либо с Firefox, либо с другим браузером. Вы можете сохранить скриншот как png.

Можно использовать Pillow для преобразования png в jpeg: Преобразование png в jpeg с помощью подушки

Я просмотрел несколько методов, включая cairo (который мне не удалось заставить работать в Windows), svglib + reportlab (dpi нельзя изменить) и даже inkscape (из командной строки).

В конце концов, это лучший метод, который я нашел. Я тестировал его на Python 3.7.

def convert(method, svg_file, png_file, resolution = 72):
    from wand.api import library
    import wand.color
    import wand.image

    with open(svg_file, "r") as svg_file:
        with wand.image.Image() as image:
            with wand.color.Color('transparent') as background_color:
                library.MagickSetBackgroundColor(image.wand, 
                                                 background_color.resource) 
            svg_blob = svg_file.read().encode('utf-8')
            image.read(blob=svg_blob, resolution = resolution)
            png_image = image.make_blob("png32")

    with open(png_file, "wb") as out:
        out.write(png_image)

Мне пришлось установить пакет палочки (используя pip), а затем ImageMagick для Windows (http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows).

пивипс поддерживает загрузку SVG. Это бесплатно, быстро, требует мало памяти и работает в macOS, Windows и Linux.

Вы можете использовать это так:

import pyvips

image = pyvips.Image.new_from_file("something.svg", dpi=300)
image.write_to_file("x.png")

По умолчанию значение DPI составляет 72, что может быть немного низким, но вы можете установить любой DPI, который вам нравится. Вместо этого вы можете писать в JPG очевидным способом.

Вы также можете загружать по нужным размерам в пикселях:

import pyvips

image = pyvips.Image.thumbnail("something.svg", 200, height=300)
image.write_to_file("x.png")

Это приведет к рендерингу SVG так, чтобы он поместился в рамку размером 200 x 300 пикселей. Файл документы представляют все варианты.

Загрузчик SVG pyvips имеет несколько хороших свойств:

  • Он использует librsvg для фактического рендеринга, поэтому PNG будет иметь высококачественные сглаженные края.
  • Это намного быстрее, чем такие системы, как ImageMagick, которые просто передают inkscape для рендеринга.
  • Он поддерживает прогрессивный рендеринг. Большие изображения (более нескольких тысяч пикселей на каждую сторону) визуализируются по разделам, что позволяет контролировать использование памяти даже для очень больших изображений.
  • Он поддерживает потоковую передачу, поэтому вы можете рендерить SVG прямо в огромную пирамиду Deep Zoom (например) без необходимости в каком-либо промежуточном хранилище.
  • Он поддерживает ввод из областей памяти, строк и каналов, а также файлов.

Рендеринг из строк может быть удобен, например:

import pyvips

x = pyvips.Image.svgload_buffer(b"""
<svg viewBox = "0 0 200 200">
  <circle r = "100" cx = "100" cy = "100" fill = "#900"/>
</svg>
""")

x.write_to_file("x.png")

Это решение требует, чтобы вы установили libvips в соответствии с libvips.github.io/libvips/install.html. Если у вас уже есть InkScape или что-то подобное, вам может не понадобиться другой редактор. Libvips довольно низка и технальна.

Mark Kortink 04.07.2021 00:30

После установки libvips все еще появляется ошибка = "невозможно загрузить библиотеку 'libgobject-2.0-0.dll': ошибка 0x7e. Кроме того, ctypes.util.find_library () не удалось найти библиотеку с именем 'libgobject-2.0-0.dll' ".

Mark Kortink 04.07.2021 00:54

Вы нашли примечания по установке окон pyvips? libvips.github.io/pyvips/README.html#non-conda-install ... если у вас все еще есть проблемы, пожалуйста, откройте проблему на трекере pyvips, и я постараюсь помочь github.com/libvips/pyvips/issues/new

jcupitt 04.07.2021 13:01

Полезный ответ stackoverflow.com/a/67429047/894763 ниже объясняет процесс установки Windows.

jcupitt 04.07.2021 13:04

Пробовал полезный ответ ниже, и он работает.

Mark Kortink 04.07.2021 23:52

В Windows вы получаете такие ошибки, как libgobject-2.0-0.dll, libvips-42.dll и т. д., Которые не найдены при попытке импортировать pyvips. Чтобы pyvips работал в Windows, сделайте следующее:

В коде сделайте это:

import os

# The bin folder has the DLLs
os.environ['path'] += r';C:\Path\ToYour\VIPsFolder\bin'

import pyvips

image = pyvips.Image.thumbnail("test.svg", 200)
image.write_to_file("test.png")

Я рекомендую использовать pyvips вместо cairosvg. Судя по моим тестам, он намного быстрее, чем cairosvg, особенно для больших SVG. Чтобы cairosvg в любом случае работал в Windows, вам потребуется что-то подобное приведенному выше.

Я пробовал это, и это работает, спасибо.

Mark Kortink 04.07.2021 23:51

Другие вопросы по теме