2008-09-24 19 views
6

मैं कई छवियों को एक बड़ी छवि में एक साथ रखने की कोशिश कर रहा हूं, और एक एल्गोरिदम की तलाश में हूं जो सबसे अधिक अनुकूल स्थान निर्धारित करता है। छवियों को घुमाने या आकार में नहीं बदला जा सकता है, लेकिन परिणामी छवि में स्थिति महत्वपूर्ण नहीं है।कई छवियों को एक बड़ी छवि में मिलाएं

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

+0

हे लिनर! तो आखिर में तुमने क्या किया? इससे मदद मिलेगी ... – Lazer

उत्तर

3

जोड़ा कोई आकार बदलने बाधा शायद आप कुछ इस तरह की तलाश में हैं: Automatic Magazine Layout

+0

इस समाधान के साथ समस्या यह है कि यह केवल कुछ छवियों के लिए काम करता है, और फिट करने के लिए छवियों का आकार बदलता है। – Linor

0

देख रहे हैं मैं इस लोगों के लिए एक एल्गोरिथ्म बनाया, यह वास्तव में NP-HardBin packing समस्या का एक प्रकार है, लेकिन एक अनंत बिन आकार के साथ।

आप इसके बारे में कुछ लेख ढूंढने का प्रयास कर सकते हैं और अपने एल्गोरिदम को अनुकूलित करने का प्रयास कर सकते हैं, लेकिन अंत में यह हर संभावना का प्रयास करने के लिए एक क्रूर बल तरीका रहेगा और परिणामस्वरूप बिन आकार को कम करने का प्रयास करेगा।

यदि आपको सबसे अच्छा समाधान की आवश्यकता नहीं है, लेकिन केवल एक समाधान है, तो आप सभी संयोजनों को मजबूर करने से बच सकते हैं। मैंने एक कार्यक्रम बनाया जिसने एक बार भी किया।

विवरण:

Images: array of the input images 
ResultMap: 2d array of Booleans 
FinalImage: large image 
  1. क्रमबद्ध छवियाँ सरणी ताकि सबसे बड़ा छवि शीर्ष पर है।
  2. अपनी छवियों के कुल आकार की गणना करें और ResultMap को प्रारंभ करें ताकि यह आकार आपकी छवियों के कुल आकार 1.5 गुणा हो (आप बेहतर स्मृति उपयोग और प्रदर्शन के लिए यह कदम बेहतर बना सकते हैं)। परिणाम को एक ही आकार में बनाएं और इसे गलत मानों से भरें।
  3. फिर अपने अंतिम छवि के बाईं ओर पहली छवि जोड़ें और सभी बूलेन्स को ResultMap में 0,0 से ImageHeight, ImageWidth तक सेट करें।

परिणाम का उपयोग तुरंत जांचने के लिए किया जाता है कि क्या आप वर्तमान अंतिम छवि पर एक छवि फिट कर सकते हैं। आप इसे int32 का उपयोग करने के लिए अनुकूलित कर सकते हैं और प्रत्येक पिक्सेल के लिए प्रत्येक बिट का उपयोग कर सकते हैं। यह स्मृति को कम करेगा और प्रदर्शन में वृद्धि करेगा, क्योंकि आप एक बार में 32 बिट की जांच कर सकते हैं (मास्क का उपयोग करके)। लेकिन यह अधिक भिन्न हो जाएगा क्योंकि आपको उस मुखौटा के बारे में सोचना होगा जिसे आपको अपनी छवि के किनारों के लिए बनाना होगा।

अब मैं "एल्गोरिदम" के वास्तविक पाश का वर्णन करूंगा।

  1. सरणी में प्रत्येक छवि के लिए एक जगह खोजने का प्रयास करें, यह फिट होगा। आप एक लूप लिख सकते हैं जो ResultMap सरणी को देखेगा और झूठी मान की तलाश करेगा और यह देखने के लिए शुरू होगा कि यह छवि के आकार के लिए दोनों दिशाओं में गलत है या नहीं।
    • आप एक जगह मिल जाए, ResultMap
    • में FinalImage करने के लिए छवि को कॉपी करें और सही बूलियन्स अद्यतन यदि आप एक जगह मिल cand हैं, तो बस इतना FinalImage का आकार बढ़ाने के (ताकि किनारों पर नज़र डालें तो जहां अतिरिक्त स्थान की न्यूनतम राशि की जरूरत है) और यह भी सिंक कि ResultMap साथ
  2. गोटो 1 :)

यह इष्टतम नहीं है, लेकिन यह एक यथोचित इष्टतम तरीका (खासकर अगर में समस्या का समाधान कर सकते हैं वहाँ कुछ छोटी छवियां हैं अंत में गैब भरें)।

2

स्पष्ट रूप से इसे 'पैकिंग समस्या' कहा जाता है, जो गेम प्रोग्रामिंग में अक्सर उपयोग किया जाता है। उन दिलचस्पी के लिए, यहाँ कुछ सुझाव कार्यान्वयन हैं:

Packing Lightmaps, Rectangle packing और Rectangle Placement

-3

एक गैर programmatical तरह, यू एम एस का उपयोग कर सकते पेंट सुविधा यानी "से चिपकाएं" चिपकाएं एक (JPEG) में दाखिल mspaint छवि क्षेत्र। इसका उपयोग करके आप अलग-अलग छवियों की व्यवस्था कर सकते हैं, और एक अंतिम बड़ी छवि बना सकते हैं और इसे जेपीईजी/जीआईएफ/रॉ-बीएमपी प्रारूप के रूप में सहेज सकते हैं।

-AD।

0

इष्टतम पैकिंग कठिन है, लेकिन आपके समस्या डोमेन के विवरण के आधार पर आपके लिए सरलताएं उपलब्ध हो सकती हैं। कुछ विचार:

  1. आप टाइल्स समान रूप से आकार में अपने बिटमैप्स ऊपर उत्कीर्ण कर सकते, तो पैकिंग तुच्छ है। फिर, मांग पर, आप टाइल्स से बिटमैप्स को फिर से इकट्ठा करेंगे।

  2. अपनी छवियों को सबसे छोटे से क्रमबद्ध करें, फिर प्रत्येक छवि के लिए छवि को फिट करने वाले पहले उपलब्ध उप-आयत का चयन करने के लिए एक लालची-आवंटक का उपयोग करें।

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

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