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.0中加载SVG文件_Java_Svg_Javafx 2 - Fatal编程技术网

在JavaFX2.0中加载SVG文件

在JavaFX2.0中加载SVG文件,java,svg,javafx-2,Java,Svg,Javafx 2,我想在JavaFX2.0中显示svg图像,但在API中找不到这样的东西。我猜是因为它还在测试阶段 在最终发布之前,如何加载svg?是否已经有一个库可以处理这个问题,或者我需要自己解析文件,然后创建相应的形状 谢谢根据问题的答案,我找到了一个有效的解决方案 1。包括对JAR的引用 2。实现您自己的转码器 (根据客户的回答) } 3。从svg获取缓冲区图像 (根据回答中的提示) 4。从BuffereImage创建输入流 ByteArrayOutputStream outputStream = new

我想在JavaFX2.0中显示svg图像,但在API中找不到这样的东西。我猜是因为它还在测试阶段

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

谢谢

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

1。包括对JAR的引用

2。实现您自己的转码器
(根据客户的回答)

}

3。从svg获取缓冲区图像
(根据回答中的提示)

4。从BuffereImage创建输入流

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

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

byte[] bytes = outputStream.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bytes);
5。将图像添加到图像视图中

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

希望这会有帮助

试试看

你不需要蜡染,你可以这样试试WebView:

WebView view = new WebView();
view.setMinSize(500, 400);
view.setPrefSize(500, 400);
final WebEngine eng = view.getEngine();
eng.load("http://127.0.0.1/demo1.svg");

将SVG转换为FXML,然后它就变得微不足道了。转换可以使用XSLT完成。您可以从这里获得样式表:

然后,在转换为FXML后,您可以使用内置FXMLLoader将其作为节点加载:

FXMLLoader.setDefaultClassLoader(this.getClass().getClassLoader());
URL location=KayakMain.class.getResource(“path/to/my/resource.fxml”);
父根=FXMLLoader.load(位置);

我使用了上面@pmoule的答案,但最好用以下内容替换他的步骤3-5:

MyTranscoder imageTranscoder = new MyTranscoder();

imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) width);
imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) height);

TranscoderInput input = new TranscoderInput(new FileReader(file));
imageTranscoder.transcode(input, null);

BufferedImage bimage =  imageTranscoder.getImage();
WritableImage wimage = SwingFXUtils.toFXImage(bimage, null);
ImageView imageView = new ImageView(wimage);
<panel-vbox-whatever>.getChildren().clear();
<panel-vbox-whatever>.getChildren().add(imageView);
MyTranscoder imageTranscoder=新的MyTranscoder();
imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH,(float)WIDTH);
imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_高度,(浮点)高度);
TranscodeInput输入=新的TranscodeInput(新文件读取器(文件));
图像转码器。转码(输入,空);
BuffereImage bimage=imageTranscoder.getImage();
WritableImage wimage=SwingFXUtils.toFXImage(bimage,null);
ImageView ImageView=新的ImageView(图像);
.getChildren().clear();
.getChildren().add(图像视图);

更简单,对我来说效果更好

谢谢!但是javafx不处理原始图像数据吗?@Mr_Qqn:目前我不知道有任何关于处理原始图像数据的支持。就我个人而言,我更喜欢API能够将SVG文件转换为所描述的Java代码。但与fx脚本不同,Java类是编译的,所以我认为这不是一件好事。获取缓冲图像后,可以执行byte[]bytes=buffereImage.toByteArray();ByteArrayInputStream inputStream=新的ByteArrayInputStream(字节);BuffereImage image=ImageIO.read(inputStream);Image im=SwingFXUtils.toFXImage(Image,null);
WebView view = new WebView();
view.setMinSize(500, 400);
view.setPrefSize(500, 400);
final WebEngine eng = view.getEngine();
eng.load("http://127.0.0.1/demo1.svg");
MyTranscoder imageTranscoder = new MyTranscoder();

imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) width);
imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) height);

TranscoderInput input = new TranscoderInput(new FileReader(file));
imageTranscoder.transcode(input, null);

BufferedImage bimage =  imageTranscoder.getImage();
WritableImage wimage = SwingFXUtils.toFXImage(bimage, null);
ImageView imageView = new ImageView(wimage);
<panel-vbox-whatever>.getChildren().clear();
<panel-vbox-whatever>.getChildren().add(imageView);