Как рисовать svg изображения в формате Win2D Canvas Drawing Session? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть большая коллекция символов в формате svg, которую нужно рисовать в сеансе рисования Canvas в Win2D. Многие из них будут повторяться, поэтому я намерен заранее загрузить их в библиотеку. Кажется, есть разные способы сделать это. Одним из них является CanvasSvgDocument, который я могу загрузить из Uri с помощью его метода LoadAsync и нарисовать с помощью метода DrawingSession DrawSvg и его переопределений. Проблема в том, что DrawSvg игнорирует аргумент размера и всегда рисует изображение одинакового размера. Например, внутри сеанса рисования:

float2 symbolSize;
symbolSize.x = 400;//just to experiment
symbolSize.y = 300;
session.DrawSvg(m_test_svg, symbolSize, 100, 100);

Независимо от символа. Размер изображения всегда отображается с одинаковым небольшим размером. Что-то не так с аргументом о размере, или я неправильно понимаю, для чего это нужно? Возможно, это не лучший способ нарисовать SVG в любом случае. Они в увеличенном виде и должны быть прорисованы при любом увеличении.

[Обновить] Я заметил, что у меня был неправильный тип для аргумента размера, он должен быть

winrt::Windows::Foundation::Size symbolSize;
symbolSize.Width = 400;
symbolSize.Height = 300;
session.DrawSvg(m_test_svg, symbolSize,100,100);

Но результаты одинаковы, возможно, поэтому компилятор принимает и то, и другое. То есть я ожидаю, что Size набирает Float2. Но не должно ли это повлиять на рисунок?

[Обновить] В документе сказано, что аргумент Size относится к размеру окна просмотра, а не к размеру окна просмотра. Возможно, было бы достаточно, если бы кто-то, участвующий в создании этого класса, мог описать назначение аргумента Size в этом вызове - и если он не предназначен для определения размера отображаемого изображения, есть ли другой способ сделать это? Благодарю. [Обновление] Если быть более точным, то после более подробного изучения: масштабирование этого масштабируемого векторного изображения требует изменения окна просмотра, в то время как аргумент DrawSvg, по-видимому, влияет только на viewPort, то есть часть изображения, которое будет отображаться. Есть ли способ масштабировать изображение больше или меньше? Если нет, я мог бы также использовать pngs. Если вы не можете масштабировать SVG, какой смысл в этом?

[Обновление] Все еще надеемся получить отзыв об этом. В другом месте я слышал, что можно изменить преобразование для всего холста, прежде чем рисовать любой из сотен символов. Пока не выяснили, как это сделать, но возникла другая идея: в перечислении CanvasSvgAspectScaling есть что-то, что было бы уместно: PreserveAspectRatio с соответствующим значением означает «масштабировать окно просмотра до максимума, необходимого для того, чтобы сделать весь вид поле видимым» в окне просмотра. " Похоже, это будет означать: установить размер окна просмотра нужного изображения, установить CanvasSvgAspectScaling, чтобы иметь это перечисляемое значение, а затем svg будет рисовать, чтобы заполнить область просмотра, который является аргументом, предоставленным в CanvasDrawingSession.DrawSvg. Это было бы хорошо, но это не имеет никакого эффекта.

1 Ответ

0 голосов
/ 10 ноября 2018

ОК, вот ответ. Полностью недокументированный, насколько я могу судить, поэтому я надеюсь, что это стабильно. Если так, то я действительно должен сделать это коммерческой тайной, но я чувствую себя настроенным обществом. Похоже, что если я просто удаляю атрибуты высоты и ширины svg, то аргумент размера области просмотра в DrawingSession.DrawSvg станет размером нарисованного изображения - независимо от того, какой масштаб вы хотите, без необходимости где-либо устанавливать преобразования. Viewbox и Viewport становятся одним. Очень просто. Если в MS есть кто-то, кто знает причину, почему я не должен этого делать, пожалуйста, говорите!

...