2012-04-10 13 views
7

BufferedImage के प्रत्येक पिक्सेल के आरजीबी मान को प्राप्त करने का सबसे तेज़ तरीका क्या है?बुफर्ड छवि के प्रत्येक पिक्सेल के लिए आरजीबी मान प्राप्त करने के लिए तेज़ तरीका चाहिए

अभी मुझे नीचे दिए गए कोड में दिखाए गए दो for लूप का उपयोग करके आरजीबी मूल्य प्राप्त हो रहा है, लेकिन उन मानों को प्राप्त करने में बहुत लंबा समय लगता है क्योंकि नेस्टेड लूप मेरी छवि के लिए कुल 47 99 99 बार चलाता है। अगर मैं 16-बिट छवि का उपयोग करता हूं तो यह संख्या भी अधिक होगी!

मुझे पिक्सेल मान प्राप्त करने के लिए एक तेज़ तरीका चाहिए।

BufferedImage bi=ImageIO.read(new File("C:\\images\\Sunset.jpg")); 

int countloop=0; 

for (int x = 0; x <bi.getWidth(); x++) { 
    for (int y = 0; y < bi.getHeight(); y++) { 
     Color c = new Color(bi.getRGB(x, y)); 
     System.out.println("red=="+c.getRed()+" green=="+c.getGreen()+" blue=="+c.getBlue()+" countloop="+countloop++);                                     
    } 
} 
+0

पाया सरणी से बाहर अलग-अलग रंगों को पढ़ने के लिए 'यह और भी बढ़ सकता है जब मैं 16 बिट image' का उपयोग करेगा - क्यों होगा पुनरावृत्तियों की संख्या प्रति पिक्सल बिट्स पर निर्भर करती है? और इसके लिए उपयोग का मामला क्या है? ध्यान दें कि 'रंग' ऑब्जेक्ट्स बनाने के साथ-साथ कंसोल को प्रिंट करने में कुछ समय लगता है। यदि आप सभी 47 99 99 पिक्सल तक पहुंचना चाहते हैं तो आप लूप से छुटकारा नहीं पा सकते हैं (आप उन्हें एक में विलय कर सकते हैं लेकिन इससे बड़ा अंतर नहीं होना चाहिए)। – Thomas

+2

आउटपुट पूरे लूपिंग को धीमा कर देता है। इसके बिना कोशिश करो। –

+2

यह println –

उत्तर

12

मैं अगर यह मदद कर सकता है और मैं अभी तक यह परीक्षण नहीं किया है, लेकिन आप rgb मूल्यों इस तरह से प्राप्त कर सकते हैं पता नहीं है:

BufferedImage bi=ImageIO.read(new File("C:\\images\\Sunset.jpg")); 
int[] pixel; 

for (int y = 0; y < bi.getHeight(); y++) { 
    for (int x = 0; x < bi.getWidth(); x++) { 
     pixel = bi.getRaster().getPixel(x, y, new int[3]); 
     System.out.println(pixel[0] + " - " + pixel[1] + " - " + pixel[2] + " - " + (bi.getWidth() * y + x)); 
    } 
} 

आप देख सकते हैं आप एक प्रारंभ करने की जरूरत नहीं है लूप के अंदर नया रंग। मैंने पहले से मौजूद डेटा से काउंटर पुनर्प्राप्त करने के लिए ऑनमेस द्वारा सुझाए गए चौड़ाई/ऊंचाई लूप को भी उलटा कर दिया है।

2

आप BufferedImage.getRGB(int, int ,int ,int, int[] , int , int) कोशिश की:

यहाँ कोड मैं वर्तमान के साथ काम करने की कोशिश कर रहा हूँ?

कुछ की तरह:

int[] rgb = bi.getRGB(0,0, bi.getWidth(), bi.getHeight(), new int[bi.getWidth() * bi.getHeight(), bi.getWidth()]) 

कोशिश नहीं था, इसलिए यह सुनिश्चित नहीं करता है, तो यह तेजी से है।

संपादित करें कोड देखने के बाद, शायद यह नहीं है, लेकिन एक शॉट के लायक है।

3

आपको बाहरी लूप और आंतरिक कॉलम में पंक्तियों को लूप करना चाहिए। इस तरह आप कैश मिस से बचेंगे।

+2

क्या वह ऐसा नहीं कर रहा है जो वह पहले से कर रहा है? – Singh

5

व्यक्ति getRGB के दशक में के एक झुंड से बदल रहा है एक बड़ा getRGB के एक सरणी, निष्पादन समय 3,200 मिलीसेकंड करने के लिए 33,000 मिलीसेकेंड से परिमाण के एक आदेश से गिरा में पूरे चित्र की प्रतिलिपि बनाने, जबकि समय सारिणी निर्मित तक था केवल 31 मिलीसेकंड।

इसके बारे में कोई संदेह नहीं है, एक सरणी में एक बड़ा पढ़ा जाता है और सरणी की सीधी अनुक्रमणिका कई व्यक्तिगत पढ़ने से कहीं अधिक तेज़ है।

प्रदर्शन अंतर वर्ग के अंत में ब्रेकपॉइंट स्टेटमेंट के उपयोग से संबंधित प्रतीत होता है। जबकि ब्रेकपॉइंट लूप के बाहर था, कक्षा के भीतर कोड की प्रत्येक पंक्ति ब्रेकपॉइंट के लिए जांच की जाती है। व्यक्तिगत हो जाने से गति में सुधार नहीं होता है।

चूंकि कोड अभी भी सही है, इसलिए शेष का उत्तर अभी भी उपयोग में है।

पुराने बयान

colorRed=new Color(bi.getRGB(x,y)).getRed(); 

पढ़ें बयान एक सरणी

int[] rgbData = bi.getRGB(0,0, bi.getWidth(), bi.getHeight(), 
       null, 0,bi.getWidth());   

getRGB में एक सा चित्र की प्रतिलिपि बनाने एक सरणी में एक सारिणी का तत्व में सभी 3 रंग मान डालता है, इसलिए अलग-अलग रंगों को पढ़ने घूर्णन और एक "और" द्वारा निकाला जाना चाहिए। वाई समन्वय छवि की चौड़ाई से गुणा किया जाना चाहिए।

कोड

colorRed=(rgbData[(y*bi.getWidth())+x] >> 16) & 0xFF; 

colorGreen=(rgbData[(y*bi.getWidth())+x] >> 8) & 0xFF; 

colorBlue=(rgbData[(y*bi.getWidth())+x]) & 0xFF; 
0

मैं एक समाधान यहाँ https://alvinalexander.com/blog/post/java/getting-rgb-values-for-each-pixel-in-image-using-java-bufferedi

BufferedImage bi = ImageIO.read(new File("C:\\images\\Sunset.jpg")); 

for (int x = 0; x < bi.getWidth(); x++) { 
    for (int y = 0; y < bi.getHeight(); y++) { 
     int pixel = bi.getRGB(x, y); 
     int red = (pixel >> 16) & 0xff; 
     int green = (pixel >> 8) & 0xff; 
     int blue = (pixel) & 0xff; 
     System.out.println("red: " + red + ", green: " + green + ", blue: " + blue);                                     
    } 
} 
+0

क्या यह एक तेज़ एल्गोरिदम है? –

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

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