2010-12-06 13 views
5

मैंने एक प्रोग्राम लिखा है जो 'फोटो' लेता है और प्रत्येक पिक्सेल के लिए यह अन्य फ़ोटो की एक श्रृंखला से एक छवि डालने का विकल्प चुनता है। चुनी गई छवि वह तस्वीर है जिसकी औसत रंग तस्वीर से मूल पिक्सेल के सबसे नज़दीक है।एक छवि फ़ाइल में शामिल

मैंने इसे 'स्टॉक' छवि में प्रत्येक पिक्सेल से आरजीबी मूल्यों का औसत से पहले किया है और फिर इसे सीआईई एलएबी में परिवर्तित कर दिया है, इसलिए मैं गणना कर सकता हूं कि मानव धारणा के संदर्भ में प्रश्न में पिक्सेल के करीब 'करीबी' रंग का

मैंने तब एक छवि संकलित की है जहां मूल 'फोटो' छवि में प्रत्येक पिक्सेल को 'निकटतम' स्टॉक छवि के साथ बदल दिया गया है।

यह अच्छी तरह से काम करता है और प्रभाव अच्छा है हालांकि स्टॉक छवि का आकार 300 से 300 पिक्सेल है और यहां तक ​​कि "-Xms2048m -Xmx2048m" की आभासी मशीन झंडे के साथ भी, जो मुझे पता है, 555px पर 540px छवि I पर हास्यास्पद है। स्मृति त्रुटि से बाहर निकलने से पहले केवल 50 पीएक्स तक स्केल किए गए स्टॉक छवियों को प्रतिस्थापित कर सकते हैं।

तो मूल रूप से मैं समाधानों के बारे में सोचने की कोशिश कर रहा हूं। सबसे पहले मुझे लगता है कि मूल छवि के प्रत्येक 4 पिक्सल (2x2 वर्ग) को एक पिक्सल में औसत छवि प्रभाव के साथ ही बदल दिया जा सकता है और फिर इस पिक्सेल को छवि के साथ बदल दिया जा सकता है, इस प्रकार छोटी तस्वीर व्यक्तिगत प्रिंट में अधिक दिखाई देगी । इससे मुझे स्टॉक छवियों को बड़े आकार में आकर्षित करने की अनुमति भी मिलनी चाहिए। क्या किसी को इस तरह के छवि कुशलता में कोई अनुभव है? यदि ऐसा है तो आपने एक अच्छी छवि बनाने के लिए किस चाल की खोज की है।

आखिरकार मुझे लगता है कि स्मृति त्रुटियों को कम करने का तरीका छवि को डिस्क पर बार-बार सहेजना होगा और छवियों की अगली पंक्ति को स्मृति में जोड़ना होगा जबकि लगातार स्मृति से प्रस्तुत छवियों के पुराने सेट को हटा देना होगा। यह कैसे किया जा सकता है? क्या यह एक सामान्य फ़ाइल को जोड़ने के समान है।

इस अंतिम मामले में कोई भी मदद की सराहना की जाएगी।

धन्यवाद,

एलेक्स

उत्तर

3

मैं जावा उन्नत इमेजिंग (जेएआई) एपीआई में देखने का सुझाव देता हूं। आप शायद BufferedImage का उपयोग कर रहे हैं, जो स्मृति में सबकुछ रखता है: स्रोत छवियों के साथ-साथ आउटपुट छवियां। इसे "तत्काल मोड" प्रसंस्करण के रूप में जाना जाता है। जब आप छवि का आकार बदलने के लिए एक विधि कहते हैं, तो यह तुरंत होता है। नतीजतन, आप अभी भी स्टॉक छवियों को स्मृति में रखते हैं।

जेएआई के साथ, आप दो लाभ उठा सकते हैं जिनका लाभ उठा सकते हैं।

  1. डिफरर्ड मोड प्रोसेसिंग।
  2. टाइल गणना।

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

यह एपीआई पुल-आधारित है। यह कुछ आउटपुट एक्शन ऑपरेटर से पिक्सल खींचता है जब तक गणना गणना करता है। यह अनावश्यक पिक्सेल संचालन से बचकर समय और स्मृति को बचाने में मदद करता है।

उदाहरण के लिए, मान लीजिए कि आपको आउटपुट छवि की आवश्यकता है जो 2048 x 2048 पिक्सेल है, जो स्रोत छवि के बाहर 512x512 फसल से 1600x512 पिक्सेल है। जाहिर है, पिक्सेल के 2/3 को फेंकने के लिए, पूरी 1600x512 स्रोत छवि को स्केल करने का अर्थ नहीं है। इसके बजाए, स्केलिंग ऑपरेटर के पास आउटपुट आयामों के आधार पर "रुचि का क्षेत्र" (आरओआई) होगा। स्केलिंग ऑपरेटर आरओआई को स्रोत छवि पर प्रोजेक्ट करता है और केवल उन पिक्सल की गणना करता है।

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

कुछ मामलों में, आप जेएआई का दूसरा लाभ रख सकते हैं, जो टाइल आधारित प्रतिपादन है। जबकि BufferedImage अपने सभी काम तुरंत, सभी पिक्सल में करता है, टाइल प्रतिपादन एक समय में छवि के आयताकार खंडों पर काम करता है।

पहले से उदाहरण का उपयोग करके, 2048x2048 आउटपुट छवि टाइल्स में टूट जाएगी। मान लीजिए ये 256x256 हैं, तो पूरी छवि 64 टाइल्स में टूट जाती है। जैई ऑपरेटर ऑब्जेक्ट्स जानते हैं कि टाइल पर टाइल कैसे काम करें। इसलिए, स्रोत छवि के 512x512 खंड को स्केल करना वास्तव में 64x64 स्रोत पिक्सेल पर 64 बार होता है।

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

इनमें से सभी एक लंबी दूरी की व्याख्या है कि आप इस प्रकार की छवि प्रसंस्करण के लिए जेएआई का उपयोग क्यों करना चाहते हैं।


नोट्स और प्रतिवाद के एक जोड़े:

  1. आप अनजाने टाइल आधारित प्रतिपादन को हराने कर सकते हैं। वर्कस्ट्रीम में कहीं भी आपको BufferedImage मिला है, यह टाइल स्रोत या सिंक के रूप में कार्य नहीं कर सकता है।
  2. यदि आप जेपीईजी के लिए जेएआई या जेआई छवि I/O ऑपरेटरों का उपयोग कर डिस्क में प्रस्तुत करते हैं, तो आप अच्छे आकार में हैं। यदि आप जेडीके की अंतर्निहित छवि कक्षाओं का उपयोग करने का प्रयास करते हैं, तो आपको सभी मेमोरी की आवश्यकता होगी। (मूल रूप से, दो प्रकार के छवि मैनिपुलेशन को मिश्रण करने से बचें। तत्काल मोड और स्थगित मोड अच्छी तरह से मिश्रण नहीं करते हैं।)
  3. आरओआई, टाइल्स और स्थगित मोड के साथ सभी फैंसी सामान प्रोग्राम के लिए पारदर्शी हैं। आप सिर्फ जेएआई कक्षा पर एपीआई कॉल करते हैं। यदि आप टाइल आकार, कैशिंग और समरूपता जैसी चीज़ों पर अधिक नियंत्रण चाहते हैं तो आप केवल मशीनरी से निपटें।
0

हर बार जब आप 'जोड़ें' आप शायद परोक्ष एक और पिक्सेल के साथ एक नई वस्तु बना रहे हैं एक पुरानी (बदलने के लिए यानी, बार-बार जोड़कर की क्लासिक समस्या के लिए एक समानांतर स्ट्रिंगबिल्डर का उपयोग करने के बजाए स्ट्रिंग में)?

यदि आप अपने कोड का हिस्सा पोस्ट करते हैं जो भंडारण और परिचालन करता है, तो कोई शायद आपको इसे रिकोड करने का एक प्रभावी तरीका खोजने में मदद करेगा।

2

यहां एक सुझाव है जो उपयोगी हो सकता है;

दो मुख्य कार्यों को अलग-अलग कार्यक्रमों में अलग करने का प्रयास करें।आपका पहला काम तय करने के लिए जो छवियों जाना जहां है, और उस फ़ाइल नाम के लिए निर्देशांक से एक सरल मानचित्रण, जो पाठ की पंक्तियों के रूप में प्रतिनिधित्व किया जा सकता है हो सकता है:

0,0,image123.jpg 
0,1,image542.jpg 
..... 

के बाद उस कार्य किया जाता है (और यह आप की तरह लगता है इसे अच्छी तरह से संभाला है), तो आप एक अलग प्रोग्राम संकलन संभाल सकते हैं।

यह संकलन किसी छवि को जोड़कर किया जा सकता है, लेकिन आप शायद फ़ाइल स्वरूपों के साथ गड़बड़ नहीं करना चाहते हैं। अपने प्रोग्रामिंग पर्यावरण को किसी प्रकार की जावा छवि ऑब्जेक्ट का उपयोग कर ऐसा करना बेहतर है। मेमोरी पिक्सेलवाइज़ में फिट करने वाला सबसे बड़ा आप 2 जीबी होगा जो वर्ग ऊंचाई (2x10^9) अधिकतम ऊंचाई और चौड़ाई के लिए अग्रणी होगा। इस संख्या से और ऊंचाई और चौड़ाई के लिए आपके पास छवियों की संख्या से विभाजित होने पर, आपको प्रति उपमहाद्वीप के कुल पिक्सल मिलेंगे।, और उन्हें उपयुक्त स्थानों में पेंट कर सकते हैं।

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