pygtk/rsvg - получить размер рисунка?

Могут ли RSVG и Cairo найти границы рисунка в изображении SVG?

то есть не ширина/высота страницы, а пространство, фактически используемое элементами рисования.

Это не работает, оно просто возвращает размер страницы:

 img = rsvg.Handle(file="myfile.svg")
 (w, h, w2,h2) = svg.get_dimension_data() # gives document's declared size

Кажется, это не возвращает никакой информации о размере:

 svg.render_cairo(context) # returns None

Это не работает, оно также возвращает размер страницы:

 self.svg.get_pixbuf().get_width()

Это с pygtk-all-in-one-2.24.0.win32-py2.7 и RSVG 2.22.3-1_win32, в которых я не могу найти функцию get_dimensions_sub(), упомянутую в других ответах.


person OJW    schedule 25.05.2012    source источник


Ответы (1)


Сегодня вечером я искал в Интернете, пытаясь решить эту, казалось бы, простую проблему. Кажется, нет простого способа получить ограничивающую рамку рисунка с помощью rsvg, cairo или подобных инструментов. Если только я не упустил что-то очевидное.

Однако вы можете вызвать Inkscape с параметром --query-all. Это дает вам размеры всех объектов в файле SVG и полный рисунок в качестве первой записи в списке.

import subprocess
output = subprocess.check_output(["inkscape", "--query-all", "myfile.svg"])
values = [line.split(',') for line in output.split('\n')]
whole_drawing = values[0]
[x, y, width, height] = map(float, whole_drawing[1:])

Теперь у вас будет позиция чертежа в x, y и его width и height. Благодаря этому становится просто использовать rsvg и cairo для перерисовки обрезанного SVG в новый файл.

Для этого я создал простой инструмент, надеюсь код должен быть довольно простым для понимания.

person skagedal    schedule 02.04.2013