Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将矢量化后Potrace生成的BuffereImage保存到svg格式的文件中?_Java_Svg_Vector Graphics_Image Transcoding - Fatal编程技术网

Java 如何将矢量化后Potrace生成的BuffereImage保存到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文件。我该怎么做 这里嵌入了主要对光栅图像进

我使用的是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"));