Java 如何将矢量化后Potrace生成的BuffereImage保存到svg格式的文件中?
我使用的是PotraceJ(库的java版本)——请注意,potrace用于图像的矢量化 情境-potrace跟踪图像,并将结果存储在BuffereImage中,然后在JPanel中显示为ImageIcon 我的问题-我想将这个BuffereImage保存为一个文件,比如vector.svg 我尝试过使用ImageIO.write(),但这样做时没有创建任何文件。可能的原因可能是Java的图像编写器可能无法编写svg 我必须将这个矢量化图像存储为svg文件。我该怎么做 这里嵌入了主要对光栅图像进行矢量化的代码。而你可以在这里找到整个图书馆Java 如何将矢量化后Potrace生成的BuffereImage保存到svg格式的文件中?,java,svg,vector-graphics,image-transcoding,Java,Svg,Vector Graphics,Image Transcoding,我使用的是PotraceJ(库的java版本)——请注意,potrace用于图像的矢量化 情境-potrace跟踪图像,并将结果存储在BuffereImage中,然后在JPanel中显示为ImageIcon 我的问题-我想将这个BuffereImage保存为一个文件,比如vector.svg 我尝试过使用ImageIO.write(),但这样做时没有创建任何文件。可能的原因可能是Java的图像编写器可能无法编写svg 我必须将这个矢量化图像存储为svg文件。我该怎么做 这里嵌入了主要对光栅图像进
package potracej.src;
导入potracej.src.compat.ConvertToJavaCurves;
导入potracej.src.compat.PathElement;
导入potracej.src.potracej.Bitmap;
进口potracej.src.potracej.potracej;
导入potracej.src.potracej.param\t;
导入potracej.src.potracej.path\u t;
导入javax.imageio.imageio;
导入javax.swing.*;
导入javax.swing.event.ChangeEvent;
导入javax.swing.event.ChangeListener;
导入javax.swing.plaf.metal.MetalButtonUI;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.GeneralPath;
导入java.awt.image.buffereImage;
导入java.awt.image.WritableRaster;
导入java.io.File;
导入java.io.IOException;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.ArrayList;
导入java.util.HashSet;
/**
*使用IntelliJ IDEA创建。
*用户:san
*日期:2012年6月10日
*时间:下午12:55
*要更改此模板,请使用文件|设置|文件模板。
*/
公共班机{
静态缓冲图像结果;
静态位图;
静态参数=新参数();
静态双刻度=1;
静态图像图标结果;
静态图像图标;
静态缓冲图像源图像;
静态布尔renderSourceImage=false;
公共静态void main(字符串[]args)引发IOException{
Path p=Path.get(新文件(“.”.getCanonicalPath()+”/potracej/girl.png”);
sourceImage=ImageIO.read(p.toFile());
//Toolkit.getDefaultToolkit()。
WritableRaster raster=sourceImage.getRaster();
int[]iarr=新的int[4];
bmp=新位图((int)(sourceImage.getWidth()),(int)(sourceImage.getHeight());
对于(int y=0;y任何期待这一问题答案的人都可能是像我这样的人。图像处理新手,寻找可以满足您探险渴望的库。我还没有找到解决这个问题的方法,我不能错误地指导您其他人可以做什么
<>我观察到<>强>大多数图像处理库写在C++中。java中的库较少。为什么?性能< /强>。对于任何想要产生高效代码的人,所有输入的算法都应该使用C++。
我希望在我的Android应用程序上面有解决方案。我将用C++编写代码,并通过Android NDK连接。
对于所有其他迷失的灵魂,勇敢地做出这个决定。这是我的证据证明。我们可以转换这个物体:
GeneralPath path = new GeneralPath();
使用
将依赖项添加到pom.xml中
差不多准备好了。现在,我们可以使用内置的GeneralPath创建SVG文件
完成了
GeneralPath path = new GeneralPath();
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svggen</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-anim</artifactId>
<version>1.9</version>
</dependency>
private static SVGOMDocument createSvgDocument(int width, int height) {
DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation();
SVGOMDocument document = (SVGOMDocument) domImpl.createDocument(SVGDOMImplementation.SVG_NAMESPACE_URI, "svg", null);
Element svgTag = document.getRootElement();
svgTag.setAttribute("width", String.valueOf(width));
svgTag.setAttribute("height", String.valueOf(height));
return document;
}
private static void putPathToSvgDocument(SVGOMDocument document, GeneralPath path) {
SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document);
SVGPath svgPath = new SVGPath(ctx);
Element svgElement = svgPath.toSVG(path);
svgElement.setAttribute("fill", "#000");
document.getRootElement().appendChild(svgElement);
}
private static void saveSvgDocumentToFile(SVGOMDocument document, File file) throws FileNotFoundException, IOException {
SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
try (Writer out = new OutputStreamWriter(new FileOutputStream(file), "UTF-8")) {
svgGenerator.stream(document.getDocumentElement(), out);
}
}
GeneralPath path = new GeneralPath();
...
// TODO: set your image width and height ;)
SVGOMDocument document = createSvgDocument(1000,1000);
putPathToSvgDocument(document, path);
// TODO: set your filename :)
saveSvgDocumentToFile(document, new File("c:\\temp\\result.svg"));