8

मैं सर्वर पक्ष पर विज़ुअलाइजेशन प्रस्तुत करने के लिए प्रसंस्करण का उपयोग करना चाहता हूं (हेडलेस, कोई GUI)। प्रसंस्करण स्केच स्थैतिक है (यानी एनिमेट नहीं होता है), इसलिए मुझे केवल पहले फ्रेम को पकड़ने की आवश्यकता है, और मैं इस परिणाम को हमारे वेब एप्लिकेशन ऑन-डिमांड के उपयोगकर्ताओं को देना चाहता हूं।एक पीएनजी फ़ाइल में एक प्रसंस्करण स्केच सहेजें, सर्वर-साइड के साथ कोई GUI/डिस्प्ले

मैंने प्रसंस्करण.org मंचों पर थोड़ा सा खोज की है और यह सुझाव दिया गया है कि प्रसंस्करण का उद्देश्य बिना किसी लॉन्च किया जाना है। केवल हैक मैंने देखा है यह एक बिना सिर X11 प्रदर्शन शुरू करने से जुड़े एक है करने के लिए:

Xvfb :2 & 
export DISPLAY=":2" 
./myapp 
killall -9 Xvfb 

.. जो हमारे लिए काम करने के लिए के रूप में हम एक शुद्ध-जावा समाधान करना चाहते हैं नहीं जा रहा है और कर सकते हैं सर्वर-साइड पर हमेशा एक एक्स रेंडरर की गारंटी नहीं देते हैं।

मैं शुद्ध जावा में यह कैसे कर सकता हूं?

उत्तर

1

एक्सवीएफबी जावा रेंडरर से तेज़ होने की संभावना है, और एक हार्डवेयर-त्वरित एक्स सर्वर एक बड़े मार्जिन द्वारा सबसे तेज़ होगा, लेकिन यदि आप 'शुद्ध' जावा समाधान चाहते हैं तो आप Pure Java AWT Toolkit को आजमा सकते हैं।

संपादित करें:

java -Xbootclasspath:JDK/jre/lib/rt.jar:LIB/pja.jar -Dawt.toolkit=com.eteks.awt.PJAToolkit -Djava.awt.graphicsenv=com.eteks.java2d.PJAGraphicsEnvironment -Djava.awt.fonts=JDK/jre/lib/fonts mainclassname args 
+0

प्रसंस्करण.org पर यह 3 साल पुराना धागा कहता है कि पीजेए प्रसंस्करण के साथ संगत नहीं है: http://processing.org/discourse/yabb2/YaBB.pl?num=1193317878। इस पर कोई विचार है कि क्या यह प्रगति पर है या नहीं? – Maciek

+0

जब मुझे यह समस्या हुई तो मैंने बस बुलेट को थोड़ा सा किया और एक्स सर्वर स्थापित किया। यह सबसे तेज़ और सबसे संगत है - और स्थिति को पहले से कहीं अधिक कठिन क्यों बनाते हैं? मेरी कंपनी में हमने एक साल 'शुद्ध जावा' समाधान बनाने की कोशिश की, जिसे हमने खिड़की से बाहर फेंक दिया क्योंकि यह सभी कोने के मामलों से निपट नहीं सका। आपको नौकरी के लिए सही उपकरण का उपयोग करना होगा। मेरा सुझाव है कि यदि आप बॉक्स पर ग्राफिक्स कार्ड नहीं रखते हैं तो आप एक्स, एक्सवीएफबी के लिए जाते हैं। –

+0

Xvfb हमारे लिनक्स सर्वर के लिए ठीक होगा, लेकिन हमारे कुछ विकास बॉक्स विंडोज-आधारित हैं। क्या सिग्विन पर एक्सवीएफबी चलाने के लिए संभव है? – Maciek

1

एक मानक नेतृत्वहीन जावा ऐप्लिकेशन बनाएं, उस में एक PGraphics वस्तु बनाने के (1) और उस पर अपने ड्राइंग कार्यों के सभी प्रदर्शन: यहाँ एक बूट कमांड लाइन उदाहरण here से उठाया है। फिर .save() का उपयोग कर छवि फ़ाइल के रूप में डिस्क पर PGraphics ऑब्जेक्ट को डिस्क पर सहेजें।

1 आपको इसे एक पैल्पलेट से प्राप्त करने की आवश्यकता हो सकती है, मुझे यकीन नहीं है कि आप इसे सीधे बना सकते हैं या नहीं।

कोड इस तरह मोड या उससे कम दिखेगा:

PApplet applet = new PApplet(); 
PGraphics g = applet.createGraphics(200, 400, PApplet.JAVA2D) // same params as size() 
g.beginDraw(); 
g.ellipse // ... etc, your drawing goes here 
g.endDraw(); 
g.save("filename.png"); 
0

Ollie Glass से समाधान काम करने के लिए रह गए हैं क्योंकि PApplet/Applet चेकों के निर्माता है कि क्या पर्यावरण नेतृत्वहीन है या नहीं, अर्थात -Djava.awt.headless=true है।

तो पहले स्थान पर एक वैध वस्तु बनाने का कोई तरीका नहीं है।

इसके बजाय, सीधे अपना PGraphics बनाएं। उदाहरण के लिए, एक PDF

PGraphics pdf = new PGraphicsPDF(); 
pdf.setPrimary(false); 
pdf.setPath(filename); 
pdf.setSize(sizeX, sizeY); 
// pdf.setParent(new PApplet()); This is intentionally NOT called. 

pdf.beginDraw(); 

// draw everything 

pdf.dispose(); 
pdf.endDraw(); 

जोड़ना पाठ में सब कुछ आकर्षित करने के लिए अभी भी एक अपवाद फेंक जाएगा के बाद से अंतर्निहित PGraphics अपने parent (PApplet) के लिए कुछ सहायक तरीकों कहता है। हालांकि, यह सेट नहीं किया गया है क्योंकि हमें पहले स्थान पर PApplet बनाने की अनुमति नहीं है।

इन फ़ंक्शन कॉल से छुटकारा पाने का एक समाधान आपको PGraphicsPDF का अपना संस्करण बना रहा है। उदाहरण के लिए

class MyPGraphicsPDF extends PGraphicsPDF{ 

    @Override 
    public float textAscent() { 
     if (textFont == null) { 
      defaultFontOrDeath("textAscent"); 
     } 

     Font font = (Font) textFont.getNative(); 
     //if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) { 
     if (font != null) { 
      FontMetrics metrics = this.getFontMetrics(font); 
      return metrics.getAscent(); 
     } 
     return super.textAscent(); 
     } 

    @Override 
     public float textDescent() { 
     if (textFont == null) { 
      defaultFontOrDeath("textDescent"); 
     } 
     Font font = (Font) textFont.getNative(); 
     //if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) { 
     if (font != null) { 
      FontMetrics metrics = this.getFontMetrics(font); 
      return metrics.getDescent(); 
     } 
     return super.textDescent(); 
     } 

    public FontMetrics getFontMetrics(Font font) { 
     FontManager fm = FontManagerFactory.getInstance(); 
     return sun.font.FontDesignMetrics.getMetrics(font); 
    } 
} 

textAscent() और textDescent() ना बुलाने की गैर मौजूदा parentPApplet से getFontMetrics(Font font) के परिवर्तन के साथ PGraphics से कोड की प्रतियां हैं। इसके बजाय दोनों तीसरे विधि पर रीडायरेक्ट करते हैं जो PApplet की लापता सहायक विधि को java.awt.Component.getFontMetrics(Font font) के थोड़ा छोटे संस्करण के रूप में दोहराता है।

उम्मीद है कि मदद करता है।

ड्राइंग बोर्ड के रूप में स्पष्ट रूप से फ़ाइल के लिए कॉल करते समय प्रसंस्करण का देशी हेडलेस संस्करण होना अच्छा लगेगा।