मैं कई जवाब देख सकता हूं, ओपी के तीन सवालों को संबोधित नहीं कर रहा हूं।
1) प्रदर्शन पर एक शब्द: बाइट सरणियों की संभावना कम होती है जब तक कि आप एक सटीक पिक्सेल बाइट ऑर्डर का उपयोग नहीं कर सकते हैं जो आपके प्रदर्शन एडेप्टर वर्तमान रिज़ॉल्यूशन और रंग की गहराई से मेल खाता है।
सबसे अच्छा ड्राइंग प्रदर्शन प्राप्त करने के लिए, बस अपनी छवि को बफ़रेडइमेज में परिवर्तित करें जो आपके वर्तमान ग्राफिक्स कॉन्फ़िगरेशन के अनुरूप प्रकार के साथ उत्पन्न होती है। CreateCompatibleImage को https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html पर देखें
इन छवियों को किसी भी प्रोग्रामिंग प्रयास के बिना कुछ समय ड्राइंग के बाद डिस्प्ले कार्ड मेमोरी पर स्वचालित रूप से कैश किया जाएगा (यह जावा 6 के बाद से स्विंग में मानक है), और इसलिए वास्तविक ड्राइंग समय की नगण्य राशि लेगा - यदि आपने छवि नहीं बदली है ।
छवि को बदलना मुख्य मेमोरी और GPU मेमोरी के बीच एक अतिरिक्त मेमोरी ट्रांसफर के साथ आएगा - जो धीमा है। इस छवि को बफ़र किए गए "बफ़रिंग" से बचें इसलिए, हर तरह से गेटपिक्सल और सेटपिक्सल करने से बचें।
उदाहरण के लिए, यदि आप एक गेम विकसित कर रहे हैं, तो सभी गेम एक्टर्स को बफ़रेडइमेज में और फिर जेपीनेल को ड्रॉ करने के बजाय, सभी एक्टर्स को छोटे बफ़रमैजेस के रूप में लोड करना और उन्हें अपने जेपीनेल कोड में एक के बाद एक ड्रॉ करना बहुत तेज़ है। उनकी उचित स्थिति - इस तरह कैशिंग के लिए छवियों के प्रारंभिक हस्तांतरण को छोड़कर मुख्य मेमोरी और GPU मेमोरी के बीच कोई अतिरिक्त डेटा स्थानांतरण नहीं है।
ImageIcon हुड के तहत एक बफ़रडैमेज का उपयोग करेगा - लेकिन मूल रूप से उचित ग्राफिक्स मोड के साथ एक बफ़रेडआईमेज आवंटित करना कुंजी है, और यह अधिकार करने का कोई प्रयास नहीं है।
2) ऐसा करने का सामान्य तरीका JPanel की एक ओवरराइड पेंटकंपोनेंट विधि में एक बफ़रडैमेज खींचना है। हालाँकि, Java एक अतिरिक्त मात्रा में अतिरिक्त अच्छाइयों का समर्थन करता है, जैसे कि GPU मेमोरी में कैश की जाने वाली VolatileImages को नियंत्रित करने वाली बफर चेन, इनमें से किसी का भी उपयोग करने की आवश्यकता नहीं है क्योंकि Java 6, जो GPU त्वरण के इन सभी विवरणों को उजागर किए बिना यथोचित अच्छा काम करता है।
ध्यान दें कि GPU त्वरण कुछ संचालन के लिए काम नहीं कर सकता है, जैसे पारभासी छवियों को खींचना।
3) न जोड़ें। जैसा कि ऊपर बताया गया है, बस उसे पेंट करें:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
"जोड़ना" समझ में आता है अगर छवि लेआउट का हिस्सा है। यदि आपको JPanel को भरने वाली पृष्ठभूमि या अग्रभूमि छवि के रूप में इसकी आवश्यकता है, तो बस PaintComponent में ड्रा करें। यदि आप जेनेरिक स्विंग घटक को पीना पसंद करते हैं जो आपकी छवि दिखा सकता है, तो यह एक ही कहानी है (आप एक JComponent का उपयोग कर सकते हैं और इसकी PaintComponent विधि को ओवरराइड कर सकते हैं) - और फिर इसे GUI घटकों के अपने लेआउट में जोड़ें ।
4) सरणी को बफर्डिमेज में कैसे बदलें
अपने बाइट सरणियों को पीएनजी में परिवर्तित करना, फिर इसे लोड करना काफी संसाधन गहन है। एक बेहतर तरीका यह है कि आप अपने मौजूदा बाइट को बफ़रमैजेज में बदल दें।
उसके लिए: लूप और कॉपी पिक्सल के लिए उपयोग न करें । यह बहुत धीमी गति से होता है। बजाय:
- BufferedImage की पसंदीदा बाइट संरचना सीखें (आजकल यह RGB या RGBA मानने के लिए सुरक्षित है, जो कि आपके पिक्सेल से 4 बाइट्स है)
- स्कैनलाइन सीखें और उपयोग में स्कैन करें (जैसे कि आपके पास 142 पिक्सेल चौड़ी छवि हो सकती है - लेकिन वास्तविक जीवन में जो 256 पिक्सेल चौड़ी बाइट सरणी के रूप में संग्रहीत की जाएगी क्योंकि यह तेजी से संसाधित करने के लिए है और जीपीयू हार्डवेयर द्वारा अप्रयुक्त पिक्स को मुखौटा कर सकता है। )
- एक बार जब आपके पास इन सिद्धांतों के अनुसार एक सरणी निर्माण होता है, तो बफ़रेडइमेज की सेटआरजीबी एरे विधि आपके एरे को बफ़रेडइमेज में कॉपी कर सकती है।
MemoryImageSource
उन्हें जेपीईजी या पीएनजी प्रारूप में परिवर्तित करने की तुलना में उपयोग करने के लिए अधिक कुशल हो सकता है और फिरImageIO
अधिकांश उत्तरों के साथ पढ़ सकते हैं। आप उपयोग करके अपनी छवि डेटा के साथImage
एकMemoryImageSource
निर्माण से प्राप्त कर सकते हैंcreateImage
, और एक उत्तर में सुझाए अनुसार प्रदर्शित कर सकते हैं।