当前位置: 首页 > 面试题库 >

在JavaFX 2.0中加载SVG文件

齐奕
2023-03-14
问题内容

我想在javafx 2.0中显示svg图像,但在API中找不到这样的东西。我猜是因为它仍处于测试阶段。

在最终版本发布之前,如何加载svg?是否已经有一个可以处理此问题的库,还是我需要解析自己的文件然后创建相应的形状?

谢谢


问题答案:

根据这个问题的答案,我找到了一个可行的解决方案。

1.包括对蜡染SVG工具包罐的引用

2.实现自己的转码器
(基于此答案由Devon_C_Miller)

class MyTranscoder extends ImageTranscoder {

    private BufferedImage image = null;

    @Override
    public BufferedImage createImage(int w, int h) {
        image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        return image;
    }

    @Override
    public void writeImage(BufferedImage img, TranscoderOutput out) {
    }

    public BufferedImage getImage() {
        return image;
    }

}

3.从您的svg获取BufferedImage
(基于John Doppelmann在此答案中的提示)

String uri = "path_to_svg/some.svg";

MyTranscoder transcoder = new MyTranscoder();
TranscodingHints hints = new TranscodingHints();
hints.put(ImageTranscoder.KEY_WIDTH, 20f); //your image width
hints.put(ImageTranscoder.KEY_HEIGHT, 20f); //your image height
hints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION,    SVGDOMImplementation.getDOMImplementation());
hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI);
hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, SVGConstants.SVG_SVG_TAG);
hints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, false);

transcoder.setTranscodingHints(hints);
TranscoderInput input = new TranscoderInput(url.toExternalForm());
transcoder.transcode(input, null);
BufferedImage bufferedImage = transcoder.getImage();

4.从BufferedImage创建一个InputStream

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

JPEGImageEncoder imageEncoder = JPEGCodec.createJPEGEncoder(outputStream);
imageEncoder.encode(bufferedImage);

byte[] bytes = outputStream.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bytes);

5.将图像添加到您的ImageView

//javafx.scene.image.Image
Image image = new Image(inputStream);
//javafx.scene.image.ImageView
ImageView imageView = new ImageView();
imageView.setImage(image);
this.getChildren().add(imageView);

希望这会有所帮助!



 类似资料:
  • 我在Inkscape中创建了一个SVG图像。我把它和我的类放在同一个目录中。 有没有办法加载该图像并将其转换为SVG路径? 这背后的想法是用< code>getClass()获取图像。getResource("image.svg ")。toExternalForm()并将其转换为< code > imagesvg . set content()方法的SVGPath。之后,我想用< code>but

  • 我有一个有几个按钮的工具栏。我想要几个按钮来加载不同的FXML文件。现在的方法是用Java代码编写fxml文件,并在每次调用时插入它。如果我可以调用FXML文件并获得正确的场景,这将是一个更好的选择。这是我加载设置视图的示例: 我以前使用过tabpane,它的便利之处在于它可以加载“内容”,在某种程度上,它是一个actionlistener,可以加载fxml文件。我希望工具栏按钮具有此功能。 我们

  • 我试图从子文件夹加载fxml,但失败了。我有做替换场景内容的行: 谢谢

  • 问题内容: SVG元素包含一个数据属性()。有时有必要仅从SVG文件加载,解析和提取路径信息。 题 如何从SVG文件加载,解析和提取SVG路径信息? 问题答案: 总览 使用ApacheBatik加载和解析SVG文件。该解决方案在将SVG文件转换为MetaPost的初期阶段显示了Java代码。这应该为如何使用Java从SVG文件中加载,解析和提取内容提供一个总体思路。 图书馆 您将需要以下库: 加载

  • 我需要用PainterSVG编辑svg图片,但是它只加载了.svg文件,我收到的一些文件是.svgz 问题:我如何将那些.svgz文件转换成.svg文件?

  • 在project 从服务器链接(.svg)获取 如何下载该给定url的图标,并使用glide在ImageView中显示它? 现在我用的是这样的: 在哪里有: 还添加了下一个类: SVGDRAWABLE转码器: SvgMoules: SvgSoftwareLayerSetter: 但我也只显示选项<代码>数据。logoUrl不为空,但不显示 UPD: W/Glide:加载失败https://mand