RGB RGB कलर टुपल को कैसे कन्वर्ट करें, उदाहरण के लिए (96, 96, 96, 202), इसी RGB कलर टुपल को?
संपादित करें:
मैं जो चाहता हूं वह आरजीबी मूल्य प्राप्त करना है जो कि सफेद पृष्ठभूमि पर आरजीबीए ट्यूपल के समान है।
RGB RGB कलर टुपल को कैसे कन्वर्ट करें, उदाहरण के लिए (96, 96, 96, 202), इसी RGB कलर टुपल को?
संपादित करें:
मैं जो चाहता हूं वह आरजीबी मूल्य प्राप्त करना है जो कि सफेद पृष्ठभूमि पर आरजीबीए ट्यूपल के समान है।
जवाबों:
मैंने जोहान्स के उत्तर को गलत ठहराया है क्योंकि वह इसके बारे में सही है।
* कुछ टिप्पणियाँ उठाई गई हैं कि मेरा मूल उत्तर सही नहीं था। यह काम करता है अगर अल्फा मान सामान्य से उलटा था। हालांकि, ज्यादातर मामलों में यह काम नहीं करेगा। इसलिए मैंने सामान्य मामले के लिए सही होने के लिए सूत्र नीचे अपडेट किया है। यह समाप्त हो रहा है @ hkurabko के जवाब के बराबर *
एक अधिक विशिष्ट उत्तर, हालांकि, एक अपारदर्शी पृष्ठभूमि के रंग (या 'मैट' के रूप में इसे संदर्भित किया जाता है) के आधार पर वास्तविक रंग परिणाम में अल्फा मूल्य को शामिल करता है।
इसके लिए एक एल्गोरिथ्म है ( इस विकिपीडिया लिंक से):
Source
।BGColor
नोट करेंगे - यदि पृष्ठभूमि का रंग भी पारदर्शी है, तो आपको इस ऑपरेशन के लिए स्रोत RGB प्राप्त करने के लिए पहले (फिर, मैट का चयन) के लिए प्रक्रिया को फिर से भरना होगा।अब, रूपांतरण के रूप में परिभाषित किया गया है (यहाँ पूर्ण प्यूडो कोड में!):
Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
आपके लिए अंतिम 0-255 मान प्राप्त करने के लिए Target
बस सभी सामान्यीकृत मानों को 255 से गुणा करें, यह सुनिश्चित करते हुए कि आप 255 पर कैप करते हैं यदि कोई संयुक्त मान 1.0 से अधिक है (यह अति-जोखिम है और इससे निपटने के लिए अधिक जटिल एल्गोरिदम हैं जिसमें संपूर्ण-छवि प्रसंस्करण आदि शामिल हैं)।
EDIT: आपने अपने प्रश्न में कहा था कि आप एक श्वेत पृष्ठभूमि चाहते हैं - उस स्थिति में केवल BGColor को 255,255,255 पर ठीक करें।
हम्म ... के संबंध में
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
एन्ड्रास ज़ोल्टन द्वारा प्रदान किए गए समाधान को थोड़ा बदल दिया जाना चाहिए:
Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
यह परिवर्तित संस्करण मेरे लिए ठीक काम करता है, क्योंकि प्रचलित में। संस्करण rgba (0,0,0,0) के साथ मैट आरजीबी (एफएफ, एफएफ, एफएफ) को आरजीबी (0,0,0) में बदल दिया जाएगा।
यहां एंड्रास और हुरकबको के उत्तरों के अनुसार एक सुविधाजनक एसएएस फ़ंक्शन है।
@function rgba_blend($fore, $back) {
$ored: ((1 - alpha($fore)) * red($back) ) + (alpha($fore) * red($fore));
$ogreen: ((1 - alpha($fore)) * green($back) ) + (alpha($fore) * green($fore));
$oblue: ((1 - alpha($fore)) * blue($back) ) + (alpha($fore) * blue($fore));
@return rgb($ored, $ogreen, $oblue);
}
उपयोग:
$my_color: rgba(red, 0.5); // build a color with alpha for below
#a_div {
background-color: rgba_blend($my_color, white);
}
mix($color, white, $alpha*100)
यहाँ कुछ जावा कोड है (Android API 24 पर काम करता है):
//int rgb_background = Color.parseColor("#ffffff"); //white background
//int rgba_color = Color.parseColor("#8a000000"); //textViewColor
int defaultTextViewColor = textView.getTextColors().getDefaultColor();
int argb = defaultTextViewColor;
int alpha = 0xFF & (argb >> 24);
int red = 0xFF & (argb >> 16);
int green = 0xFF & (argb >> 8);
int blue = 0xFF & (argb >> 0);
float alphaFloat = (float)alpha / 255;
String colorStr = rgbaToRGB(255, 255, 255, red, green, blue, alphaFloat);
समारोह:
protected String rgbaToRGB(int rgb_background_red, int rgb_background_green, int rgb_background_blue,
int rgba_color_red, int rgba_color_green, int rgba_color_blue, float alpha) {
float red = (1 - alpha) * rgb_background_red + alpha * rgba_color_red;
float green = (1 - alpha) * rgb_background_green + alpha * rgba_color_green;
float blue = (1 - alpha) * rgb_background_blue + alpha * rgba_color_blue;
String redStr = Integer.toHexString((int) red);
String greenStr = Integer.toHexString((int) green);
String blueStr = Integer.toHexString((int) blue);
String colorHex = "#" + redStr + greenStr + blueStr;
//return Color.parseColor(colorHex);
return colorHex;
}