#java #svg #batik
Вопрос:
Я пытаюсь заставить Apache Batik 1.8 выводить
shape-rendering="crispEdges"
вместо значения по умолчанию
shape-rendering="auto"
в корневом <svg />
узле.
Я обнаружил SVGConstants.SVG_SHAPE_RENDERING_ATTRIBUTE
и SVGConstants#SVG_CRISP_EDGES_VALUE
, но я не уверен, как установить эти атрибуты для SVGGraphics2D
экземпляра.
Я попытался что-то вроде подачи иска на SVGGraphics2D (с именем SVGGraphics2D
):
//svgGraphics.setRenderingHint(SVGRenderingHints.SVG_SHAPE_RENDERING_ATTRIBUTE,
// SVGRenderingHints.SVG_CRISP_EDGES_VALUE);
Однако это java.awt.RenderingHints
ожидает SVGGraphics2D.setRenderingHints.
Я также пробовал:
svgGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
svgGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
svgGraphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
svgGraphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
однако ни одно из вышеперечисленных действий не изменяет render-style
атрибут на ‘crispEdges’ в выходном файле SVG.
(В данный момент я изучаю Document
, надеюсь, я смогу вручную изменить атрибут с помощью XML / strings. Я также заметил несколько связанных классов в исходном коде, но, похоже, я не могу найти хороший пример / тест)
Какой самый элегантный способ изменить render-style
crispEdges
?
Ответ №1:
Я смог заставить это работать через Graphics2D
интерфейс. Для каждого кода Batik следующий код Graphics2D
добавляется shape-rendering="crispEdges"
в SVG:
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
Комментарии:
1. Ha! Я пробовал
svgGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
, но не ожидалRenderingHints.VALUE_ANTIALIAS_OFF)
установить «crispEdges» :))) Спасибо!2. Я знаю! Странно! Мне пришлось покопаться в коде, чтобы найти его. Опубликованные вами результаты поиска кода дали мне нить для продолжения, а затем мне повезло, и я наткнулся на ответ. Приветствия!
Ответ №2:
На данный момент я нашел обходной путь:
Element tlg = svgGraphics.getTopLevelGroup();
tlg.setAttribute("shape-rendering","crispEdges");
svgGraphics.setTopLevelGroup(tlg);
Графика теперь отображается четко, хотя, как следует из кода, атрибут применяется как стиль к элементу верхнего уровня <g/>
.
Я с нетерпением жду более чистых реализаций.