我是JavaFX 2.2的新手,到目前为止,我无法找到在我的JavaFX 2.2应用程序中显示SVG图像的方法。我看了一下Batik,但它没有为我做这个把戏,因为它可以转换为BufferedImages
而不是javafx。图像视图
。
有什么方法可以在JavaFX应用程序中显示SVG图像?或者至少可以从JavaFX导出一个SVG图像?函数< code>Node.snapshot()有什么帮助吗?
由于我在任何地方都找不到使用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);
我使用上面的转码器类在github上创建了一个小项目,它为JavaFX添加了SVG支持(不过是JavaFX 8):javafxsvg
打电话后
SvgImageLoaderFactory.install();
您可以在Java代码或CSS中的任何位置使用SVG图像,就像任何其他支持的图像类型一样。
有什么方法可以在JavaFX应用程序中显示SVG图像?
以下是一些选项:
或者至少可以从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"