在javafx 2.0中加载SVG文件

Mr_*_*Qqn 4 java svg javafx-2

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

直到最终版本,我如何加载svg?是否已经有一个可以处理它的库,或者我需要解析自己的文件然后创建相应的形状?

谢谢

pmo*_*ule 8

根据这个问题的答案,我找到了一个有效的解决方案.

1.包括对Batik SVG Toolkit jar的引用

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;
    }
Run Code Online (Sandbox Code Playgroud)

}

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();
Run Code Online (Sandbox Code Playgroud)

4.从BufferedImage创建一个InputStream

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

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

byte[] bytes = outputStream.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bytes);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!