Как установить атрибут рендеринга формы для crispEdges с помощью Apache Batik SVG 1.8

#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/> .

Я с нетерпением жду более чистых реализаций.