在JavaFX2.0中加载SVG文件
我想在JavaFX2.0中显示svg图像,但在API中找不到这样的东西。我猜是因为它还在测试阶段 在最终发布之前,如何加载svg?是否已经有一个库可以处理这个问题,或者我需要自己解析文件,然后创建相应的形状 谢谢根据问题的答案,我找到了一个有效的解决方案 1。包括对JAR的引用 2。实现您自己的转码器在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
(根据客户的回答) } 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);