2014-03-12 22 views
3

是否有CMY colour功能在任何R包中相当于rgb()? {base}或例如{}色彩空间。我有一个自定义函数,我可以在这里发布,但本地人会更可取。R中的CMY颜色功能

+0

'library(sos); findFn(“cmyk”)'找不到任何有用的东西,所以它可能不存在。奇怪。 –

+0

如果有任何帮助,我写了一个函数'XYZ2lab'。我知道这不是你要求的颜色空间,但是让我知道,我会通过电子邮件发送或张贴它作为答案。 –

回答

3

这应该工作

#' 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 
+0

,或者您可以轻敲除法并指定十进制格式的CMYK百分比。还有一些其他的优化可以完成,但它完成了工作:-) – hrbrmstr

0

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

仔细阅读本link和细节的例子here

+0

是的,我看到了那个页面。但除非我错过了一些东西,它只是指定输出文件的色彩空间。它不是R中用于将变量映射到青色,品红色或黄色通道并返回一个十六进制颜色字符串。 – geotheory

+0

@geotheory据我所知,可悲的是你不能那样做。您可以使用自己的功能将RGB映射到CMYK,反之亦然。我假设您使用CMYK进行打印以降低色域。 – DhruvJoshi

+0

其实我只是想使用rgb的替代方法创建数据可视化:)让我们看看是否有其他人知道解决方案。 – geotheory

1

如果你到代码移植,我发现一对夫妇MATLAB中心的可能性:

http://www.mathworks.com/matlabcentral/fileexchange/25350-fit-multi-dimensional-polynomial (尽管名称,描述说:“CMYK以实验室的

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可以TRIV ially可以转换为http://www.javascripter.net/faq/rgb2cmyk.htm [R提供):

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; 
1
除了

好于@ hrbrmstr的功能这里是我的什么它的价值。我没有考虑黑色,因为我明白这主要是为了打印,但我主要将它看作是一种dataviz工具。它应该与向量/矩阵/ alphas一起工作。

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) 
}