Конвертер Python SVG создает пустой файл

У меня есть код ниже, который должен преобразовать изображение SVG в PNG. Он работает без ошибок, но создает пустой файл PNG вместо файла с тем же изображением, что и исходный SVG. Я обнаружил, что это не ошибка с cairo, а ошибка, связанная с rsvg, которую я получил здесь .

import cairo
import rsvg

img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 640,480)
ctx = cairo.Context(img)
handle= rsvghandler.Handle('example.svg')
handle.render_cairo(ctx)
img.write_to_png("svg.png")

Я использую Python 3.6 в Windows 10.

Я не могу в жизни понять, почему он не отображает правильную картинку. Любая помощь будет очень признательна.


person Andoo    schedule 05.06.2019    source источник
comment
Я попытался воспроизвести вашу проблему, но не могу установить cairo. При запуске pip install cairo я получаю Could not find a version that satisfies the requirement cairo (from versions: ). При запуске pip install pycairo я получаю сообщение об ошибке Package cairo was not found in the pkg-config search path.Perhaps you should add the directory containing 'cairo.pc' to the PKG_CONFIG_PATH environment variable. Как ты получил это?   -  person physicalattraction    schedule 10.06.2019
comment
Я установил cairo, загрузив whl-файл Pycairo по адресу lfd.uci.edu/~gohlke/pythonlibs. используя pip install [wheelname] для его установки. Я не помню, какой из них работал у меня, но мне пришлось попробовать несколько, прежде чем я смог установить его правильно.   -  person Andoo    schedule 10.06.2019


Ответы (1)


Если вашей целью является преобразование из SVG в PNG, я бы рекомендовал использовать Wand , как в следующем скрипте:

from wand.api import library
import wand.color
import wand.image

with wand.image.Image() as image:
    with wand.color.Color('transparent') as background_color:
        library.MagickSetBackgroundColor(image.wand, 
                                         background_color.resource) 
    image.read(blob=NAMEOFTHEFILE.read(), format="svg")
    png_image = image.make_blob("png32")

with open(NAMEOFTHENEWFILE, "wb") as out:
    out.write(png_image)
person Gonçalo Peres 龚燿禄    schedule 08.06.2019
comment
Спасибо за ответ. Единственная проблема заключается в том, что я использую cairo, чтобы преобразовать svg в png и отобразить новое изображение на экране tkinter без его сохранения. Есть ли способ сделать это с помощью палочки? - person Andoo; 08.06.2019
comment
@ Анду, я не видел ссылки на это в твоем вопросе. Я бы посоветовал вам опубликовать другой вопрос. Но один из способов сделать это — использовать сохраненный файл и открыть его в tkinter. Вот пример кода, который можно открыть в ткинтер. - person Gonçalo Peres 龚燿禄; 08.06.2019
comment
Я не понимал, что удаление последних двух строк предотвратит его сохранение, но по-прежнему сохранит PNG как переменную. Думаю, это ответ на мой другой комментарий. Кроме того, знаете ли вы какой-либо способ заставить мой код работать? (Каир действительно быстрый) - person Andoo; 08.06.2019
comment
Как установить ImageMagick? - person Andoo; 10.06.2019
comment
@Andoo, если это помогло вам решить проблему, подумайте о том, чтобы пометить ответ как правильный. - person Gonçalo Peres 龚燿禄; 05.11.2019