原文

概要


除了标准RGB(sRGB)之外,Android 8.0(API级别26)还引入了对额外色彩空间的色彩管理支持,以 在具有兼容显示的设备上呈现图形。有了这种支持,您的应用程序可以通过Java或本地代码来呈现通过PNG,JPEG和WebP文件加载的嵌入式宽色彩配置文件的位图。使用OpenGL或Vulkan的应用程序可以直接输出宽色域内容(使用Display P3和 scRGB)。此功能对于创建涉及高保真色彩再现的应用程序非常有用,例如图像和视频编辑应用程序。

了解宽色域模式


宽色彩配置文件是 ICC配置文件,如 Adobe RGB, Pro Photo RGB和 DCI-P3,它们可以表示比sRGB更广泛的颜色。支持宽色配置文件的屏幕可以显示深色原色(红色,绿色和蓝色)以及更丰富的次色(如洋红色,青色和×××)的图像。

在支持Android 8.0(API级别26)或更高级别的Android设备上,您的应用可以启用广色域色彩模式,以便系统识别并正确处理嵌入了宽色彩配置文件的位图图像。本 ColorSpace.Named类枚举Android支持常用的颜色空间的部分列表。

注意:启用宽色域模式后,活动窗口会使用更多的内存和GPU处理来进行画面构图。在启用宽色域模式之前,您应该仔细考虑该活动是否真正从中受益。例如,以全屏显示照片的活动很适合广泛的色域模式,但显示小缩略图的活动则不适用。

启用宽色域模式


使用该colorMode属性请求在兼容设备上以宽色域模式显示活动。在宽色域模式下,可以在sRGB色域外渲染窗口以显示更鲜艳的色彩。如果设备不支持广色域渲染,则此属性不起作用。如果您的应用需要确定给定的显示器是否具有宽色域功能,请调用该 isWideColorGamut()方法。您的应用程序也可以调用 isScreenWideColorGamut(),true 仅当显示器具有广泛的色域能力并且该设备支持广色域色彩渲染时才会返回。

显示器可能具有广泛的色域能力,但无法进行色彩管理,在这种情况下,系统不会授予应用广泛的色域模式。当显示器未经过颜色管理时(例如8.0之前的所有Android版本),系统都会将应用程序绘制的颜色重新映射到显示器的色域。

要在您的活动中启用宽色域,请将该colorMode 属性设置为wideColorGamut您的AndroidManifest.xml文件中。您需要为每个要启用宽色模式的活动执行此操作。

android:colorMode="wideColorGamut"

您还可以通过调用setColorMode(int)方法并传入,以 编程方式在您的活动中设置颜色模式 COLOR_MODE_WIDE_COLOR_GAMUT。

呈现宽色域内容


要呈现宽色域内容,您的应用必须加载宽色位图,该色位图是颜色配置文件包含比sRGB更宽的色彩空间的位图。常见的宽色彩配置文件包括Adobe RGB,DCI-P3和Display P3。

您的应用程序可以通过调用来查询位图的颜色空间 getColorSpace()。要确定系统是否将特定色彩空间识别为广色域,可以调用该 isWideGamut()方法。

的Color类可以表示与包装成一个64位长的值四个分量的滤色器,代替使用一个整数值的最常见表示。使用较长的值,可以比整数值更精确地定义颜色。如果您需要将颜色创建或编码为长整型值,请使用该类pack()中的其中一种方法Color。

您可以通过检查该getColorMode()方法是否返回 来验证您的应用是否正确请求了广色域模式COLOR_MODE_WIDE_COLOR_GAMUT(但此方法并未指示实际授予了广色域模式)。

图1.显示P3(橙色)与sRGB(白色)色彩空间

在本地代码中使用广泛的色域支持


本节介绍如何在OpenGL和 Vulkan API中启用宽色域模式( 如果您的应用程序使用本机代码)。

OpenGL的

为了在OpenGL中使用宽色域模式,您的应用程序必须包含具有以下扩展名之一的EGL 1.4库:

  • EGL_EXT_gl_colorspace_display_p3
  • EGL_EXT_gl_colorspace_scrgb
  • EGL_EXT_gl_colorspace_scrgb_linear

要启用此功能,您必须首先通过eglChooseConfig以下三种颜色缓冲区格式中的一种创建GL上下文 ,以在属性中实现宽色。宽色彩的颜色缓冲区格式必须是以下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

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交换链 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 supportedreturn false;
}

Lastest Update:2018.04.25

联系我

QQ:94297366

微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

转载于:https://blog.51cto.com/4789781/2120595

图片和图形之扩展色彩内容增强图形(20)相关推荐

  1. 图形创意与色彩审美在平面设计中的重要性

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 图形创意与色彩审美在平面设计中的重要性?平面设计是研究图形信息传递与色彩审美交流的视觉艺术.图形本身是视觉空间中的一 ...

  2. android百分比扩展枯,Android 增强版百分比布局库 为了适配而扩展

    一 概述 上周一我们发布了Android 百分比布局库(percent-support-lib) 解析与扩展中对percent-support这个库进行了解析和添加了PercentLinearLayo ...

  3. CAD机械图纸转PNG图片怎么设置输出的色彩和背景颜色—迅捷CAD转换器

    在机械制图的过程中,CAD图纸转格式也是很常见的一种,但是CAD格式是一种特殊的的文件格式,所以我们需要查看图纸的话,就只能使用专业的CAD看图软件才能进行查看,而DWG格式的图纸文件虽然保密性比较强 ...

  4. ChatGPT正当时,让我们一起深耕智能内容生成和智能内容增强领域

    ChatGPT以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人的能力.很多人都预测 2023 年将是 AI 生成之年,也许我们将迎来继农业革命.工业革命以来的第三种通用技术的普及 ...

  5. xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页,解决内容断开的问题

    xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页,解决内容断开的问题 参考文章: (1)xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页 ...

  6. html 高度不够,HTML/CSS:Div未扩展到内容高度

    我有几个未扩展的div元素以匹配其内容的高度.我已经读过,这可能是由浮动内容引起的;这个内容不是浮动的 - 虽然我开始觉得我应该把我的电脑扔在河里.这算不算?HTML/CSS:Div未扩展到内容高度 ...

  7. ai怎么让图片任意变形_为什么AI软件将图形等比例缩小会变形?如何样可以要图形不变形?...

    回答: AI中么把图像等比例扩大或缩小尺寸步骤如下: 1.打开AI的软件,执行菜单栏中文件-新建,或者直接使用快捷键Ctrl+N新建一个画布. 2.选择工具箱中的心形工具,将填充设置为红色,描边设置为 ...

  8. jmeter监听器之图形监控扩展

    一.插件下载 1.JmeterPlugins-Standard 插件:https://jmeter-plugins.org/downloads/old/ 路径中下载1.4.0版本. 2.ServerA ...

  9. (专升本)Word插入操作(图片、剪贴画、屏幕截图、自选图形)

    插入操作 插入图片和剪贴画 插入图片的操作 插入屏幕截图操作 插入自选图形操作 插入图片和剪贴画 #mermaid-svg-opQA9LcRgVCMFcHM .label{font-family:'t ...

最新文章

  1. Typescript学习笔记(二)
  2. OO实现ALV TABLE 四:ALV的显示样式
  3. django-中间件的执行流程
  4. 【WPF】WPF DataGrid List数据源 双向绑定通知机制之ObservableCollection使用以及MultiBinding 的应用...
  5. 9-算法 希尔排序 shell_sort
  6. linux yum安装jdk
  7. 计算机硬件的基本结构和工作原理
  8. 基于模糊RBF神经网络轨迹跟踪matlab程序
  9. 今日芯声 | 马赛克一键变高清!神奇的AI“无损放大”工具
  10. 进行网络数据采集时用 CSS——避免蜜罐
  11. android 手势输入法,基于触摸屏的手势输入法
  12. 设置linux kernel 日志打印方法
  13. 基于STM32F103ZET6的多路复用模拟开关设计
  14. ubuntu卸载xilinx
  15. [C#]ActiveX因安全性被阻止的问题
  16. Bitmap中的getPixels方法的小小应用
  17. 百度云服务器网络检查,百度推出网站安全监测平台,为服务器提供安全漏洞扫描...
  18. 使用预测性维护提高效率,延长运行时间
  19. 计算机磁盘碎片产生原因及处理方法,电脑不定期清理磁盘碎片,会导致出现这些问题...
  20. 【地图转换工具类】:GCJ02与WGS84标准转换

热门文章

  1. Java作业 大于某个数的最小质数
  2. OEM操作系统序列号查询大法
  3. 最新ZoneAlarm防火墙的配置设置及使用教程(附加世界个人防火墙排行)
  4. android背景气泡,android之View跟LinearLayout的重写(实现背景气泡和波纹效果)
  5. 物联网平台构架系列 (二):Amazon, Microsoft, IBM IoT 解决方案导论 之 设备
  6. 零基础如何学习CAD
  7. 2018年中国外贸进出口总值30.51万亿元 贸易顺差收窄
  8. android电视自动关机,android实现自动关机的具体方法
  9. “果粉”速递:简单9步轻松绕过iCloud 激活锁
  10. Volley传入请求体不成功的解决方案