2010-03-02 13 views
9

मैं निम्नलिखित कोड के साथ बनाया एक पारदर्शी BufferedImage है (प्रासंगिक नहीं है कि यह कैसे बनाया जाता है, मुझे लगता है कि):साफ़ एक पारदर्शी BufferedImage के रूप में संभव

  GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      GraphicsDevice gs = ge.getDefaultScreenDevice(); 
      GraphicsConfiguration gc = gs.getDefaultConfiguration(); 

      Rectangle screen = transformationContext.getScreen(); 

      // Create an image that supports transparent pixels 
      return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(), 
        Transparency.BITMASK); 

मैं छवि कैसे मिटाएं (में खाली छवि उसी स्थिति को बनाया गया था) छवि को पुनर्निर्माण किए बिना सबसे तेज़ तरीके से संभव है? छवि को दोबारा बनाने से जीसी पर बोझ पड़ता है, वीएम को रोक दिया जाता है और यूआई को ठंडा कर दिया जाता है।

उत्तर

16

समझ गया :) पारदर्शी रंग भरने के बजाय clearRect का उपयोग किया गया।

  graphics = (Graphics2D) offlineBuffer.getGraphics(); 
      graphics.setBackground(new Color(255, 255, 255, 0)); 
      Rectangle screen = transformationContext.getScreen(); 
      graphics.clearRect(0,0, (int)screen.getWidth(), (int)screen.getHeight()); 
+4

'clearRect' को 1.1 के बाद से बहिष्कृत कहा जाता है हालांकि इसे इस तरह टैग नहीं किया गया है (शायद क्योंकि एनोटेशन अभी तक मौजूद नहीं है?)। पसंदीदा तरीका अब है: 'graphics.setComposite (AlphaComposite.Clear); graphics.fillRect (0, 0, आकार, SIZE); graphics.setComposite (AlphaComposite.SrcOver); '(मान लें कि SrcOver संयुक्त था जिसे आपने पहले उपयोग किया था, और डिफ़ॉल्ट है) यह वास्तव में' clearRect' के कार्यान्वयन के करीब है। –

+0

जावा दस्तावेज़ में कोई बहिष्करण टैग नहीं है, इसलिए मुझे लगता है कि यह अभी भी मान्य है –

+0

@ adrian.tarau यही वह है जिसका वह संदर्भ दे रहा है; एनोटेशन। Javadocs स्वचालित रूप से उत्पन्न होते हैं; चूंकि '@ बहिष्कृत' एनोटेशन कोड में नहीं है (यह अभी तक अस्तित्व में नहीं था) तो यह javadocs में नहीं था। – Qix

9

एक अपेक्षाकृत तेज़ तरीका है, लेकिन मुझे नहीं पता कि यह सबसे तेज़ है (और मैं अन्य उत्तरों देखना चाहता हूं) एक और तस्वीर है जिसे आप कभी संशोधित नहीं करते हैं और यह हमेशा पूरी तरह से "पूरी तरह से साफ़" होता है पारदर्शी "और फिर आप एक रेखापुंज नकल करते हैं, आप नामित कि स्पष्ट प्रतिलिपि कहते हैं:

imageYouWantToClear.setData(CLEAR.getRaster()); 

ध्यान दें कि ग्राफिक्स के साथ काम करने के लिए बहुत मुश्किल हो सकता है जब यह प्रदर्शन की बात आती है, क्योंकि वहाँ के एक बहुत हैं नहीं-बहुत-अच्छी तरह से दस्तावेज व्यवहार। उदाहरण के लिए आपकी छवियां (स्पष्ट एक कहें) हार्डवेयर-त्वरित हो सकता है लेकिन जैसे ही आप एक उत्परिवर्तन विधि का उपयोग करेंगे (जैसे setRgb()) और यह साबित होगा कि आप हार्डवेयर-त्वरण खो देंगे यह समझना बहुत मुश्किल है कि आपने हार्डवेयर त्वरण का लाभ खो दिया है।

मुझे लगता है कि प्रदर्शनकर्ता BufferedImage के विषय पर इंफोस खोजने का सबसे अच्छा स्थान जावा गेम-प्रोग्रामर और जावा गेम-एपीआई-प्रोग्रामर समुदाय/मंचों में होगा।

Btw

सुनिश्चित करें कि दोनों अपने BufferedImage 'संगत' मोड उपयोग कर रहे हैं: TYPE_INT_ARGB विंडोज पर ठीक हो सकता है लेकिन ओएस एक्स, आदि पर नहीं है ताकि आप उन्हें की तरह कुछ कर रही है बनाना चाहते हैं:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); 

ओच लॉ-ऑफ-डेमेटर दर्द होता है, धन्यवाद जावा;)

+0

धन्यवाद WizardOfOdds लेकिन एक और छवि (जो जब "सक्रिय" छवि क्योंकि सीमा बदलने से निर्मित किया गया है निर्मित करने की आवश्यकता है) स्मृति के उपयोग में वृद्धि होगी रखते हुए (1600x1200 स्क्रीन संकल्प के बारे में सोच)। clearRect चाल करता है और यह बहुत तेज़ लगता है। –

संबंधित मुद्दे