I recently learned how to remove transparency from a color but keep the color itself:
library(scales)
# approach for colors
show_col("green")

# make light transparent green
alpha("green",0.3) -> transparent_green
# keep the light green but remove transparency
ch <- rgb2hsv(col2rgb(transparent_green))
nontransparent_green <- hsv(h=ch["h",], v=ch["v",], s=0.3)
#compare greens
show_col(c(transparent_green,nontransparent_green))

Created on 2022-11-26 with reprex v2.0.2
however, this does not work for greys:
library(scales)
# aprroach for grey
show_col("grey10")

# make light transparent grey
alpha("grey10",0.3) -> transparent_grey
# keep the light grey but remove transparency
ch <- rgb2hsv(col2rgb(transparent_grey))
nontransparent_grey <- hsv(h=ch["h",], v=ch["v",], s=0.3)
#compare greys
show_col(c(transparent_grey,nontransparent_grey))

Created on 2022-11-26 with reprex v2.0.2
You could try this little function which should work irrespective of the starting colour.
de_alpha <- function(col) {
col <- col2rgb(col, alpha = TRUE)
alpha <- col[4,]
col <- col[1:3,]
whiteness <- (255 - alpha)/255
do.call(rgb, as.list((col + (255 - col) * whiteness)/255))
}
This works on green giving the same result:
transparent_green <- scales::alpha("green", 0.3)
nontransparent_green <- de_alpha(transparent_green)
scales::show_col(c(transparent_green, nontransparent_green))

But also works on your grey example:
transparent_grey <- scales::alpha("grey10", 0.3)
nontransparent_grey <- de_alpha(transparent_grey)
scales::show_col(c(transparent_grey, nontransparent_grey))

Created on 2022-11-26 with reprex v2.0.2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With