Ответ 1
Здесь версия TL; DR:
Чтобы создать изображение PNG размером 900 на 1500 пикселей из графика в foo.gv, вы можете запустить:
dot -Tpng -Gsize=9,15\! -Gdpi=100 -ofoo.png foo.gv
чтобы получить изображение, которое составляет ровно 900 пикселей в ширину или 1500 высоких, но не обязательно обоих; и затем:
convert foo.png -gravity center -background white -extent 900x1500 final.png
для прокрутки изображения с пробелами, чтобы он составлял ровно 900 на 1500 пикселей; где convert
является частью ImageMagick suite.
Вот подробное объяснение:
Чтобы уточнить:
-
Атрибут
bb
отмечен как "только для записи" , поэтому ни один из механизмов компоновки Graphviz, скорее всего, не будет соблюдайте любые значения, которые вы отправляете перед обработкой. -
В общем случае Graphviz может генерировать как векторную (масштабируемую), так и растровую графику, поэтому DPI не всегда является значимая метрика.
В частности, атрибут
dpi
действителен только для форматов вывода растровых изображений и SVG.
То, что вы пытаетесь сделать, немного сложнее, поскольку размер пикселя изображения, сгенерированного Graphviz, управляется несколькими взаимодействующими атрибутами.
В качестве примера возьмем произвольный граф.
Команда gvgen -dh3
будет генерировать направленный гиперкуб третьей степени. (Если вы хотите более подробно об этом, PDF-версия страницы gvgen man здесь, но это не имеет значения, это просто произвольный график для демонстрационных целей.)
По умолчанию рендеринг PNG по умолчанию для этого графа может быть создан путем запуска команды:
gvgen -dh3 | dot -Tpng -oexample.png
Когда я это делаю, я получаю изображение размером в 275 x 347 пикселей в формате PNG (растровое изображение). (Как сообщается file example.png
.)
Атрибут size
позволяет вам рекомендовать максимальную или желаемую высоту и ширину для выходного изображения в дюймах. I.e., атрибут size=3,5
сообщает Graphviz генерировать максимум 3 на 5 дюймов. Если изображение меньше 3 на 5, то Graphviz оставит его в покое. Если изображение начинается с 3 дюймов на 5 дюймов, Graphviz будет масштабировать его до тех пор, пока он не встанет в холст размером 3 на 5 дюймов (сохраняя соотношение сторон исходного изображения).
Добавление восклицательного знака изменяет атрибут size
от максимального размера до требуемого размера. Теперь, если оба размера меньше указанного размера, чертеж масштабируется до тех пор, пока хотя бы один размер не будет равен указанному размеру.
Например, запуск:
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png
(Обратите внимание, что \!
избегает восклицательного знака для bash. В файле DOT вы просто пишете size=3,5!
.)
генерирует изображение размером 288 x 363 пикселя, немного большее по размеру, по умолчанию.
Как появилась точка с этими цифрами? Ну, значение DPI по умолчанию Graphviz составляет 96 пикселей на дюйм. При этом разрешении изображение размером 3 на 5 дюймов представляет собой изображение размером 288 на 480 пикселей. Механизм компоновки просто увеличил изображение до тех пор, пока хотя бы один из размеров не соответствовал желаемому размеру.
Вы можете переопределить значение DPI по умолчанию, используя атрибут dpi
:
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=200 -oexample.png
Теперь сгенерированное изображение измеряет 600 на 757 пикселей. Опять же, Graphviz просто масштабировал изображение до тех пор, пока один из параметров не соответствовал желаемому размеру (но при этом разрешении изображение размером 3 на 5 дюймов представляет собой изображение размером 600 на 1000 пикселей).
Следовательно, если вы хотите сгенерировать изображение, содержащее произвольное количество пикселей, вам нужно соответственно установить как size
, так и dpi
.
I.e., предположим, что вы хотите создать изображение размером 900 на 1500 пикселей. Вы можете использовать:
gvgen -dh3 | dot -Tpng -Gsize=9,15\! -Gdpi=100 -oexample.png
или
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -oexample.png
или даже:
gvgen -dh3 | dot -Tpng -Gsize=900,1500\! -Gdpi=1 -oexample.png
(Но, хотя последний, казалось, работал у меня в быстрой проверке, я бы рекомендовал придерживаться более условного значения DPI на всякий случай.)
Это решает большую часть вашей проблемы, но обратите внимание, что Graphviz только масштабирует изображение до тех пор, пока один из размеров не будет соответствовать указанному размеру. В зависимости от соотношения сторон исходного изображения вы можете или не можете получить точный размер, который вы ищете.
Здесь используется ratio
атрибут.
Команда:
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -Gratio=fill -oexample.png
должен предоставить вам изображение с точным размером, которое вы ищете, но с несколькими предостережениями:
-
На практике, кажется, иногда получается немного иной размер, чем хотелось бы. Например, когда я запускаю команду выше, я получаю изображение с разрешением 900 на 1472 пикселя (а не 900 на 1500). Я не знаю, связано ли это с ошибкой округления или тем, что.
-
Чтобы достичь этого, Graphviz должен масштабировать макет независимо в каждом измерении. Он достаточно умен, чтобы масштабировать макет, а не изображение, поэтому изображение не искажается как таковое, но в зависимости от того, насколько отличается ваше запрошенное соотношение сторон от "естественного" соотношения сторон, горизонтальный или вертикальный интервал может выглядеть немного странно.
ratio
также принимает несколько разных значений. Смотрите документацию и/или немного экспериментируйте, чтобы увидеть, что они делают.
Для чего стоит, если вы буквально хотите изображение точных размеров пикселей, которое вы запрашиваете, мое предложение будет состоять в том, чтобы позволить Graphviz масштабировать изображение таким образом, чтобы совпадало одно из двух измерений, а затем используйте что-то вроде ImageMagick, чтобы поместить изображение, чтобы получить точное соотношение сторон, которое вы ищете. Например, команда:
convert in.png -gravity center -background white -extent 900x1500 out.png
центрирует изображение (от in.png
) на холсте 900 на 1500 пикселей (сохраняя его в out.png
), при необходимости добавляя горизонтальное или вертикальное измерение