2009-11-05 9 views
6

में कनवर्ट करें मुझे एक पूर्ण रंग जेपीजी छवि लेने और इंडेक्स किए गए पैलेट में इसके रंगों को रीमेप करने की आवश्यकता है। पैलेट में डेटाबेस से आबादी वाले विशिष्ट रंग होंगे। मुझे छवि के प्रत्येक रंग को इंडेक्स में "निकटतम" मान में मैप करने की आवश्यकता है। मुझे यकीन है कि "निकटतम" मूल्य की तुलना और गणना करने के लिए अलग-अलग एल्गोरिदम हैं। सी # के लिए खोज रहे हैं, .NET प्रबंधित कोड पुस्तकालय केवल।32-बीपीपी से 8-बीपीपी इंडेक्स (सी #)

(यह उस प्रक्रिया में उपयोग किया जाएगा जहां हमारे पास 120 या उससे अधिक विशिष्ट रंग हैं, और हम किसी भी छवि को कोलाज बनाने के लिए उन 120 रंगों में मानचित्र बनाना चाहते हैं)।

+0

+1, अच्छा सवाल! –

उत्तर

2

इस प्रक्रिया को Quantization कहा जाता है। चूंकि प्रत्येक रंग 3 पैक किए गए मानों का प्रतिनिधित्व करता है, इसलिए आपको इस समस्या को हल करने के लिए ऑक्टिस का उपयोग करना होगा।

उदाहरण कोड के साथ यह article देखें।

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

+0

तो क्या .NET ढांचा क्वांटनाइज़ेशन पुस्तकालयों में बनाया गया है? –

+0

मुझे .NET का कोई ज्ञान नहीं है (मैं एक लिनक्स लड़का हूं), और मुझे सामान (टीएम) करने के लिए उपयोग किया जाता है। क्षमा करें मैं अधिक जानकारी प्रदान नहीं कर सकता। – LiraNuna

0

मुझे इसे एक बड़े .NET प्रोजेक्ट में करना था। इसके लिए ढांचे में कुछ भी नहीं है, लेकिन इस लेख ने मुझे तुरंत समाधान के लिए प्रेरित किया: http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx

+0

आपका लिंक मर चुका है। –

+0

ऐसा लगता है कि उन्होंने अभी 'हटा दिया'। उसके नाम पर यह काम करता है: http://codebetter.com/brendantompkins/2004/01/26/use-gdi-to-save-crystal-clear-gif-images-with-net/ – Nestor

0

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

आपके प्रश्न का उत्तर हाँ है - आप छवियों को वैकल्पिक प्रारूप में सहेज सकते हैं - लेकिन मुझे यकीन नहीं है कि मूल कार्यक्षमता पर्याप्त जटिल आवश्यकता की तरह लगने के लिए पर्याप्त है या नहीं। यदि आप छवियों के संग्रह से रंग पैलेट को परिभाषित करने में सक्षम हैं, तो आप आउटपुट की गुणवत्ता में सुधार करेंगे।

पहले से संदर्भित ब्लॉग एंट्री जिसका उपयोग पहले से ही संदर्भित किया गया है, 'जीडीआई + क्रिस्टल-साफ़ जीआईएफ छवियों को .NET के साथ सहेजें' में कोड के उपयोगी संदर्भ शामिल हैं।

3

कुछ भी आपको जीडीआई के साथ मदद नहीं करेगा। ऐसा लगता है कि माइक्रोसॉफ्ट के लिए माइक्रोसॉफ्ट की देखभाल करने के लिए अनुक्रमित छवियां बहुत पिछड़ी हैं। आप जो भी कर सकते हैं वह अनुक्रमित छवि फ़ाइलों को पढ़ और लिखना है।

आमतौर पर दो कदम जब एक छवि में quantizing रंग के होते हैं:
1) छवि के लिए सबसे अच्छा पैलेट (रंग परिमाणीकरण)
2) मानचित्र पाया पैलेट स्रोत solors (रंग मैपिंग) का पता लगाएं

जो मैं समझता हूं, उससे पहले आपके पास डेटाबेस में पैलेट है, जिसका मतलब है कि आपके लिए सबसे कठिन हिस्सा किया गया है। आपको बस इतना करना है कि प्रदान किए गए पैलेट रंगों में 24 बिट रंगों को मानचित्र करें। यदि आपके पास प्रारंभिक पैलेट नहीं है, तो आपको क्वांटिसेशन एल्गोरिदम का उपयोग करके स्वयं को गणना करना होगा: ऑक्टिस या मेडियन कट सबसे प्रसिद्ध हैं। मध्य कट बेहतर परिणाम देता है लेकिन लागू करने और ठीक धुन के लिए धीमा और कठिन है।

रंगों को मैप करने के लिए, आपके मामले में सबसे सरल एल्गोरिदम आपके स्रोत रंग से दूरी को सभी पैलेट रंगों तक दूरी की गणना करना और निकटतम चुनना है।

float ColorDistanceSquared(Color c1, Color c2) 
{ 
    float deltaR = c2.R - c1.R; 
    float deltaG = c2.G - c1.G; 
    float deltaB = c2.B - c1.B; 
    return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB; 
} 

तुम भी चैनलों ponderate कर सकते हैं ताकि नीले कम वजन है, इसके साथ भी पानी में गिर मत जाओ, वरना यह भयानक परिणाम देगा, विशेष रूप से 30/59/11 बिल्कुल काम नहीं होगा:

float ColorDistanceSquared(Color c1, Color c2) 
{ 
    float deltaR = (c2.R - c1.R) * 3; 
    float deltaG = (c2.G - c1.G) * 3; 
    float deltaB = (c2.B - c1.B) * 2; 
    return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB; 
} 

सभी स्रोतों और पैलेट रंगों के लिए उस चीज़ को कॉल करें और न्यूनतम खोजें। यदि आप मानचित्र में जाते समय अपने परिणामों को कैश करते हैं, तो यह बहुत तेज़ होगा।

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

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

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