svg - जावाएफएक्स 2.2 में एसवीजी छवि




javafx batik (2)

मैं JavaFX 2.2 में नया हूं और अभी तक मुझे अपने जावाएफएक्स 2.2 एप्लिकेशन में एसवीजी छवियों को प्रदर्शित करने का कोई तरीका नहीं मिला। मैंने बटिक पर एक नज़र डाली, लेकिन यह मेरे लिए चाल नहीं करता क्योंकि यह javafx.ImageView परिवर्तित हो जाता है, न कि javafx.ImageView

जावाएफएक्स एप्लिकेशन में एसवीजी छवि प्रदर्शित करने का कोई तरीका है? या आप जावाएफएक्स से कम से कम एक एसवीजी छवि निर्यात कर सकते हैं? क्या कार्य Node.snapshot() किसी भी तरह से मदद करता है?


जावाएफएक्स एप्लिकेशन में एसवीजी छवि प्रदर्शित करने का कोई तरीका है?

यहां कुछ विकल्प दिए गए हैं:

  1. WebView बनाएं और svV छवि को WebView के WebEngine में load करें।
  2. e(fx)clipse प्रोजेक्ट में एक एसजीजी को एफएक्सएमएल कनवर्टर (लिंक अब मृत :() शामिल है।
  3. यह नेटबीन प्लगइन भी svg को fxml में परिवर्तित करता है (लिंक अब मृत :()।
  4. आप Batik या svgsalamander जैसे एक awt आधारित लाइब्रेरी का उपयोग कर सकते हैं और परिणामस्वरूप BufferedImage को JavaFX छवि में परिवर्तित कर सकते हैं।
  5. SVGPath 2.2 में मूल रूप से कुछ न्यूनतम SVGPath स्ट्रिंग्स (पूर्ण एसवीजी स्पेक नहीं) के लिए समर्थन शामिल है।
  6. आप एक कनवर्टर लिख सकते हैं जो जावाएफएक्स कैनवास GraphicsContext कॉन्टेक्स्ट कमांड का उपयोग करते हुए एसवीजी प्रस्तुत करता है।
  7. FranzXaver एक FranzXaver प्रदान करता है, जिसका उपयोग इसका जवाब में दिखाया गया है: जावाएफएक्स पर एक बटन में लोड एसवीजी फ़ाइल

या आप कम से कम एक एसवीजी छवि javafx से निर्यात कर सकते हैं?

यह सुविधा जावाएफएक्स सीनग्राफ की तरह एसवीजी कनवर्टर की तरह लगता है। हालांकि यह सैद्धांतिक रूप से संभव है, मुझे पता नहीं है कि किसी ने अभी तक ऐसा टूल बनाया है।

क्या कार्य Node.snapshot () किसी भी तरह से मदद करता है?

Node.snapshot() दृश्य ग्राफ से एक एसवीजी छवि निर्यात करने में मदद नहीं करेगा क्योंकि svg एक वेक्टर आधारित प्रारूप है और एक नोड स्नैपशॉट थोड़ा मैप प्रारूप है।

मैंने बटिक पर एक नज़र डाली, लेकिन यह मेरे लिए चाल नहीं करता क्योंकि यह बुफर्ड इमेज में परिवर्तित हो जाता है, न कि javafx.ImageView।

आप SwingFXUtils का उपयोग कर SwingFXUtils BufferedImages और javafx छवियों के बीच आसानी से परिवर्तित कर सकते हैं।

प्रदर्शन के संदर्भ में - आप किस तरह से सिफारिश करेंगे?

जटिल एसवीजी के लिए, fxml से प्रतिपादन के बजाय, आपको शायद बिटमैप छवि या कैनवास ग्राफिक्स संदर्भ में बेहतर प्रदर्शन प्रतिपादन मिलेगा। ऐसा इसलिए है क्योंकि आपका दृश्य ग्राफ बहुत कम नोड्स के साथ बहुत आसान हो जाएगा - जिसका अर्थ है कि जावाफक्स रनटाइम के पास बहुत कम काम होगा। सरल svgs (<1000 नोड जेनरेट) के लिए, शायद यह बहुत अधिक मायने रखता नहीं है।

Javafx.scene.shape.SVGPath के उदाहरण बनाने के बारे में एक एसवीजी को एक एफएक्सएमएल में परिवर्तित कर रहा है?

आंशिक रूप से। पूर्ण एसवीजी विनिर्देश बुनियादी आकारों की तुलना में अधिक जमीन को कवर करता है । इसके अलावा ग्रेडियेंट, प्रभाव, एनिमेशन, आदि एक एसवीजी द्वारा किया जा सकता है। इसलिए यदि स्रोत एसवीजी छवि में उन अतिरिक्त वस्तुओं को शामिल किया गया है, तो उन्हें एफएक्सएमएल में परिवर्तित करने की भी आवश्यकता है (जैसा कि वे सबसे अच्छे हो सकते हैं, एसवीजी के कुछ पहलू होंगे जैसे स्क्रिप्टिंग जो एफएक्सएमएल में अनुवाद करना मुश्किल होगा)।

मेरा अनुमान है कि एसवीजी विनिर्देश का आकार और जटिलता कारणों में से एक है कि पूर्ण एसवीजी छवि प्रणाली के लिए कोई प्रत्यक्ष समर्थन जावाएफएक्स कोर एपीआई में वर्तमान में शामिल नहीं है और इसके बजाय, केवल समान कार्यक्षमता जैसे एसवीजीपीएथ की पेशकश की जाती है। अन्य वांछनीय वस्तुओं की तुलना में जावाएफएक्स कोर एपीआई में मूल रूप से एसवीजी लागू करना अपेक्षाकृत कम इनाम के लिए उच्च लागत होगी।

यदि ऐसा है, तो # 2 (और # 3) और # 5 समान नहीं होंगे?

नहीं। # 2 और # 3 में संदर्भित नेटबीन और ग्रहण उपकरण # 5 में उल्लिखित एसवीजीपीएथ सुविधाओं की तुलना में अधिक कार्यात्मक थे, क्योंकि उन उपकरणों ने एसवीजी विनिर्देश के अतिरिक्त पहलुओं को FXML समकक्षों (जैसे ग्रेडियेंट, प्रभाव और परिवर्तन) में परिवर्तित किया।


जावाएफएक्स + बटिक + कस्टम ट्रांसकोडर

चूंकि मुझे कहीं भी जावाफैक्स के साथ बटिक का उपयोग करने का पूरा उदाहरण नहीं मिला है, इसलिए मैं नीचे एक पूरा समाधान प्रदान कर रहा हूं।

ध्यान दें कि मैंने ब्रेवटी के लिए अपवाद हैंडलिंग (उदाहरण के लिए TranscoderException अपवाद) को हटा दिया है।
आप यहां पूर्ण कोड तक पहुंच सकते हैं: https://gist.github.com/ComFreek/b0684ac324c815232556

  1. एक बुफेक के साथ एक एसवीजी फ़ाइल को बुफर्ड इमेज में बदलने के लिए, आपको एक कस्टम ट्रांसकोडर लागू करना होगा:

    /**
     * Many thanks to bb-generation for sharing this code!
     * @author bb-generation
     * @link http://bbgen.net/blog/2011/06/java-svg-to-bufferedimage/
     * @link In case the link above is still down: https://web.archive.org/web/20131215231214/http://bbgen.net/blog/2011/06/java-svg-to-bufferedimage/
     */
    
    public class BufferedImageTranscoder extends ImageTranscoder {
    
        private BufferedImage img = null;
    
        @Override
        public BufferedImage createImage(int width, int height) {
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            return bi;
        }
    
        @Override
        public void writeImage(BufferedImage img, TranscoderOutput to) throws TranscoderException {
            this.img = img;
        }
    
        public BufferedImage getBufferedImage() {
            return img;
        }
    }
    
  2. BufferedImage ऑब्जेक्ट उत्पन्न करने के लिए ट्रांसकोडर का उपयोग करें:

    BufferedImageTranscoder trans = new BufferedImageTranscoder();
    
    // file may be an InputStream.
    // Consult Batik's documentation for more possibilities!
    TranscoderInput transIn = new TranscoderInput(file);
    
    trans.transcode(transIn, null);
    
  3. BufferedImage ऑब्जेक्ट को किसी Image ऑब्जेक्ट (JavaFX से) में कनवर्ट करें:

    // Use WritableImage if you want to further modify the image (by using a PixelWriter)
    Image img = SwingFXUtils.toFXImage(trans.getBufferedImage(), null);
    
  4. अंत में अपनी ImageView में पहले प्राप्त ऑब्जेक्ट असाइन करें:

    imgView.setImage(img);
    




batik