Я использую svgwrite и создаю svg-файлы, как мне преобразовать их в PNG или JPEG?
Кажется, здесь есть ответ на ваш вопрос: stackoverflow.com/questions/6589358/…
Но ... это еще одна библиотека, верно? Но может тебе это нужно.
@ qräbnö Ну, поскольку svgwrite, похоже, не обрабатывает преобразование svg в png, тогда ... да, вам нужна другая библиотека. Другой пример того же вопроса можно найти здесь: stackoverflow.com/questions/2932408/…






Я могу придумать два способа преобразования 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 имеет несколько хороших свойств:
Рендеринг из строк может быть удобен, например:
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 довольно низка и технальна.
После установки libvips все еще появляется ошибка = "невозможно загрузить библиотеку 'libgobject-2.0-0.dll': ошибка 0x7e. Кроме того, ctypes.util.find_library () не удалось найти библиотеку с именем 'libgobject-2.0-0.dll' ".
Вы нашли примечания по установке окон pyvips? libvips.github.io/pyvips/README.html#non-conda-install ... если у вас все еще есть проблемы, пожалуйста, откройте проблему на трекере pyvips, и я постараюсь помочь github.com/libvips/pyvips/issues/new
Полезный ответ stackoverflow.com/a/67429047/894763 ниже объясняет процесс установки Windows.
Пробовал полезный ответ ниже, и он работает.
В 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, вам потребуется что-то подобное приведенному выше.
Я пробовал это, и это работает, спасибо.
Я не нашел подобного вопроса в SO. Проголосовали.