कन्वर्ट RGBA रंग RGB करने के लिए


79

RGB RGB कलर टुपल को कैसे कन्वर्ट करें, उदाहरण के लिए (96, 96, 96, 202), इसी RGB कलर टुपल को?

संपादित करें:

मैं जो चाहता हूं वह आरजीबी मूल्य प्राप्त करना है जो कि सफेद पृष्ठभूमि पर आरजीबीए ट्यूपल के समान है।


3
क्या ऐसा नहीं होगा (96,96,96)?
लाजर

24
यह पृष्ठभूमि के पिक्सेल के रंग पर निर्भर करता है।
फ्रैंक बोलैक

5
क्या आप केवल अल्फा चैनल निकालना चाहते हैं? या क्या आप चाहते हैं कि एक (जैसे) सफेद पृष्ठभूमि पर आरजीबीए को सुपरइम्पोज करने का आरजीबी परिणाम हो?
बेन जेम्स

1
: आप प्रसिद्ध कागज अल्फा रचना पर पूर्ण विवरण के लिए (पोर्टर और गूंथा हुआ आटा द्वारा) "डिजिटल छवियों संयोजन" पढ़ने के लिए चाहते हो सकता है keithp.com/~keithp/porterduff
kusma

Andras Zoltan और hkurabko का उत्तर भी oposite की गणना करने के लिए उपयोगी है, मेरा मतलब है कि अगर आपके पास विभिन्न अल्फा मिश्रित रंग हैं और इसकी मूल पृष्ठभूमि (मैट) है तो आप मूल RGBA रंग की गणना कर सकते हैं जो कि मैं देख रहा हूँ जबकि;)
nacho4d

जवाबों:


90

मैंने जोहान्स के उत्तर को गलत ठहराया है क्योंकि वह इसके बारे में सही है।

* कुछ टिप्पणियाँ उठाई गई हैं कि मेरा मूल उत्तर सही नहीं था। यह काम करता है अगर अल्फा मान सामान्य से उलटा था। हालांकि, ज्यादातर मामलों में यह काम नहीं करेगा। इसलिए मैंने सामान्य मामले के लिए सही होने के लिए सूत्र नीचे अपडेट किया है। यह समाप्त हो रहा है @ hkurabko के जवाब के बराबर *

एक अधिक विशिष्ट उत्तर, हालांकि, एक अपारदर्शी पृष्ठभूमि के रंग (या 'मैट' के रूप में इसे संदर्भित किया जाता है) के आधार पर वास्तविक रंग परिणाम में अल्फा मूल्य को शामिल करता है।

इसके लिए एक एल्गोरिथ्म है ( इस विकिपीडिया लिंक से):

  • RGBA मानों को सामान्य करें ताकि वे सभी 0 और 1 के बीच हों - बस ऐसा करने के लिए प्रत्येक मान को 255 से विभाजित करें। हम परिणाम को कॉल करेंगे 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 पर ठीक करें।


9
प्रश्न के प्रकाश में यह एक बहुत ही सटीक और अच्छा उत्तर है। मैंने मेरा डिलीट किया और आशा करता हूं कि आप बबल अप करेंगे, क्योंकि आपने मामलों को बेहतर तरीके से समझाया :)
जॉय

मुझे लगता है कि यह उत्तर मानता है कि पृष्ठभूमि का रंग आरजीबी है, आरजीबीए नहीं।
सिंह

यह असामान्य है कि RGBA (0,0,0,1) पूरी तरह से अपारदर्शी काला है। लेकिन दिए गए एल्गोरिदम के साथ, यह पूरी तरह से पारदर्शी काला होगा। मुझे लगता है कि एल्गोरिथ्म को फिर से दर्शाने के लिए यह एक अधिक उपयोगी संसाधन और प्रश्न का बेहतर उत्तर देगा।
ब्रायन रेनर

1
@BryanRayner ने मेरे उत्तर में कुछ संपादन जोड़े हैं। मैं इस उत्तर के लिए नियमित रूप से उत्थान कर रहा हूं, और यह संभव है कि कुछ लोग इसे पा रहे हैं, खुद को एल्गोरिथ्म में उलट कर रहे हैं। यह अधिक पूर्ण होता तो बेहतर होता। धन्यवाद।
एंड्रास ज़ोल्टन 21

2
अगर किसी को अभी भी दिलचस्पी है, तो यह JSBin रंग बदलने की अनुमति देता है। इसके अलावा यह एक javacript फ़ंक्शन के रूप में उपयोग करने के लिए तैयार है। मैंने सफेद रंग के रूप में BGColor का उपयोग किया, क्योंकि मैं सिर्फ मैट अवधारणा (खेद!) को नहीं समझता। लिंक इस प्रकार है: jsbin.com/qocixeh/edit?html,js,console,output और साथ ही एक जिस्ट : gist.github.com/vladimirbrasil/bd13985175757a1c8cb46fac93e733eb आशा है कि यह भी मदद करता है। उत्तर के लिए एक zillion धन्यवाद!
व्लादिमीर ब्रासील

40

हम्म ... के संबंध में

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) में बदल दिया जाएगा।


मेरा मानना ​​है कि आप सही हैं। विकिपीडिया और एंड्रास ज़ोल्टन का जवाब थोड़ा अलग है।
nacho4d

1
मैं सहमत हूं, इस संस्करण का उपयोग करें, न कि @Andras Zoltan का। परीक्षण परिदृश्य के लिए, दोनों फॉर्मूलों का उपयोग करके आरजीबी (0,0,0, .7) को बैकग्राउंड आरजीबी (255,255,255) में बदलें; hkurabko का निराला स्पष्ट रूप से सही उत्तर देता है।
रेयर

4
एंड्रास 0 अल्फा को अपारदर्शी और 255 को पारदर्शी के रूप में परिभाषित करता है, जबकि सीएसएस इसे विपरीत तरीके से परिभाषित करता है। यह उत्तर अल्फा की सीएसएस परिभाषा के साथ काम करता है।
केसी चू

1
+1 यह अल्फा की सबसे आम परिभाषा (0 = पारदर्शी) के साथ काम करता है, जैसे ओपनजीएल, एसडीएल, ग्राफिक्स एडिटर।
DL

+1 - और मैंने अल्फा के साथ काम करने के अपने उत्तर को 'सही तरीके से राउंड' होने के साथ-साथ इसके अनुसार अपडेट किया है। विडंबना यह है कि ऐसा करने के लिए मेरे समाधान का उपयोग करने की कोशिश करने पर, मैं मानता हूं कि मेरा मूल उत्तर, हालांकि इसने अपनी तरह का अर्थ बनाया, वास्तव में अधिकांश अनुप्रयोगों के लिए काम नहीं किया।
एंड्रास ज़ोल्टन

8

मेरे मामले में, मैं आरजीबीए छवि को आरजीबी में बदलना चाहता था और निम्नलिखित ने उम्मीद के मुताबिक काम किया:

rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)

5

यह आपके द्वारा उपयोग किए जाने वाले रंग स्थान पर निर्भर करता है। यदि RGBA पूर्व-गुणा रंग-स्थान में है और अर्ध-पारदर्शी है, तो आपको सही RGB रंग प्राप्त करने के लिए अल्फा को विभाजित करना होगा। यदि रंग गैर-पूर्व गुणा रंग-स्थान में है, तो आप अल्फा चैनल को छोड़ सकते हैं।


1

यहां एंड्रास और हुरकबको के उत्तरों के अनुसार एक सुविधाजनक एसएएस फ़ंक्शन है।

@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);
}

sass में, हम उपयोग कर सकते हैं:mix($color, white, $alpha*100)
S.Serpooshan

1

यहाँ कुछ जावा कोड है (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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.