当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R make.rgb 创建色彩空间


R语言 make.rgb 位于 grDevices 包(package)。

说明

这些函数指定在 convertColor 中使用的颜色空间。

用法

make.rgb(red, green, blue, name = NULL, white = "D65",
         gamma = 2.2)

colorConverter(toXYZ, fromXYZ, name, white = NULL, vectorized = FALSE)

参数

red,green,blue

RGB 原色的色度(xy 或 xyY)

name

色彩空间的名称

white

指定参考白色的字符串(请参阅“详细信息”。)

gamma

显示伽玛(非线性)。正数或字符串"sRGB"

fromXYZ

从 XYZ 三刺激坐标转换到该空间的函数

toXYZ

从此空间转换为 XYZ 三刺激坐标的函数。

vectorized

fromXYZtoXYZ 是否在内部进行矢量化以处理输入颜色矩阵。

细节

RGB 颜色空间由红、绿、蓝三原色的色度定义。这些以 xyY 坐标中长度为 2 或 3 的向量给出(不使用 Y 分量,可以省略)。色度是相对于参考白色定义的,参考白色必须是 CIE 标准光源之一:"A"、"B"、"C"、"D50"、"D55"、"D60"、"E"(通常为 "D65")。

显示伽玛最常见的是 2.2,尽管 Apple RGB 使用 1.8。 sRGB 标准指定了一个更复杂的函数,接近 2.2 的 gamma; gamma = "sRGB" 使用此函数。

除了 RGB 之外的色彩空间可以通过 XYZ 三色坐标的转换来直接指定。这些函数应该有两个参数。第一个是给出一种颜色坐标的向量。第二个参数是参考白色。如果颜色空间的定义中包含特定的参考白色(对于 RGB 空间),则应忽略第二个参数,并且可能是 ...

从 R 3.6.0 开始,内置颜色转换器与 convertColor 一起被矢量化,以便在一次调用中处理三列颜色矩阵,而不是通过 apply 逐行处理。为了保持向后兼容性,colorConverterfromXYZtoXYZ 包装在 apply 循环中,以防它们也不支持矩阵输入。如果您使用的 fromXYZtoXYZ 函数一次在整个颜色矩阵上正确运行,而不是逐行运行,则可以设置 vectorized=TRUE 以提高性能。

colorConverter 类的对象

例子

(pal <- make.rgb(red =   c(0.6400, 0.3300),
                 green = c(0.2900, 0.6000),
                 blue =  c(0.1500, 0.0600),
                 name = "PAL/SECAM RGB"))

## converter for sRGB in #rrggbb format
hexcolor <- colorConverter(toXYZ = function(hex, ...) {
                            rgb <- t(col2rgb(hex))/255
                            colorspaces$sRGB$toXYZ(rgb, ...) },
                           fromXYZ = function(xyz, ...) {
                              rgb <- colorspaces$sRGB$fromXYZ(xyz, ...)
                              rgb <- round(rgb, 5)
                              if (min(rgb) < 0 || max(rgb) > 1)
                                   as.character(NA)
                              else rgb(rgb[1], rgb[2], rgb[3])},
                           white = "D65", name = "#rrggbb")

(cols <- t(col2rgb(palette())))
zapsmall(luv <- convertColor(cols, from = "sRGB", to = "Luv", scale.in = 255))
(hex <- convertColor(luv, from = "Luv",  to = hexcolor, scale.out = NULL))

## must make hex a matrix before using it
(cc <- round(convertColor(as.matrix(hex), from = hexcolor, to = "sRGB",
                          scale.in = NULL, scale.out = 255)))
stopifnot(cc == cols)

## Internally vectorized version of hexcolor, notice the use
## of `vectorized = TRUE`:

hexcolorv <- colorConverter(toXYZ = function(hex, ...) {
                            rgb <- t(col2rgb(hex))/255
                            colorspaces$sRGB$toXYZ(rgb, ...) },
                           fromXYZ = function(xyz, ...) {
                              rgb <- colorspaces$sRGB$fromXYZ(xyz, ...)
                              rgb <- round(rgb, 5)
                              oob <- pmin(rgb[,1],rgb[,2],rgb[,3]) < 0 |
                                     pmax(rgb[,1],rgb[,2],rgb[,3]) > 0
                              res <- rep(NA_character_, nrow(rgb))
                              res[!oob] <- rgb(rgb[!oob,,drop=FALSE])},
                           white = "D65", name = "#rrggbb",
                           vectorized=TRUE)
(ccv <- round(convertColor(as.matrix(hex), from = hexcolor, to = "sRGB",
                           scale.in = NULL, scale.out = 255)))
stopifnot(ccv == cols)

参考

Conversion algorithms from http://www.brucelindbloom.com.

也可以看看

convertColor

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Create colour spaces。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。