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
JavaFX2.2中的SVG图像_Svg_Javafx_Batik - Fatal编程技术网

JavaFX2.2中的SVG图像

JavaFX2.2中的SVG图像,svg,javafx,batik,Svg,Javafx,Batik,我是JavaFX2.2新手,到目前为止,我还没有找到在JavaFX2.2应用程序中显示SVG图像的方法。我看了一下Batik,但它并没有对我起作用,因为它转换为buffereImage,而不是javafx.ImageView 有没有办法在JavaFX应用程序中显示SVG图像?或者至少可以从JavaFX导出SVG图像吗?函数Node.snapshot()是否有任何帮助 有没有办法在JavaFX应用程序中显示SVG图像 以下是一些选项: 在WebView的WebEngine中创建一个和svg图像 该

我是JavaFX2.2新手,到目前为止,我还没有找到在JavaFX2.2应用程序中显示SVG图像的方法。我看了一下Batik,但它并没有对我起作用,因为它转换为
buffereImage
,而不是
javafx.ImageView

有没有办法在JavaFX应用程序中显示SVG图像?或者至少可以从JavaFX导出SVG图像吗?函数
Node.snapshot()
是否有任何帮助

有没有办法在JavaFX应用程序中显示SVG图像

以下是一些选项:

  • 在WebView的WebEngine中创建一个和svg图像
  • 该项目包括一个(链接现已失效:())
  • 这还将svg转换为fxml(链接现在已失效:())
  • 您可以使用基于awt的库,如或,并将生成的BuffereImage转换为JavaFX映像
  • JavaFX2.2本机支持一些最小字符串(不是完整的SVG规范)
  • 您可以编写一个转换器,使用javafxcanvas命令呈现svg
  • 提供一个SVGLoader,其用法如以下问题的答案所示:
  • 或者至少可以从javafx导出SVG图像吗

    这个功能听起来像是JavaFX场景图到svg的转换器。虽然理论上是可能的,但我不知道有人已经创建了这样的工具

    函数Node.snapshot()在这方面有帮助吗

    无法从JavaFX场景图导出svg图像,因为svg是基于矢量的格式,而节点快照是位图格式

    我看了一下Batik,但它并没有帮我解决问题,因为它转换为BuffereImage,而不是javafx.ImageView

    您可以使用在awt BuffereImage和javafx映像之间轻松转换

    就性能而言,您会推荐哪种方式

    对于复杂的svg,而不是从fxml进行渲染,您可能会在位图图像或画布图形上下文中获得更好的性能渲染。这是因为您的场景图最终会简单得多,节点要少得多,这意味着javafx运行时要做的工作会少得多。对于简单的svg(<1000个生成的节点),这可能不会太重要

    将SVG转换为FXML是否与创建javafx.scene.shape.SVGPath实例有关

    部分。完整图形比基本图形覆盖更多的背景。此外,SVG还可以执行渐变、效果、动画等。因此,如果源SVG图像包含这些附加项目,则还需要将它们转换为FXML(尽其所能,SVG的某些方面,例如脚本编写,很难转换为FXML)

    我的猜测是SVG规范的规模和复杂性是JavaFX core API中目前没有直接支持完整SVG图像系统的原因之一,相反,只提供了有限的类似功能,如SVGPath。在JavaFX core API中本机实现SVG对rela来说成本很高与其他需要的物品相比,奖励很少

    如果是这样,2(和3)和5不是一样吗

    不。第2和第3节中提到的NetBeans和Eclipse工具比第5节中提到的SVGPath工具功能更强大,因为这些工具将SVG规范的其他方面转换为FXML等价物(例如梯度、效果和转换)。

    JavaFX+Batik+自定义转码器 由于我还没有找到一个将蜡染与JavaFX结合使用的完整示例,我将在下面提供一个完整的解决方案

    请注意,为了简洁起见,我删除了异常处理(例如用于
    TranscoderException
    ) 您可以在此处访问完整代码

  • 为了将带有蜡染的SVG文件转换为
    缓冲图像
    ,必须实现自定义转码器:

    /**
     * Many thanks to bb-generation for sharing this code!
     * @author bb-generation
     * @link http://bbgen.net/blog/2011/06/java-svg-to-bufferedimage/
     * @link In case the link above is still down: https://web.archive.org/web/20131215231214/http://bbgen.net/blog/2011/06/java-svg-to-bufferedimage/
     */
    
    public class BufferedImageTranscoder extends ImageTranscoder {
    
        private BufferedImage img = null;
    
        @Override
        public BufferedImage createImage(int width, int height) {
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            return bi;
        }
    
        @Override
        public void writeImage(BufferedImage img, TranscoderOutput to) throws TranscoderException {
            this.img = img;
        }
    
        public BufferedImage getBufferedImage() {
            return img;
        }
    }
    
  • 使用转码器生成
    buffereImage
    对象:

    BufferedImageTranscoder trans = new BufferedImageTranscoder();
    
    // file may be an InputStream.
    // Consult Batik's documentation for more possibilities!
    TranscoderInput transIn = new TranscoderInput(file);
    
    trans.transcode(transIn, null);
    
  • buffereImage
    对象转换为
    Image
    对象(来自JavaFX):

  • 最后,将先前接收到的对象分配给您的
    ImageView

    imgView.setImage(img);
    

  • 我使用上面的transcoder类在github上创建了一个小项目,该项目为JavaFX添加了SVG支持(尽管是JavaFX8):

    打完电话

    SvgImageLoaderFactory.install();
    

    您可以在Java代码或CSS中的任何位置使用SVG图像,就像任何其他受支持的图像类型一样。

    谢谢您的详细回答!在性能方面-您建议采用哪种方式?将它们全部转换为fxml?谢谢!我想投票支持您的回答,但我没有这样做的声誉。对不起!@jewelsea正在将SVG转换为fxml关于创建
    javafx.scene.shape.SVGPath的实例的FXML?如果是这样,那么#2(和#3)和#5不是一样吗?或者您在#5中提到了不同的
    SVGPath
    ?(编辑:显然这和我看到的链接是一样的。所以我想问一下#2和#3中的内容是否不是关于
    javafx.scene.shape.SVGPath
    )我在看这个例子:Batik在Java9+上已经被破坏了好几年了,而且维护人员似乎对修复它不太感兴趣,所以如果你需要在过去5年发布的JRE上运行,那么采用这种方法将是浪费时间。有关详细信息,请参阅。再加上厨房水槽非可选依赖项,这会给com带来阴影MonAPI jars-例如jython-我不建议在生产代码中使用蜡染。
    SvgImageLoaderFactory.install();