17

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

कैसे मेरे मूल्यों को निर्धारित कर रहे हैं के लिए, यह

incPixelColor[0] = 0; (red) 
incPixelColor[1] = 0; (green) 
incPixelColor[2] = 255; (blue) 
incPixelColor[3] = 255; (alpha) 

currentPixelColor[0] = 127; (red) 
currentPixelColor[1] = 127; (green) 
currentPixelColor[2] = 127; (blue) 

कैसे मेरे गणना सेट किया गया है के लिए पर एक नज़र, मैं करूंगा ले बिना अल्फा वाला पिक्सल के लिए यह

float incAlpha = (currentPixelColor[3]/255.0f); 

float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f); 
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f); 
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f); 


currentPixelColor[0] = min(red * 255, 255.0f); 
currentPixelColor[1] = min(green * 255, 255.0f); 
currentPixelColor[2] = min(blue * 255, 255.0f); 

पर एक नज़र डालें, जैसे मान (0, 0, 255) होने के लिए अल्फा के साथ छवियों के लिए मैं इसे मिश्रण करना चाहता हूं। उपर्युक्त ऑपरेशन के अंत में, यह (127, 127, 255) होगा। क्या मुझे यह देखने के लिए जांचना चाहिए कि क्या प्रत्येक पिक्सेल के लिए अल्फा है, और यदि ऐसा है, तो मिश्रण करें या ऐसा करने का कोई और तरीका है?

+0

आप additive सम्मिश्रण कर रहे हैं। इस तरह रैखिक मिश्रण पर विचार करें: y = (x0 * w) + (x1 * (1-w)) –

+1

यह 255 स्केलिंग पीछे और आगे है। यदि आपके परिचालन सामान्यीकरण बनाए रखते हैं तो यह आवश्यक नहीं होना चाहिए। – fche

उत्तर

22

एक ठेठ "ओवर" मिश्रण निम्नलिखित तरीके से किया जाता है:

outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha)); 

और फिर नीले और हरे रंग चैनलों के लिए दोहरा। हर पिक्सेल के लिए यह करो।

+0

शायद मैं गलत हूं, लेकिन क्या मैं पहले से ही नहीं कर रहा हूं? – mmurphy

+0

नहीं, आप क्या कर रहे हैं outputRed = (foreRed * foreAlpha) + BackgroundRed। आपको पृष्ठभूमि (1.0 - foreAlpha) द्वारा पृष्ठभूमि को गुणा करने की आवश्यकता है। – user1118321

+0

क्षमा करें कि बहुत देर हो चुकी है, लेकिन अल्फा आउटपुट अल्फा चैनल के साथ क्या होता है यदि दोनों गंतव्य और स्रोत पिक्सेल पारदर्शी हैं? –

2

ऐसा लगता है कि आप नहीं मिल पाए (1-अल्फा) पृष्ठभूमि (currentPixelColor) के लिए गुणक

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