當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。