代码之家  ›  专栏  ›  技术社区  ›  geotheory

R中的CMY颜色函数

r
  •  9
  • geotheory  · 技术社区  · 12 年前

    有没有 CMY colour 任何R包中的函数等价于 rgb() ? {base}或{colorSpace}中似乎没有任何内容。我有一个自定义功能,可以在这里发布,但最好是本地人。

    4 回复  |  直到 12 年前
        1
  •  10
  •   hrbrmstr    12 年前

    这应该行得通

    #' assumes integer input for CMYK
    cmyk <- function(C,M,Y,K) {
    
      C <- C / 100.0
      M <- M / 100.0
      Y <- Y / 100.0
      K <- K / 100.0
    
      n.c <- (C * (1-K) + K)
      n.m <- (M * (1-K) + K)  
      n.y <- (Y * (1-K) + K)
    
      r.col <- ceiling(255 * (1-n.c))
      g.col <- ceiling(255 * (1-n.m))
      b.col <- ceiling(255 * (1-n.y))
    
      return(col2rgb(sprintf("#%02s%02s%02s",
                         as.hexmode(r.col), 
                         as.hexmode(g.col), 
                         as.hexmode(b.col))))
    
    }
    
    > cmyk(0,50,85,0)
          [,1]
    red    255
    green  128
    blue    39
    
    > cmyk(0,0,100,0)
          [,1]
    red    255
    green  255
    blue     0
    
        2
  •  1
  •   geotheory    12 年前

    除了@hrbrmstr的功能之外,这里还有我的功能。我没有考虑到黑色,因为我知道这主要是为了打印,但我认为这主要是一个dataviz工具。它应该与向量/矩阵/字母一起工作。

    cmy = function(c, m, y, alpha, maxColorValue=1){
      if(maxColorValue != 1) { c <- c/maxColorValue; m <- m/maxColorValue; y <- y/maxColorValue }
      c <- 1-c; m <- 1-m; y <- 1-y
      hex <- function(v) substring(rgb(v,0,0),2,3)
      if(!missing(alpha)) alpha <- hex(alpha) else alpha <- ''
      paste0('#',hex(c), hex(m), hex(y), alpha)
    }
    
        3
  •  1
  •   Carl Witthoft    12 年前

    如果你对代码移植感兴趣,我发现了几个MatLab Central的可能性:

    http://www.mathworks.com/matlabcentral/fileexchange/25350-fit-multi-dimensional-polynomial (尽管有名字,但描述中写着“CMYK to Lab”

    http://www.mathworks.com/matlabcentral/fileexchange/45723-convert-rgb-image-to-cmy-image-and-extract-each-component-cyan-c-magenta-m-and-yellow-y

    编辑:如果您想反转hrbmstr的代码,这里有一些javascript可以很容易地转换为R http://www.javascripter.net/faq/rgb2cmyk.htm ):

     if (r==0 && g==0 && b==0) {
      computedK = 1;
      return [0,0,0,1];
     }
    
     computedC = 1 - (r/255);
     computedM = 1 - (g/255);
     computedY = 1 - (b/255);
    
     var minCMY = Math.min(computedC,
                  Math.min(computedM,computedY));
     computedC = (computedC - minCMY) / (1 - minCMY) ;
     computedM = (computedM - minCMY) / (1 - minCMY) ;
     computedY = (computedY - minCMY) / (1 - minCMY) ;
     computedK = minCMY;
    
        4
  •  0
  •   DhruvJoshi    12 年前

    是的,有一种方法可以使用CMYK颜色代替RGB进行打印。如果设置 colormodel 到CMYK,您可以使用CMYK颜色。

    阅读有关此的详细信息 link 和一个例子 here