2009-11-12 10 views
6

सामान्य में, "सामान्य" मिश्रण मोड समीकरण इस तरह दिखता है:ब्लेंड मोड

D = Sa * S + D * (1.0 - Sa) 

जहां डी गंतव्य रंग है, Sa स्रोत अल्फा है और एस स्रोत रंग है।

अब, यह पूरी तरह से अपारदर्शी गंतव्य के साथ ठीक काम करता है लेकिन मैं जानना चाहता हूं कि आप इसे अर्ध और पूरी तरह से पारदर्शी गंतव्य के साथ कैसे संभालेंगे।

स्रोत को पूरी तरह से पारदर्शी गंतव्य पर मिश्रित करते समय, स्रोत पिक्सेल (एक पिक्सेल रंग और अल्फा) अपरिवर्तित होगा और पहले समीकरण में मिश्रित नहीं होगा, और यदि गंतव्य पृष्ठभूमि पूरी तरह से अपारदर्शी है, तो उपरोक्त समीकरण लागू किया जाए, लेकिन मुझे उन स्थितियों को संभालने का एक अच्छा तरीका नहीं मिल सकता है जहां गंतव्य अल्फा 0 और 1.

उदाहरण के लिए, यदि आप एक पारदर्शी पृष्ठभूमि पर 50% अल्फा के साथ एक सफेद पिक्सेल मिश्रण करते हैं, तो रंग उस पारदर्शी रंग मूल्य (जो एक अनिर्धारित स्थिति में कम या कम है) नहीं होना चाहिए, गंतव्य रंग पूर्ण सफेद होना चाहिए, और 50% (अल्फा गुणा के बाद) नहीं, जो उपर्युक्त समीकरण लागू करने के बाद आपको मिलता है (यदि डी को एस के समान रंग बनाया गया है, जो मैं आप था का ght)।

उत्तर

7

यह समीकरण सामान्य मिश्रण समीकरण का सरलीकरण है। यह मानता है कि गंतव्य रंग अपारदर्शी है, और इसलिए गंतव्य रंग के अल्फा शब्द को छोड़ देता है।

D = C1 * C1a + C2 * C2a * (1 - C1a) 

जहां डी परिणामी रंग है, सी 1 पहला तत्व का रंग है, सी 1 ए पहला तत्व के अल्फा है, सी 2, दूसरा तत्व रंग है C2a दूसरा तत्व के अल्फा है। गंतव्य अल्फा के साथ की जाती है:

Da = C1a + C2a * (1 - C1a) 

परिणामी रंग अल्फा के साथ premultiplied है। अनमोलिफाइड मानों में रंग को पुनर्स्थापित करने के लिए, दा दा, परिणामस्वरूप अल्फा द्वारा विभाजित करें।

+0

यह काम नहीं करता है। उदाहरण के लिए, यदि गंतव्य रंग काला है और स्रोत रंग सफेद है। गंतव्य अल्फा 0 है और स्रोत अल्फा 0.5 है, तो आप डी = 1.0 * 0.5 + 0.0 * 0.0 * (1.0 - 0.5) के साथ समाप्त होते हैं जो कि 1.0 * 0.5 है, इसके साथ ही स्रोत के रंग को इसके अल्फा के साथ गुणा करना है। यह वही नहीं है जो मैं चाहता हूं, यदि गंतव्य अल्फा 0 है तो मैं स्रोत रंग को छूना चाहूंगा। –

+0

इस तरह यह मिश्रण मोड काम करता है।यदि आप अलग-अलग व्यवहार चाहते हैं तो आप एक अलग मिश्रण मोड चाहते हैं। अन्य मिश्रण मोड के oodles हैं। Http://illusions.hu/effectwiki/doku.php?id=list_of_blendings –

+2

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

0

अधिकांश ब्लेंडिंग सूत्र स्थिर छवियों पर उपयोग किए जाते हैं जहां गंतव्य रंग अल्फा संग्रहीत नहीं होता है। यदि अल्फा उपलब्ध है तो अंतिम अल्फा स्रोत अल्फा और गंतव्य अल्फा के arithmetic mean होने जा रहा है।

आप औसत अल्फा की गणना कर सकते हैं और फिर बस अपने सूत्र में 'Sa' के स्थान पर इसका उपयोग कर सकते हैं।

मन हमें बता रहा है कि यह क्या है?

+0

गंतव्य अल्फा की गणना करना कोई समस्या नहीं है, यह वह रंग है जो समस्या उत्पन्न करता है। यह दूसरी अर्ध पारदर्शी छवि पर 1 अर्ध पारदर्शी छवि को मिश्रित करना है और परिणाम को पीएनजी फ़ाइल में पारदर्शिता के साथ सहेजना है। फ़ोटोशॉप में मैं दो छवियों को लोड करके, दो परतों को विलय करके और पीएनजी में सहेजकर ऐसा कर सकता हूं। –

+0

मुझे अभी भी नहीं पता है कि अल्फा चैनलों का औसत उचित रंग क्यों नहीं देगा? – tplaner

1

मुझे यह answer सहायक होने के लिए मिला, और ऐसा लगता है कि अल्फा चैनल में एक ही सूत्र को लागू करते समय ऐसा लगता है।

यहाँ बदल विस्तारित संस्करण को दिखाने के लिए:

int blend(unsigned char result[4], unsigned char fg[4], unsigned char bg[4] { 
    unsigned int alpha = fg[3] + 1; 
    unsigned int inv_alpha = 256 - fg[3]; 
    result[0] = (unsigned char)((alpha * fg[0] + inv_alpha * bg[0]) >> 8); 
    result[1] = (unsigned char)((alpha * fg[1] + inv_alpha * bg[1]) >> 8); 
    result[2] = (unsigned char)((alpha * fg[2] + inv_alpha * bg[2]) >> 8); 
    result[3] = (unsigned char)((alpha * fg[3] + inv_alpha * bg[3]) >> 8); 
    // result[3] = 0xff; 
} 

यह त्वरित और गंदी कोड के लिए अच्छी तरह से काम है, लेकिन वहाँ के रूप में ऊपर जवाब में टिप्पणी की, लेकिन यह भी here और here संबोधित है, साथ ही तेजी से दृष्टिकोण हैं।

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