वाइड कलर कॉन्टेंट की मदद से ग्राफ़िक को बेहतर बनाएं

Android 8.0 (एपीआई लेवल 26) के साथ, रंग को मैनेज करने की सुविधा जोड़ी गई color स्पेस इसके अलावा साथ काम करने वाले डिसप्ले वाले डिवाइसों पर ग्राफ़िक रेंडर करने के लिए, स्टैंडर्ड आरजीबी (sRGB). इस सहायता की मदद से, आपका ऐप्लिकेशन PNG, JPEG, और WebP फ़ाइलों से लोड की गई, एम्बेड की गई वाइड कलर प्रोफ़ाइलों का इस्तेमाल करके बिटमैप रेंडर कर सकता है Java या नेटिव कोड के ज़रिए कॉपी करें. OpenGL या Vulkan का इस्तेमाल करने वाले ऐप्लिकेशन में, कई रंगों में उपलब्ध कॉन्टेंट सीधे तौर पर जनरेट किया जा सकता है (Display P3 और scRGB के तौर पर डालें. यह सुविधा, इमेज और वीडियो एडिटिंग जैसे ऐप्लिकेशन बनाने के लिए ज़रूरी है. इन ऐप्लिकेशन में, हाई फ़िडेलिटी वाले रंगों का इस्तेमाल किया जाता है.

वाइड कलर गैमट मोड के बारे में जानकारी

चौड़ी रंग प्रोफ़ाइल हैं आईसीसी प्रोफ़ाइल, जैसे Adobe आरजीबी, Pro Photo RGB, और DCI-P3, जो कि sRGB से ज़्यादा रंगों की रेंज दिखा सकता है. जिन स्क्रीन पर वाइड कलर प्रोफ़ाइल काम करती हैं उन पर इमेज को गहरे प्राइमरी रंगों (लाल, हरे, और नीले) के साथ-साथ बेहतर सेकंडरी रंगों (जैसे, मैजेंटा, सियान, और पीले) में दिखाया जा सकता है.

Android 8.0 (एपीआई लेवल 26) या उसके बाद के वर्शन वाले ऐसे Android डिवाइसों पर, आपका ऐप्लिकेशन किसी गतिविधि के लिए वाइड कलर गैमट कलर मोड चालू कर सकता है. इससे सिस्टम, एम्बेड की गई वाइड कलर प्रोफ़ाइल वाली बिटमैप इमेज को पहचानता है और सही तरीके से प्रोसेस करता है. कॉन्टेंट बनाने ColorSpace.Named क्लास, आम तौर पर इस्तेमाल किए जाने वाले डेटा की आंशिक सूची को शामिल करती है कलर स्पेस, जो Android पर काम करते हैं.

ध्यान दें: वाइड कलर गैमट मोड चालू होने पर, विंडो स्क्रीन कंपोज़िशन के लिए ज़्यादा मेमोरी और जीपीयू प्रोसेसिंग का इस्तेमाल करती है. वाइड कलर गैमट मोड चालू करने से पहले, आपको ध्यान से यह देखना चाहिए कि क्या गतिविधि को इससे सचमुच फ़ायदा मिलेगा. उदाहरण के लिए, ऐसी गतिविधि जिससे फ़ुलस्क्रीन में फ़ोटो दिखाई जा रही हैं, ऐसे में वाइड कलर गैमट मोड का इस्तेमाल करना सही रहता है, लेकिन अगर किसी गतिविधि में छोटे थंबनेल दिखाए गए हैं, तो यह ज़रूरी नहीं है.

वाइड कलर गैमट मोड चालू करें

colorMode एट्रिब्यूट का इस्तेमाल करके, गतिविधि को काम करने वाले डिवाइसों पर वाइड कलर गैमट मोड में दिखाने का अनुरोध करें. वाइड कलर गैमट मोड में, ज़्यादा चमकीले रंग दिखाने के लिए, विंडो sRGB गैमट के बाहर रेंडर कर सकती है. अगर डिवाइस पर वाइड कलर सुविधा काम नहीं करती है गैमट रेंडरिंग, इस एट्रिब्यूट का कोई असर नहीं पड़ता. अगर आपके ऐप्लिकेशन को यह तय करना है कि डिसप्ले में ज़्यादा रंगों का इस्तेमाल किया जा सकता है. isWideColorGamut() तरीका. आपका ऐप्लिकेशन isScreenWideColorGamut() को भी कॉल कर सकता है. यह true को सिर्फ़ तब दिखाता है, जब डिसप्ले में वाइड कलर गैमट की सुविधा हो और डिवाइस में वाइड कलर गैमट वाली कलर रेंडरिंग की सुविधा काम करती हो.

डिसप्ले में अलग-अलग रंगों का इस्तेमाल किया जा सकता है, लेकिन रंगों को मैनेज नहीं किया जा सकता. ऐसे मामले में, सिस्टम, किसी ऐप्लिकेशन को वाइड कलर गैमट मोड इस्तेमाल करने की अनुमति नहीं देगा. जब किसी डिसप्ले को रंग से मैनेज नहीं किया जाता —जैसा कि Android के 8.0 से पहले के सभी वर्शन में होता था—यह सिस्टम, ऐप्लिकेशन की मदद से, डिसप्ले के गैमट में दिखाए गए रंग.

अपनी गतिविधि में कई रंगों का इस्तेमाल करने की सुविधा चालू करने के लिए, colorMode को सेट करें अपनी AndroidManifest.xml फ़ाइल में, wideColorGamut एट्रिब्यूट की वैल्यू सबमिट करें. आपने लोगों तक पहुंचाया मुफ़्त में ऐसा हर उस गतिविधि के लिए करना होगा जिसके लिए आपको वाइड कलर मोड चालू करना है.

android:colorMode="wideColorGamut"

आप setColorMode(int) मेथड और पासिंग इन COLOR_MODE_WIDE_COLOR_GAMUT.

वाइड कलर गैमट वाले कॉन्टेंट को रेंडर करना

पहली इमेज. Display P3 (नारंगी) बनाम sRGB (सफ़ेद) कलर स्पेस

वाइड कलर गामट कॉन्टेंट रेंडर करने के लिए, आपके ऐप्लिकेशन को वाइड कलर बिटमैप लोड करना होगा. ऐसी कलर प्रोफ़ाइल जिसमें sRGB से ज़्यादा बड़ा कलर स्पेस हो. सामान्य वाइड कलर प्रोफ़ाइलों में ये शामिल हैं Adobe RGB, DCI-P3, और Display P3.

आपका ऐप्लिकेशन, getColorSpace() को कॉल करके बिटमैप के कलर स्पेस के बारे में क्वेरी कर सकता है. यह पता लगाने के लिए कि सिस्टम करने के लिए एक विशिष्ट रंग स्थान है, तो आप isWideGamut() तरीका.

Color क्लास की मदद से, किसी रंग को चार कॉम्पोनेंट के साथ दिखाया जा सकता है. ये कॉम्पोनेंट, 64-बिट की लंबी वैल्यू में पैक किए जाते हैं. आम तौर पर, रंग को दिखाने के लिए पूर्णांक वैल्यू का इस्तेमाल किया जाता है. लंबी वैल्यू का इस्तेमाल करके, पूर्णांक वैल्यू की तुलना में रंगों को ज़्यादा सटीक तरीके से तय किया जा सकता है. अगर आपको किसी रंग को लंबी वैल्यू के तौर पर बनाना या कोड में बदलना है, तो Color क्लास में मौजूद pack() तरीकों में से किसी एक का इस्तेमाल करें.

यह पुष्टि की जा सकती है कि आपके ऐप्लिकेशन ने वाइड कलर गैमट मोड का सही तरीके से अनुरोध किया है या नहीं. इसके लिए, देखें कि getColorMode() तरीका COLOR_MODE_WIDE_COLOR_GAMUT दिखाता है या नहीं. हालांकि, इस तरीके से यह पता नहीं चलता कि वाइड कलर गैमट मोड की अनुमति दी गई है या नहीं.

नेटिव कोड में वाइड कलर गैमट सहायता का इस्तेमाल करें

अगर आपका ऐप्लिकेशन नेटिव कोड का इस्तेमाल करता है, तो इस सेक्शन में OpenGL और Vulkan एपीआई की मदद से, वाइड कलर गैमट मोड को चालू करने का तरीका बताया गया है.

OpenGL

OpenGL में वाइड कलर गैमट मोड का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन में EGL 1.4 लाइब्रेरी के साथ इनमें से कोई एक एक्सटेंशन शामिल होना चाहिए:

सुविधा चालू करने के लिए, पहले आपको इसके ज़रिए जीएल कॉन्टेक्स्ट बनाना होगा eglChooseConfig, तीनों में से किसी एक के साथ एट्रिब्यूट में चौड़े रंग के लिए कलर बफ़र फ़ॉर्मैट. वाइड के लिए कलर बफ़र फ़ॉर्मैट रंग, RGBA वैल्यू के इनमें से एक सेट का होना चाहिए:

  • 8, 8, 8, 8
  • 10, 10, 10, 2 से
  • FP16, FP16, FP16, FP16

इसके बाद, रेंडर टारगेट बनाते समय P3 कलर स्पेस एक्सटेंशन का अनुरोध करें, जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:

std::vector<EGLint> attributes;
attributes.push_back(EGL_GL_COLORSPACE_KHR);
attributes.push_back(EGL_GL_COLORSPACE_DISPLAY_P3_EXT);
attributes.push_back(EGL_NONE);
engine->surface_ = eglCreateWindowSurface(
    engine->display_, config, engine->app->window, attributes.data());

वल्कन

वाइड कलर गैमट के लिए Vulkan की सुविधा यहां दी गई है: VK_EXT_swapchain_colorspace एक्सटेंशन.

अपने Vulkan कोड में वाइड कलर की सुविधा चालू करने से पहले, पहले यह देख लें कि vkEnumerateInstanceExtensionProperties के ज़रिए एक्सटेंशन काम करता है या नहीं. अगर एक्सटेंशन उपलब्ध है, तो आपको vkCreateInstance के दौरान इसे चालू करना होगा. ऐसा तब करना होगा, जब एक्सटेंशन के ज़रिए तय किए गए अतिरिक्त कलर स्पेस का इस्तेमाल करने वाली कोई स्वैपचैन इमेज बनाई जा रही हो.

स्वैपचेन बनाने से पहले, आपको अपनी पसंद का कलर स्पेस चुनना होगा. इसके बाद, और उसके लिए एक मान्य कलर फ़ॉर्मैट चुनें. कलर स्पेस.

Android डिवाइसों पर, Vulkan इन कलर स्पेस और VkSurfaceFormatKHR कलर फ़ॉर्मैट के साथ वाइड कलर गैमट के साथ काम करता है:

  • Vulkan वाइड कलर गैमट कलर स्पेस:
    • VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT
    • VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT
  • वाइड कलर गैमट के साथ काम करने वाले Vulkan कलर फ़ॉर्मैट:
    • VK_FORMAT_R16G16B16A16_SFLOAT
    • VK_FORMAT_A2R10G10B10_UNORM_PACK32
    • VK_FORMAT_R8G8B8A8_UNORM

नीचे दिए गए कोड स्निपेट में, यह पता करने का तरीका बताया गया है कि डिवाइस, Display P3 के साथ काम करता है या नहीं कलर स्पेस:

uint32_t formatCount = 0;
vkGetPhysicalDeviceSurfaceFormatsKHR(
       vkPhysicalDev,
       vkSurface,
       &formatCount,
       nullptr);
VkSurfaceFormatKHR *formats = new VkSurfaceFormatKHR[formatCount];
vkGetPhysicalDeviceSurfaceFormatsKHR(
       vkPhysicalDev,
       vkSurface,
       &formatCount,
       formats);

uint32_t displayP3Index = formatCount;
for (uint32_t idx = 0; idx < formatCount; idx++) {
 if (formats[idx].format == requiredSwapChainFmt &&
     formats[idx].colorSpace==VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT)
 {
   displayP3Index = idx;
   break;
 }
}
if (displayP3Index == formatCount) {
    // Display P3 is not supported on the platform
    // choose other format
}

नीचे दिया गया कोड स्निपेट यह बताता है कि Vulkan swapchain के लिए, किस तरह अनुरोध किया जा सकता है. VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT:

uint32_t queueFamily = 0;
VkSwapchainCreateInfoKHR swapchainCreate {
   .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
   .pNext = nullptr,
   .surface = AndroidVkSurface_,
   .minImageCount = surfaceCapabilities.minImageCount,
   .imageFormat = requiredSwapChainFmt,
   .imageColorSpace = VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT,
   .imageExtent = surfaceCapabilities.currentExtent,
   .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
   .preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
   .imageArrayLayers = 1,
   .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
   .queueFamilyIndexCount = 1,
   .pQueueFamilyIndices = &queueFamily,
   .presentMode = VK_PRESENT_MODE_FIFO_KHR,
   .oldSwapchain = VK_NULL_HANDLE,
   .clipped = VK_FALSE,
};
VkRresult status = vkCreateSwapchainKHR(
                       vkDevice,
                       &swapchainCreate,
                       nullptr,
                       &vkSwapchain);
if (status != VK_SUCCESS) {
    // Display P3 is not supported
    return false;
}