2012-07-03 12 views
5

मैं जावा ग्राफिक्स (सामान्य रूप से कंप्यूटर ग्राफिक्स) और स्टैक ओवरफ़्लो में नया हूं, इसलिए कृपया मेरी मदद करें और मेरी समस्या को बेहतर तरीके से मेरी मदद करें।BufferedImage प्रदर्शित नहीं कर रहा है (सभी काला) लेकिन छवि प्रदर्शित की जा सकती है

फिलहाल, मैं जावा जीयूआई में मूल छवि के साथ एक बुफर्ड इमेज प्रदर्शित करने की कोशिश कर रहा हूं। यह मेरा कोड है:

Image oriImage = robot.getQwerkController().getVideoStreamService().getFrame(); //load the original image 
Graphics2D hi = bufferedImage.createGraphics(); 
hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage 
hi.dispose(); 
images[0].put(oriImage, 1); //draws the original image in the first frame 
images[1].put(bufferedImage, 2); //draws the BufferedImage in the second frame 

और "डाल" समारोह इस प्रकार है:

public synchronized void put(Image image, int frameNumber) { 
    icon.setImage(image); //sets the image displayed by this icon 
    display.paintImageIcon(icon, frameNumber); //paint the image onto the gui 
    imageSet = true; 
    notifyAll(); 
} 

हालांकि, जिसके परिणामस्वरूप जीयूआई के रूप में इस प्रकार है

enter image description here

तो छवि काम करता है , लेकिन BufferedImage नहीं करता है। मुझे लगता है कि यह काम करता है क्योंकि BufferedImage छवि का एक उप-वर्ग है ... कोई विचार? कृपया मुझे बताएं कि अतिरिक्त कोड की जरूरत है जाने ~ अग्रिम :) धन्यवाद

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

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

http://i.imgur.com/rJAdp.jpg

तो यह काम करता है: यहाँ परिणाम है। इसलिए मूल छवि (या रूपांतरण जो हुआ) के साथ कुछ गलत होना चाहिए

संपादित करें 2: मैंने bufferedImage के साथ एक ही चीज़ की और एक रेखा खींची। नतीजा EDIT 1 जैसा ही है, और इसलिए मुझे लगता है कि drawImage फ़ंक्शन के साथ कुछ समस्या है।

संपादित करें 3: मैंने चित्र ड्राइंग को पूरा करने के लिए ड्रॉ इमेज के चारों ओर थोड़ी देर लूप डालकर समस्या को ठीक किया है (क्योंकि यह अभी तक एक छवि को चित्रित नहीं कर रहा है, तो यह झूठा लौटाता है) और यह काम करता है! : डी

boolean x = false; 
while (!x) { 
    x = hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage 
} 
+2

क्या आप कोड को पोस्ट कर सकते हैं कि आप प्रारंभ में 'bufferedImage' ऑब्जेक्ट कैसे बनाते हैं। – cgull

+0

'// मूल छवि लोड करें 'सिंक्रनाइज़ (छवि लोड होने तक प्रतीक्षा करता है) या असीमित रूप से (छवि लोड होने पर कोड जारी रहता है)? बेहतर सहायता के लिए जल्द ही, एक [एसएससीसीई] (http://sscce.org/) पोस्ट करें। –

+0

यदि मैं एक एसएससीसीई पोस्ट कर सकता हूं, तो समस्या यह है कि पूरी परियोजना काफी बड़ी है और बहुत से कोड समस्या के लिए अप्रासंगिक हैं। (अब हम जो छवि प्राप्त कर रहे हैं वह एक वेबकैम से है जो रोबोट पर लोड हो चुकी है) हालांकि मैं कुछ और जानकारी के लिए संपादित करूंगा। धन्यवाद! –

उत्तर

1

आप एक ही परिणाम प्राप्त करने के अगर आप सिर्फ ImageObserver (JFrame या JPanel उदाहरण जिसमें आप ड्राइंग कर रहे हैं) drawImage विधि में बजाय null के पारित सक्षम होना चाहिए। इसके बाद यह आपके लिए एसिंक्रोनस छवि लोडिंग का ख्याल रखेगा।

+0

शांत मैं भी कोशिश करूँगा। धन्यवाद –

0

क्षमा करें, लेकिन मुझे लगता है कि आप तत्काल पेंटिंग (पुश) का उपयोग कर रहे हैं। सामान्य जावा में यह दूसरी तरफ (खींचें) करता है।

जावा स्विंग/अल्ट ड्रॉ इवेंट संचालित: कोई तुरंत छवि नहीं खींचता है, लेकिन कोई इसे अमान्य या पुनर्निर्मित करके ट्रिगर कर सकता है। आप अपनी फ्रेम दर के साथ एक स्विंग टाइमर शुरू कर सकते हैं और वहां repaint() कॉल कर सकते हैं।

सामान्य में एक JPanel बच्चे तो paintComponent(Graphics g) ओवरराइड और g पर आकर्षित कर सकते हैं।

फिर भी यह अजीब है। आप oriImage.getHeight(null) लॉग इन करने का प्रयास कर सकते हैं, यह देखने के लिए कि क्या छवि असीमित रूप से बनाई गई है (शुरुआत में ऊंचाई -1)।

+0

हाँप मुझे कोड प्रलेखन को देखने के बाद यह एहसास हुआ। –

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