Загрузите файл SVG в javafx 2.0

Я хотел бы отобразить изображение svg в javafx 2.0, но я не нахожу такого в API. Я думаю, это потому, что он все еще находится в бета-версии.

До финальной версии, как я могу загрузить svg? Есть ли уже библиотека, которая может справиться с этим, или мне нужно самостоятельно проанализировать файл, а затем создать соответствующие фигуры?

Спасибо


person Mr_Qqn    schedule 28.07.2011    source источник


Ответы (5)


Основываясь на ответе на этот вопрос, я нашел рабочее решение.

<сильный>1. Включите ссылки на файлы jar Batik SVG Toolkit.

<сильный>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. Получите BufferedImage из вашего svg
(на основе подсказки в этот ответ Джона Доппельманна)

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. Создайте InputStream из BufferedImage

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);

Надеюсь, это поможет!

person pmoule    schedule 28.07.2011
comment
Спасибо ! Но разве javafx не обрабатывает необработанные данные изображения? - person Mr_Qqn; 30.07.2011
comment
@Mr_Qqn: В настоящее время я не знаю о какой-либо поддержке обработки необработанных данных изображения. Лично я предпочел бы возможность API конвертировать файлы SVG в код Java, как описано здесь. - person pmoule; 30.07.2011
comment
Но в отличие от скриптов fx классы java компилируются, поэтому я не думаю, что это было бы хорошо. - person Mr_Qqn; 01.08.2011
comment
4. После того, как вы получите буферизованное изображение, вы можете сделать byte[] bytes = bufferedImage.toByteArray(); ByteArrayInputStream inputStream = новый ByteArrayInputStream (байты); Изображение BufferedImage = ImageIO.read(inputStream); Изображение im = SwingFXUtils.toFXImage(image, null); - person Ondrej Kvasnovsky; 22.02.2016

Я использовал ответ @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);

Проще, и это просто работало лучше для меня.

person 8forty    schedule 17.12.2012

Попробуйте http://forums.oracle.com/forums/thread.jspa?threadID=2264379&tstart=0

person Niklas    schedule 05.08.2011

вам не нужен батик, вы можете попробовать 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");
person Chengwen Bo    schedule 09.01.2012

Преобразуйте SVG в FXML, и тогда это станет тривиальным. Преобразование можно выполнить с помощью XSLT. Вы можете получить таблицу стилей отсюда:

http://jayskills.com/blog/2012/06/03/svg-to-fxml-using-netbeans/

Затем после преобразования в FXML вы можете загрузить его как узел с помощью встроенного FXMLLoader:

FXMLLoader.setDefaultClassLoader(this.getClass().getClassLoader());
URL location = KayakMain.class.getResource("path/to/my/resource.fxml");
Parent root = FXMLLoader.load(location);
person swpalmer    schedule 22.08.2012