2015-01-26 13 views
17

संपादितमतभेद

एंड्रॉयड पैलेट वर्ग के लिए एक बेहतर महसूस करने के लिए, मैं अपनी सुविधाओं में से कुछ परीक्षण करने के लिए एक सरल अनुप्रयोग बनाने का फैसला किया है - अगर आप रुचि रखते हैं, तो आप ऐप पा सकते हैं Play Store पर: https://play.google.com/store/apps/details?id=com.tonyw.sampleapps.palettecolorextraction। असल में इसमें केवल छवियां और रंग हैं जो पैलेट क्लास निष्कर्ष (नीचे उल्लिखित) हैं, और आप अपनी छवियों को भी परीक्षण के लिए जोड़ सकते हैं। आप Github पर अपने स्रोत कोड पा सकते हैं: https://github.com/tony-w/PaletteColorExtraction

स्क्रीनशॉट Some pictures with corresponding extracted colors Another picture with extracted colors Title and body text color extracted based on background color

मूल पोस्ट

कोई रंग है कि एक बिटमैप से निकाला जा सकता के बीच मतभेदों को वर्णन कर सकते Android's Palette class का उपयोग कर?

  • वाइब्रेंट
  • वाइब्रेंट डार्क
  • वाइब्रेंट लाइट
  • म्यूट कर दिया गया
  • म्यूट कर दिया गया डार्क
  • म्यूट कर दिया गया लाइट

यह है कि अभी फीके रंग जीवंत रंग से duller हैं है? अंधेरे और प्रकाश को क्रमशः लॉलीपॉप के अंधेरे और हल्के भौतिक डिजाइन विषयों से बेहतर मिलान करना चाहिए?

उत्तर

27

यह वास्तव में एक अच्छा सवाल है। यदि आप source code देखते हैं तो आप देख सकते हैं कि विभिन्न स्विच को छवि पर पिक्सेल की एचएसएल रंग प्रोफ़ाइल का विश्लेषण करने के लिए चुना जाता है, चमक, संतृप्ति और जनसंख्या के लिए लक्षित श्रेणियों के आधार पर (छवि में कितने पिक्सल का प्रतिनिधित्व किया जाता है) नमूना)। यह ल्यूमिनेंस, संतृप्ति, फिर आबादी को दी गई वरीयता के साथ भारित औसत गणना का उपयोग करता है।

आम तौर पर बोलते हुए, जीवंत रंग म्यूट रंगों से अधिक संतृप्त होते हैं, काले रंग गहरे होते हैं, और हल्के स्विच हल्के होते हैं। आप जो भी उपयोग करते हैं वह उस समग्र प्रभाव पर निर्भर करता है जो आप चाहते हैं।

क्रिस बन wrote in his blog "वाइब्रेंट और डार्क वाइब्रेंट वे हैं जो डेवलपर अधिकतर उपयोग करेंगे" लेकिन व्यवहार में यह उतना आसान नहीं है।

Google IO 2014 से Romain Guy's sample app में applyPalette विधि में पाया गया एक उदाहरण है, हालांकि कोड मानता है कि विभिन्न स्विच मिलेंगे (संभवतः क्योंकि वह ज्ञात छवियों के साथ काम कर रहा है)।

छवि के आधार पर, यह संभव है कि कुछ स्वैच प्रकार नहीं मिलेगा, इसलिए अपने कोड में उस संभावना के लिए जिम्मेदार रहें।

उदाहरण के लिए, आप पैलेट से एक विशिष्ट क्रम में स्विच प्राप्त करने का प्रयास कर सकते हैं, उदा। एक डार्क थीम के लिए आप वाइब्रेंट डार्क, फिर म्यूट डार्क प्राप्त करने का प्रयास कर सकते हैं, और उसके बाद कुछ डिफ़ॉल्ट रंग पर वापस आ सकते हैं।

public static Palette.Swatch getDominantSwatch(Palette palette) { 
    // find most-represented swatch based on population 
    return Collections.max(palette.getSwatches(), new Comparator<Palette.Swatch>() { 
     @Override 
     public int compare(Palette.Swatch sw1, Palette.Swatch sw2) { 
      return Integer.compare(sw1.getPopulation(), sw2.getPopulation()); 
     } 
    }); 
} 

प्रत्येक नमूना के लिए एचएसएल मान भी जाया जा सकता है, तो आप लिख सकते हैं:

आप कुछ है कि थोड़ा अधिक उम्मीद के मुताबिक है चाहते हैं, यह भी संभव है इस तरह सबसे अधिक प्रतिनिधित्व रंग हड़पने के लिए, है चुनने के लिए एक समान दिनचर्या, उदाहरण के लिए, सबसे संतृप्त स्वैच प्रभावशाली रंग नहीं है।


का उपयोग करते हुए कस्टम लक्ष्य

एक और बात जो मुझे उपयोगी कुछ कस्टम लक्ष्यों, विभिन्न भार के साथ, में Palette.Target में परिभाषित 6 लक्ष्यों के अतिरिक्त परिभाषित करने और हल्कापन और संतृप्ति मूल्यों को लक्षित करने के लिए है एक उपयोगी रंग खोजने का मौका बढ़ाने के लिए आदेश।

उदाहरण के लिए, आप सबसे प्रमुख रंग है कि इस तरह एक लक्ष्य के साथ वर्तमान फिल्टर मानदंडों को पूरा करती लिए एक नमूना शामिल करने के लिए पैलेट के प्रमात्रक पूछ सकते हैं:

public static final Target DOMINANT; 

static { 
    DOMINANT = new Target.Builder().setPopulationWeight(1f) 
            .setSaturationWeight(0f) 
            .setLightnessWeight(0f) 
            .setExclusive(false) 
            .build(); 
} 

और तुम कुछ उपयोगी नमूनों है कि एक डाल प्राप्त कर सकते हैं इस तरह शेयर का लक्ष्य एक से हल्कापन पर उच्च प्राथमिकता: के बाद यह उत्पन्न होता है

public static final Target DARK; 
public static final Target LIGHT; 
public static final Target NEUTRAL; 

static { 
    DARK = new Target.Builder().setMinimumLightness(0f) 
           .setTargetLightness(0.26f) 
           .setMaximumLightness(0.5f) 
           .setMinimumSaturation(0.1f) 
           .setTargetSaturation(0.6f) 
           .setMaximumSaturation(1f) 
           .setPopulationWeight(0.18f) 
           .setSaturationWeight(0.22f) 
           .setLightnessWeight(0.60f) 
           .setExclusive(false) 
           .build(); 

    LIGHT = new Target.Builder().setMinimumLightness(0.50f) 
           .setTargetLightness(0.74f) 
           .setMaximumLightness(1.0f) 
           .setMinimumSaturation(0.1f) 
           .setTargetSaturation(0.7f) 
           .setMaximumSaturation(1f) 
           .setPopulationWeight(0.18f) 
           .setSaturationWeight(0.22f) 
           .setLightnessWeight(0.60f) 
           .setExclusive(false) 
           .build(); 

    NEUTRAL = new Target.Builder().setMinimumLightness(0.20f) 
            .setTargetLightness(0.5f) 
            .setMaximumLightness(0.8f) 
            .setMinimumSaturation(0.1f) 
            .setTargetSaturation(0.6f) 
            .setMaximumSaturation(1f) 
            .setPopulationWeight(0.18f) 
            .setSaturationWeight(0.22f) 
            .setLightnessWeight(0.60f) 
            .setExclusive(false) 
            .build(); 
} 

आप नमूना उपयोग कर सकते हैं एक कस्टम लक्ष्य के लिए मिला Palette.getSwatchForTarget का उपयोग कर, उदाहरण के लिए द्वारा:

Palette.Swatch neutral = Palette.getSwatchForTarget(NEUTRAL); 

डिफ़ॉल्ट फ़िल्टर के बारे में पता

डिफ़ॉल्ट Palette तक एक Palette.Filter रंग काला या सफेद, साथ ही रंग "बहुत लाल मैं रेखा के पास" करने के लिए बहुत निकट को खारिज कर दिया है कि हो सकता है जो मुझे विश्वास है कि आइसोक्रोनस रंग का जिक्र है जो लाल-अंधेरे रंग अंधापन वाले लोगों के लिए मुश्किल है।

मेरा सिद्धांत यह है कि यह संतृप्ति भारित होने पर "संतृप्त" रंगों के रूप में चुने जाने से रोकने में मदद के लिए निकट-सफेद और नज़दीकी काले रंगों को अस्वीकार करता है।

इस फ़िल्टर का नतीजा यह है कि छवियों के लिए कोई स्वैच नहीं मिलेगा जिसमें पूरी तरह से लगभग सफेद और/या लगभग काले पिक्सल होते हैं, साथ ही साथ गुलाबी रंग के रंगों को चुनने से बचने की प्रवृत्ति भी होती है।

हालांकि, Palette.Builder.clearFilters() का उपयोग करके इस फ़िल्टर को निकालना संभव है, और अपना खुद का फ़िल्टर Palette.Builder.addFilter() के साथ जोड़ें।

Palette palette = new Palette.Builder(bitmap).addTarget(DOMINANT) 
              .addTarget(DARK) 
              .addTarget(LIGHT) 
              .addTarget(NEUTRAL) 
              .generate(); 
if(palette.getSwatches().isEmpty()) { 
    Log.v(TAG, "Getting alternate (UNFILTERED) palette."); 
    palette = new Palette.Builder(bitmap).addTarget(DOMINANT) 
             .addTarget(DARK) 
             .addTarget(LIGHT) 
             .addTarget(NEUTRAL) 
             .clearFilters() /// allow isBlack(), isWhite(), isNearRedILine() 
             .generate(); 
} 

प्रयास श्रृंखलन सबसे में डिफ़ॉल्ट फ़िल्टर की उपयोगिता को बरकरार रखता है:

मेरी कोड में मैं एक पैलेट पैदा करने पर एक दूसरा प्रयास बनाने के लिए अगर पहला प्रयास किसी भी नमूनों वापस नहीं करता है चुन लिया है मामले, लेकिन फिर भी आपको छवियों के लिए स्विच खोजने की अनुमति देता है जो डिफ़ॉल्ट पूरी तरह से अस्वीकार कर देगा।

+1

ग्रेट उत्तर, धन्यवाद! स्विचेस नहीं मिलने पर भी मैं अच्छे फॉलबैक के विचारों की सराहना करता हूं। :) –

+0

पैलेट-वी 7: 25.0 के रूप में।0, अब GetDominantSwatch नामक एक सुविधा विधि है - एक कस्टम विधि को लागू करना अब आवश्यक नहीं होना चाहिए। बाकी का जवाब अभी भी वैध और अच्छा है! –

+0

@ डेविडडॉयल हाँ, सच! उन्होंने एक समकक्ष विधि जोड़ा जो उच्चतम आबादी के साथ स्वैच चुनता है। हालांकि मुझे अपने कोड में प्रवेश करना होगा, मैंने इसे प्रमुख लक्ष्य (आबादी के वजन 1 एफ और अन्य वजन 0 एफ के साथ) का उपयोग करने के लिए और अधिक प्रभावी पाया है क्योंकि यह उन लोगों के बीच सबसे अधिक आबादी वाले स्विच को चुनने के बजाय समग्र रूप से अधिक प्रभावशाली रंग पाता है जो अन्य लक्ष्य मानदंडों से मिले (VIBRANT, म्यूट, इत्यादि)। –