用于RGBA到HEX颜色转换的R函数

R function for RGBA to HEX color conversion

我正在寻找一些 in which can convert a color to Hex e.g. rgba(240, 177, 76, 0.80). There are plethora of functions available from 到十六进制的转换,例如plotrix::rgb.to.hex() 但不适用于 RGBA。

非常感谢任何指点。

这个话题已经讨论过Convert RGBA to HEX 但是,我不知道 R 包提供了随时可用的功能。

您可以将 RGBA 转换为 RGB:

由于这取决于背景像素的颜色 (Convert RGBA color to RGB),因此您必须定义背景颜色。 color_RGBA 是您的 RGBA 颜色,background_RGB 是背景颜色。 你可以把col2rgb("white")当作background_RGB来举例。

rgba2rgb <- function(background_RGB, color_RGBA){

  # get alpha
  alpha=color_RGBA[4]

  # get new color  
  new_col=matrix(c(
    (1 - alpha) * background_RGB[1] + alpha * color_RGBA[1],
    (1 - alpha) * background_RGB[2] + alpha * color_RGBA[2],
    (1 - alpha) * background_RGB[3] + alpha * color_RGBA[3]),
    nrow=3,ncol=1,dimnames=list(c("red","green","blue"))
  )
  return(new_col)
}

然后将 RGB 转换为 HEX:

rgb2hex <- function(x) rgb(x[1], x[2], x[3], maxColorValue = 255)

我觉得一种可能的解决方案是在颜色的 rgb 定义中添加 alpha 值(透明度)。您可以使用添加 alpha 参数的 rgb() 函数来完成。如果颜色通道 r、g 和 b 在 0 和 255 之间,则必须使用 maxColorValue = 255 并在 0 和 255 之间表示 alpha,其中 0 对应于完全透明,255 对应于完全不透明(全彩)

让我展示一下您案例的结果 rgba(240, 177, 76, 0.80):

your_color <- rgb(240, 177, 76, alpha = 0.8 * 255, maxColorValue = 255)
# equivalent to
# your_color <- rgb(t(c(240, 177, 76)/ 255), alpha = 0.8)
your_color
#> [1] "#F0B14CCC"

我会将你的颜色与其他人一起绘制,以便更好地了解应用的透明度。

  • 全彩
full_color <- rgb(240, 177, 76, alpha = 255, maxColorValue = 255)
full_color
#> [1] "#F0B14CFF"
# equivalent to "#F0B14C"
  • 半透明色
half_transparent <- rgb(t(c(240, 177, 76)/255), alpha = 0.5)
half_transparent 
#> [1] "#F0B14C80"

old_par <- par(mar = c(1, 0, 0.5 ,0) + 0.1, mgp = c(1, 0, 0))
barplot(rep(1, 3), names.arg = c("yours", "full", "half"), 
  col = c(your_color, full_color, half_transparent), axes = FALSE, cex.names = 1)
par(old_par)

另一个问题是,哪种完整的 RGB 颜色相当于具有透明度级别的给定颜色。 @capcoma 的回答在这里有所帮助。使用

background_color <- col2rgb("white")
background_color
#>       [,1]
#> red    255
#> green  255
#> blue   255

your_color_rgb <- col2rgb(your_color, alpha = T)
your_color_rgb
#>       [,1]
#> red    240
#> green  177
#> blue    76
#> alpha  204

alpha <- your_color_rgb[4, 1]/255
alpha
#> alpha 
#>   0.8

new_rgb <- (1-alpha) * background_color + alpha * your_color_rgb[-4, 1, drop = FALSE]
new_rgb_equivalent <- rgb(t(new_rgb), maxColorValue = 255)
new_rgb_equivalent
#> [1] "#F3C06F"

new_rgb 的表达式完全等同于@capcoma 的函数rgba2rgb()。我们可以绘制等效的 rgb 颜色(“eq”)与上面的其他 3 个

old_par <- par(mar = c(1, 0, 0.5 ,0) + 0.1, mgp = c(1, 0, 0))
barplot(rep(1, 4), names.arg = c("yours", "full", "half", "eq"), 
  col = c(your_color, full_color, half_transparent, 
  new_rgb_equivalent), axes = FALSE, cex.names = 0.8)
par(old_par)

第 1 列和第 4 列的颜色应该相同。希望你觉得这很有用。

reprex package (v0.3.0)

于 2020-12-03 创建