当前位置: 首页 > 知识库问答 >
问题:

JavaFX 2.2 中的 SVG 图像

芮明知
2023-03-14

我是JavaFX 2.2的新手,到目前为止,我无法找到在我的JavaFX 2.2应用程序中显示SVG图像的方法。我看了一下Batik,但它没有为我做这个把戏,因为它可以转换为BufferedImages而不是javafx。图像视图

有什么方法可以在JavaFX应用程序中显示SVG图像?或者至少可以从JavaFX导出一个SVG图像?函数< code>Node.snapshot()有什么帮助吗?

共有3个答案

山煜祺
2023-03-14

由于我在任何地方都找不到使用Batik和JavaFX的完整示例,所以我在下面提供了一个完整的解决方案。

请注意,为了简洁起见,我删除了异常处理(例如,对于TranscoderException)。
您可以在此处访问完整代码:https://gist.github.com/ComFreek/b0684ac324c815232556

>

  • 为了将带有Batik的SVG文件转换为BuffereImage,您必须实现自定义转码器:

    /**
     * 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;
        }
    }
    

    使用转码器生成缓冲图像对象:

    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);
    

    BufferedImage对象转换为Image对象(来自JavaFX):

    // Use WritableImage if you want to further modify the image (by using a PixelWriter)
    Image img = SwingFXUtils.toFXImage(trans.getBufferedImage(), null);
    

    最后,将之前收到的对象分配给< code>ImageView:

    imgView.setImage(img);
    

  • 王昆
    2023-03-14

    我使用上面的转码器类在github上创建了一个小项目,它为JavaFX添加了SVG支持(不过是JavaFX 8):javafxsvg

    打电话后

    SvgImageLoaderFactory.install();
    

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

    严峰
    2023-03-14

    有什么方法可以在JavaFX应用程序中显示SVG图像?

    以下是一些选项:

    • 创建WebView并将svg图像加载到WebView的WebEngine中
    • e(fx)clipse项目包括一个svg到fxml转换器(链接现已失效:())
    • 这个NetBeans插件还将svg转换为fxml(链接现在已失效:())
    • 您可以使用基于awt的库,如Batik或svgsalamander,并将生成的BufferedImage转换为JavaFX图像
    • JavaFX2.2本机支持一些最小的SVGPath字符串(不是完整的SVG规范)
    • 您可以编写一个转换器,使用JavaFX Canvas GraphicsContext命令呈现svg
    • FranzXaver提供了一个SVGLoader,其用法在回答:在JavaFX上的按钮中加载SVG文件
    • https://github.com/hervegirod/fxsvgimage
      • 该库允许将SVG文件转换为JavaFX节点树或图像
      • 请注意,与其他现有库相反,该库没有外部依赖项(包括Batik)

      或者至少可以从javafx导出一个SVG图像?

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

      执行功能节点。快照()有任何帮助吗?

      Node.snapshot() 对从 JavaFX 场景图导出 svg 图像没有帮助,因为 svg 是基于矢量的格式,而节点快照是位映射格式。

      我看了一下Batik,但它没有为我做这个把戏,因为它可以转换为BufferedImages而不是javafx。图像视图。

      您可以使用SwingFXUtils轻松地在awt BufferedImages和javafx图像之间进行转换。

      在性能方面,您会推荐哪种方法?

      对于复杂的svg,与从fxml渲染相比,您可能会获得更好的位图图像或画布图形渲染性能。这是因为您的场景图形最终会简单得多,节点也少得多——这意味着javafx运行时要做的工作会少得多。对于简单的SVG(

      将SVG转换为FXML是关于创建javafx.scene.shape.SVGPath的实例吗?

      部分地。完整的SVG规范涵盖了比基本形状更多的内容。此外,SVG可以执行渐变、效果、动画等。因此,如果源SVG图像包含这些附加项,那么它们也需要被转换成FXML(尽可能地,SVG的某些方面,比如脚本,很难转换成FXML)。

      我的猜测是SVG规范的大小和复杂性是JavaFX核心API目前不包含对完整SVG映像系统的直接支持,而是只提供有限的类似功能(例如SVGPath)的原因之一。与其他理想的项目相比,在JavaFX核心API中本机实现SVG的成本会很高,但回报相对较少。

      如果是这样的话,#2(和#3)和#5不是一样吗?

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

     类似资料:
    • 概述 SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics)。其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它本质上是文本文件,体积较小,且不管放大多少倍都不会失真。 SVG 文件可以直接插入网页,成为 DOM 的一部分,然后用 JavaScript 和 CSS 进行操作。 <!DOCTYPE html> <htm

    • SVG是“可缩放矢量图”(Scalable Vector Graphics)的缩写,是一种描述向量图形的XML格式的标记化语言。也就是说,SVG本质上是文本文件,格式采用XML,可以在浏览器中显示出矢量图像。由于结构是XML格式,使得它可以插入HTML文档,成为DOM的一部分,然后用JavaScript和CSS进行操作。 相比传统的图像文件格式(比如JPG和PNG),SVG图像的优势就是文件体积小

    • SVG是“可缩放矢量图”(Scalable Vector Graphics)的缩写,是一种描述向量图形的XML格式的标记化语言。也就是说,SVG本质上是文本文件,格式采用XML,可以在浏览器中显示出矢量图像。由于结构是XML格式,使得它可以插入HTML文档,成为DOM的一部分,然后用JavaScript和CSS进行操作。 相比传统的图像文件格式(比如JPG和PNG),SVG图像的优势就是文件体积小

    • 我使用JavaFX2.2制作了一个应用程序,希望切换到JavaFX8。使用JavaFX2.2,我的应用程序如下所示: 在使用JavaFX8而不更改任何源代码时,如下所示: 在JavaFX8中,一些节点根本不显示(例如,条件1),有时在随机单击ScrollPane后出现。此外,节点的大小不正确(比较步骤1和小点)。另一个问题是,当执行添加节点等操作时,应用程序在JavaFX8中严重滞后。 null

    • JavaFX2教程有一个地址簿示例,它是一个表视图。 辅导的:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACFEHBI 编辑单元格的增强功能:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm 修改以添加复选框:h

    • 全局 Svg Icon 图标组件。 默认在 @/icons 中注册到全局中,可以在项目中任意地方使用。所以图标均可在 @/icons/svg。可自行添加或者删除图标,所以图标都会被自动导入,无需手动操作。 使用方式 <!-- icon-class 为 icon 的名字; class-name 为 icon 自定义 class--> <svg-icon icon-class="password"