使用SVG Salamander加载SVG文档的方法如下:
- 创建一个
BufferedImage
。
- 从该
BufferedImage
创建一个Graphics2D
上下文。
- 调用
SVGDiagram
的render()
方法来绘制图像。
使用SVGIcon
可以简化这个过程,它处理了Salamander内部,允许对象作为普通的Swing Icon
。
要在命令行上对多个SVG文件进行栅格化,有一个Ant任务可用于此类转换。详情请参见文档。
以下是一个示例栅格化程序,给定SVG资源文件路径,将加载并渲染矢量图形到BufferedImage
中。无保修、无支持。
SvgRasterizer.java
import com.kitfox.svg.SVGDiagram;
import com.kitfox.svg.SVGException;
import com.kitfox.svg.SVGUniverse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.Map;
import static java.awt.RenderingHints.*;
import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
public class SvgRasterizer {
public final static Map<Object, Object> RENDERING_HINTS = Map.of(
KEY_ANTIALIASING,
VALUE_ANTIALIAS_ON,
KEY_ALPHA_INTERPOLATION,
VALUE_ALPHA_INTERPOLATION_QUALITY,
KEY_COLOR_RENDERING,
VALUE_COLOR_RENDER_QUALITY,
KEY_DITHERING,
VALUE_DITHER_DISABLE,
KEY_FRACTIONALMETRICS,
VALUE_FRACTIONALMETRICS_ON,
KEY_INTERPOLATION,
VALUE_INTERPOLATION_BICUBIC,
KEY_RENDERING,
VALUE_RENDER_QUALITY,
KEY_STROKE_CONTROL,
VALUE_STROKE_PURE,
KEY_TEXT_ANTIALIASING,
VALUE_TEXT_ANTIALIAS_ON
);
private final static SVGUniverse sRenderer = new SVGUniverse();
public SVGDiagram loadDiagram( final String path ) {
final var url = getResourceUrl( path );
final var uri = sRenderer.loadSVG( url );
final var diagram = sRenderer.getDiagram( uri );
return applySettings( diagram );
}
public DimensionTuple calculateScale(
final SVGDiagram diagram, final Dimension dstDim ) {
final var srcDim = new ScalableDimension(
(int) diagram.getWidth(), (int) diagram.getHeight()
);
final var scaled = srcDim.scale( dstDim );
return new DimensionTuple( srcDim, scaled );
}
public BufferedImage rasterize(
final SVGDiagram diagram, final DimensionTuple tuple )
throws SVGException {
final var scaled = tuple.getValue();
final var wScaled = (int) scaled.getWidth();
final var hScaled = (int) scaled.getHeight();
final var image = new BufferedImage( wScaled, hScaled, TYPE_INT_ARGB );
final var graphics = image.createGraphics();
graphics.setRenderingHints( RENDERING_HINTS );
final var transform = graphics.getTransform();
transform.setToScale( tuple.getWidthRatio(), tuple.getHeightRatio() );
graphics.setTransform( transform );
diagram.render( graphics );
graphics.dispose();
return image;
}
public Image rasterize(
final SVGDiagram diagram, final Dimension dstDim ) throws SVGException {
return rasterize( diagram, calculateScale( diagram, dstDim ) );
}
private URL getResourceUrl( final String path ) {
return SvgRasterizer.class.getResource( path );
}
private SVGDiagram applySettings( final SVGDiagram diagram ) {
diagram.setIgnoringClipHeuristic( true );
return diagram;
}
}
您还需要使用ScalableDimension
和DimensionTuple
类。
ScalableDimension.java
import java.awt.*;
public final class ScalableDimension extends Dimension {
public ScalableDimension( final int w, final int h ) {
super( w, h );
}
@SuppressWarnings("unused")
public ScalableDimension( final double w, final double h ) {
this( (int) w, (int) h );
}
public Dimension scale( final Dimension dst ) {
final var srcWidth = getWidth();
final var srcHeight = getHeight();
final var ratio = Math.min(
dst.getWidth() / srcWidth, dst.getHeight() / srcHeight
);
return new ScalableDimension( (int) (srcWidth * ratio),
(int) (srcHeight * ratio) );
}
}
DimensionTuple.java
import java.awt.*;
public class DimensionTuple extends Pair<Dimension, Dimension> {
public DimensionTuple( final Dimension key, final Dimension value ) {
super( key, value );
}
public double getWidthRatio() {
return getValue().getWidth() / getKey().getWidth();
}
public double getHeightRatio() {
return getValue().getHeight() / getKey().getHeight();
}
}