我可以使用SVG Salamander将SVG栅格化为PNG文件吗?
我见过它,因为SVG蝾螈对我的项目来说足够小。但我不知道我是否能用它,也不知道怎么做 我使用了以下代码:我可以使用SVG Salamander将SVG栅格化为PNG文件吗?,svg,png,rasterize,svg-salamander,Svg,Png,Rasterize,Svg Salamander,我见过它,因为SVG蝾螈对我的项目来说足够小。但我不知道我是否能用它,也不知道怎么做 我使用了以下代码: public static void main(String[] args) throws IOException, SVGException { // TODO Auto-generated method stub File f = new File("./src/game_scheme.svg"); SVGUniverse svgUniverse = new S
public static void main(String[] args) throws IOException, SVGException {
// TODO Auto-generated method stub
File f = new File("./src/game_scheme.svg");
SVGUniverse svgUniverse = new SVGUniverse();
SVGDiagram diagram = svgUniverse.getDiagram(svgUniverse.loadSVG(f.toURL()));
BufferedImage bi = new BufferedImage(320, 240, BufferedImage.TYPE_INT_ARGB);
Graphics2D ig2 = bi.createGraphics();
diagram.render(ig2);
ImageIO.write(bi, "PNG", new File("./yourImageName.png"));
}
但是图像并不平滑:(,有什么想法吗?是的,要使用SVG蝾螈加载SVG文档:
buffereImage
buffereImage
创建Graphics2D
上下文SVGDiagram
上的render()
SVGIcon
可以简化该过程,它处理蝾螈的内部结构,允许对象充当普通的摆动图标
要在命令行上光栅化多个SVG文件,有一个Ant任务用于此类转换。有关详细信息,请参阅
下面是一个示例光栅化器,给定SVG资源文件的路径,该光栅化器将加载矢量图形并将其渲染到
buffereImage
。无保修,无支持
SvgRasterizer.java
导入com.kitfox.svg.SVGDiagram;
导入com.kitfox.svg.SVGException;
导入com.kitfox.svg.SVGUniverse;
导入java.awt.*;
导入java.awt.image.buffereImage;
导入java.net.URL;
导入java.util.Map;
导入静态java.awt.RenderingHints.*;
导入静态java.awt.image.BufferedImage.TYPE_INT_ARGB;
/**
*负责将SVG图像转换为光栅化PNG图像。
*/
公共级扩频器{
公共最终静态地图渲染_HINTS=Map.of(
键_抗锯齿,
值_反别名_ON,
键α插值,
值\α\插值\质量,
按键颜色渲染,
值\颜色\渲染\质量,
键抖动,
值\u抖动\u禁用,
基尤分馏计量学,
价值计量,
按键插值,
值插值双三次,
关键点,
价值(渲染)(质量),,
按键行程控制,
值\u笔划\u纯,
键\u文本\u抗锯齿,
值\文本\反别名\开启
);
私有最终静态SVGUniverse srender=新SVGUniverse();
/**
*将给定路径指定的资源加载到的实例中
*{@link SVGDiagram}可以光栅化为位图格式
*{@link SVGUniverse}类将
*
*@param path相对于根的完整路径(从根开始)
*应用程序或JAR文件的资源目录。
*@return一个{@link SVGDiagram}可以被光栅化到
*{@link BufferedImage}。
*/
公共SVGDiagram加载图(最终字符串路径){
最终var url=getResourceUrl(路径);
最终var uri=srender.loadSVG(url);
最终var图=srender.getDiagram(uri);
返回应用程序设置(图表);
}
/**
*一种可重复使用的方法,用于帮助计算
*给定{@link SVGDiagram}映像和目标{@link Dimension}s。
*
*@param图具有宽度和高度的二维矢量图。
*@param dstDim图像的目标尺寸。
*@返回源图像维度(键)和
*缩放图像尺寸(值)。
*/
公共维度元组计算比例(
最终SVG图表,最终尺寸(dstDim){
最终变量srcDim=新的可缩放维度(
(int)diagram.getWidth(),(int)diagram.getHeight()
);
最终var标度=srcDim.标度(dstDim);
返回新的维度元组(srcDim,缩放);
}
/**
*使用{@link BufferedImage}将矢量图形栅格化为给定大小。
*渲染提示设置为生成高质量输出。
*
*@param diagram要栅格化的图表。
*@param tuple源和目标映像维度。
*@返回光栅化的{@link Image}。
*@SVGException无法打开、读取、分析或呈现SVG数据。
*/
公共缓冲区图像光栅化(
最终SVGDiagram图,最终维度元组(元组)
抛出SVGEException{
最终变量scaled=tuple.getValue();
最终变量wScaled=(int)scaled.getWidth();
最终变量hScaled=(int)scaled.getHeight();
最终var映像=新的缓冲区映像(wScaled、hScaled、TYPE_INT_ARGB);
final var graphics=image.createGraphics();
graphics.SetRenderingHits(渲染提示);
final var transform=graphics.getTransform();
setToScale(tuple.getWidthRatio(),tuple.getHeightRatio());
graphics.setTransform(transform);
图.渲染(图形);
graphics.dispose();
返回图像;
}
/**
*使用{@link BufferedImage}将矢量图形栅格化为给定大小。
*渲染提示设置为生成高质量输出。
*
*@param diagram要栅格化的图表。
*@param dstDim输出图像尺寸。
*@返回光栅化的{@link Image}。
*@SVGException无法打开、读取、分析或呈现SVG数据。
*/
公共图像光栅化(
最终SVGDiagram图,最终尺寸(dstDim)引发SVGEException{
返回光栅化(图表、计算比例(图表、dstDim));
}
/**
*获取{@link URL}的实例,该实例引用
*应用程序的资源。
*
*@param path相对于根的完整路径(从根开始)
*应用程序或JAR文件的资源目录。
*@将{@link URL}返回到文件,如果路径不正确,则返回{@code null}
*指向一个资源。
*/
私有URL getResourceUrl(最终字符串路径){
返回SvgRasterizer.class.getResource(路径);
}
/**
*指示SVG渲染器对图像进行光栅化,即使图像将
*剪短了。
*
*@param diagram要呈现的{@link SVGDiagram}。
*@返回同一实例,忽略片段启发式设置为{@code true}。
*/
专用SVGDiagram应用程序设置(最终SVGDiagram图){
图.setIgnoringClipHeuristic(真);
返回图;
}
}
您还需要ScalableDimensi
Graphics2D ig2 = bi.createGraphics();
ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
diagram.render(ig2);
ig2.dispose();
ImageIO.write(bi, "PNG", new File("./yourImageName.png"));