【问题标题】:R function for RGBA to HEX color conversionRGBA到HEX颜色转换的R函数
【发布时间】:2020-07-13 14:26:17
【问题描述】:

我在 中寻找一些 可以将 颜色转换为十六进制,例如rgba(240, 177, 76, 0.80)。从 到十六进制转换有很多可用的功能,例如plotrix::rgb.to.hex() 但不适用于 RGBA。

非常感谢任何指针。

【问题讨论】:

  • 为什么不从 RGBA 转换为 RGB(参见答案here),然后从 RGB 转换为 HEX(使用 plotrix)?

标签: function r rgba rgb r hex rgb rgba


【解决方案1】:

这个话题已经讨论过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)

【讨论】:

  • 这个函数中的background_RGB和color_RGBA是什么?
  • 我编辑了我的答案。 RGBA 到 RGB 的转换需要定义 RGBA 颜色和背景颜色
【解决方案2】:

我觉得一种可能的解决方案是在颜色的 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()。我们可以用上面的其他 3 个绘制等效的 rgb 颜色(“eq”)

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 月 3 日创建

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2012-03-05
    • 2014-03-01
    • 1970-01-01
    • 2019-02-08
    • 2015-08-08
    • 2021-01-27
    • 2012-04-03
    相关资源
    最近更新 更多