2012-10-09 13 views
9

मेरे पास एक ऐसा एप्लिकेशन है जो वीडियो में दिखाई देने वाले शीर्ष 16 रंगों को सूचीबद्ध करता है।आरजीबी रंग को निकटतम मिलान 8-बिट रंग में कैसे परिवर्तित करें?

मैं किसी अन्य अनुप्रयोग है कि उपयोगकर्ता एक रंग का चयन करने के लिए और फिर अनुप्रयोग सभी वीडियो है कि इस रंग में दिखाई देता है पाता है की अनुमति देता है लिखने की कोशिश कर रहा हूँ।

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

मैंने सोचा कि मैं यह काम कर सकता हूं - मैं वीडियो में दिखाई देने वाले रंगों को इंडेक्स कर सकता हूं और उन्हें निकटतम 8-बिट रंग में परिवर्तित कर सकता हूं।

फिर जब कोई उपयोगकर्ता आरजीबी रंग का चयन करता है, तो मैं उपयोगकर्ता पसंद को उसी 8-बिट निकटतम रंग में परिवर्तित कर सकता हूं।

इस तरह से मैं हमेशा मेल खाता होता।

अभी एकमात्र बड़ी समस्या यह है कि आरजीबी रंग को निकटतम 8 बिट रंग में कैसे परिवर्तित किया जाए?

+0

आप किस भाषा का उपयोग कर रहे हैं? शायद कुछ पुस्तकालय पहले से ही चाल है। –

+0

एक 8-बिट रंग दो अलग-अलग तरीकों से किया जा सकता है। यह एक रंगीन तालिका, या एक आरआरआरजीजीजीबीबी मूल्य, आदि में एक सूचकांक हो सकता है। आप किस प्रकार के 8-बिट रंगों का उपयोग करना चाहते थे? – cHao

+0

8 बिट्स मनमाने ढंग से रंग का प्रतिनिधित्व करने के लिए लगभग पर्याप्त नहीं है। –

उत्तर

0

क्या आप Floyd–Steinberg dithering से परिचित हैं? इसका उपयोग उच्च ऑर्डर रंगों को कम ऑर्डर रंगों में बदलने के लिए किया जाता है, उदा। जीआईएफ रूपांतरण के लिए 24 बिट आरजीबी से 3 बिट (8 रंग) आरजीबी या एक आरजीबी छवि को 8 बिट्स (256 रंग) तक सीमित करना।

यह एल्गोरिदम लिंक किए गए विकिपीडिया पृष्ठ पर वर्णित है।

+0

विचार एक रंग को परिवर्तित करना है। इस आवेदन में दिक्कत नहीं है। –

4

आपको आरजीबी को एचएसबी (रंग संतृप्ति चमक) मान में परिवर्तित करने की आवश्यकता है। एचएसबी 3 बाइट्स है, आरजीबी की तरह, अंतर यह है कि आरजीबी की तुलना में एचएसबी मूल्यों की तुलना अधिक आसानी से की जा सकती है।

आपका अगला कदम "महत्व" भार पर निर्णय लेता है। उदाहरण के लिए, यदि आप सभी के बारे में परवाह करते हैं तो "रंग/रंग", संतृप्ति या चमक नहीं है, तो आप एस और बी बाइट्स को फेंक सकते हैं और केवल रंग बाइट का उपयोग कर सकते हैं।

यदि यह मैं था और मैं 8 बिट्स तक सीमित था तो मैं रंगीन जानकारी के 4 बिट (16 अलग-अलग रंग), संतृप्ति के 3 बिट (8 अलग-अलग मान), और 1 बिट चमक जानकारी (प्रकाश या अंधेरा) का उपयोग करता था। ।

यह आलेख वर्णन करता जावा में HSB कैसे करना है:

http://java.sys-con.com/node/43559

इस लेख के लिए स्रोत कोड जावा में HSB कनवर्टर करने के लिए एक आरजीबी है।

+0

मैं संतृप्ति के 2 बिट और चमक के 2 बिट्स के साथ जाऊंगा। –

5

वेब सुरक्षित पैलेट में बदलने के लिए, आपको 0-5 करने के लिए 0-255 से आर, जी, बी घटकों में से प्रत्येक की सीमा को बदलने और उन्हें गठबंधन करने के लिए की जरूरत है:

color = (r*6/256)*36 + (g*6/256)*6 + (b*6/256) 
2

एक संभावना अपने 24-बिट रंग को 8-बिट रंग स्थान में बस स्केल करना है। जैसा कि सीएचओ का उल्लेख है, आप अपने 8-बिट नंबर के लिए आरआरआरजीजीजीबीबी का उपयोग कर सकते हैं।

byte red = (originalColor.red * 8)/256; 
byte green = (originalColor.green * 8)/256; 
byte blue = (originalColor.blue * 4)/256; 

8, 4, और 254 प्रत्येक रंग घटक में संभावित मानों की संख्या में हैं: तो फिर प्रत्येक रंग घटक जैसे एक साधारण स्केलिंग एल्गोरिथ्म द्वारा गणना की जा सकती। आपके मूल 24-बिट रंग, लाल, हरे और नीले रंग में सभी के पास 256 संभावित मान हो सकते हैं, इसलिए यह स्केलिंग समीकरण का विभाजक है। उदाहरण 8-बिट रंग में, लाल और हरे रंग प्रत्येक 3 बिट्स (8 संभावित मान) होते हैं और नीली 2 बिट्स (4 संभावित मान) होती है।

के बाद आप इन तीन घटकों मिलता है, आप कुछ सरल सा बदलाव गणित के साथ उन्हें जोड़ सकते हैं:

byte eightBitColor = (red << 5) | (green << 2) | blue; 

तो फिर तुम बस इन 8 बिट रंग तुलना कर सकते हैं। उनका भारी रूप से कम संकल्प आपको मदद कर सकता है।

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

संपादित करें: संशोधित स्केलिंग एल्गोरिदम मार्क रान्ससम द्वारा इंगित एक कमी को ठीक करने के लिए।

+0

केवल 8 बिट्स की रंग सीमा के साथ, यह बिट सीमाओं को अनदेखा करने और उन श्रेणियों का उपयोग करने के लिए अधिक समझ में आता है जो 2 की शक्ति नहीं हैं। आपके उत्तर में 8 संभावित लाल, 8 संभव हिरण हैं, लेकिन केवल 4 संभावित ब्लूज़ हैं; अधिक सामान्य 6,6,6 (मेरे उत्तर में) या 6,7,6 है। इसके अलावा आपकी स्केलिंग थोड़ी दूर है क्योंकि केवल 255 का इनपुट अधिकतम आउटपुट देगा और उन मानों को कम से कम प्रस्तुत किया जाएगा। –

+0

यह वास्तव में सच है। मैं वास्तव में सिर्फ सीएचओओ की टिप्पणी पर विस्तार करने की कोशिश कर रहा था। मैंने स्केलिंग समस्या को ठीक करने के लिए अपना उत्तर संपादित कर दिया है। –

+0

जेएसबीन: http://jsbin.com/voqacamema/3/ –

0

अगर आप 8 bpp छवि के लिए 24 bpp छवि परिवर्तित करना चाहते हैं इस एल्गोरिथ्म का प्रयास करें:

for y = 0 to ImageHeight - 1 
    for x = 0 to ImageWidth - 1 
     GetPixel(x,y,red,grn,blu) 
     {read RGB data from 24bpp file} 
     d0 = red^2 + grn^2 + blu^2 
     ColorIndex = 0 
     for cl = 0 to 255 
     GetPaletteData(p_red,p_gre,p_blu) 
     {read RGB data from 8bpp palette} 
     d = (red - p_red)^2 + (grn - p_grn)^2 + (blu - p_blu)^2 
     if d0 >= d then 
      ColorIndex = cl 
      d0 = d 
     end if 
     next cl 
     {use ColorIndex to create your 8bpp file} 
    next x 
    next y 

इस कदम से पहले, विकिपीडिया या अन्य स्रोतों से 8bpp फ़ाइलों के बारे में अधिक पढ़ सकते हैं।

शुभकामनाएं!

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