2010-03-11 62 views
8

Estoy buscando un algoritmo para convertir un color RGB a CMYK. Photoshop está realizando la conversión a continuación:¿Convertir color RGB a CMYK?

R = 220 G = 233 B = 174

C = 15 M = 0 Y = 40 K = 0

+0

Esto parece ser sobre el algoritmo en sí mismo; si solo quiere CMYK desde RGB y no le importa cómo se hace, simplemente use ImageMagick/Magick.Net, tal como se lo preguntan y responden aquí: http: // stackoverflow.com/questions/10032335/how-can-i-convert-an-upload-image-of-rgb-format-to-cmyk-format-in-net –

Respuesta

4

Salida este enlace: http://www.codeproject.com/KB/applications/xcmyk.aspx. Da esta fórmula.

Black = minimum(1-Red,1-Green,1-Blue) 
Cyan = (1-Red-Black)/(1-Black) 
Magenta = (1-Green-Black)/(1-Black) 
Yellow = (1-Blue-Black)/(1-Black) 
+0

Nota: Mientras la conversión se acerca, la mayoría de las veces ganó 't partido photoshop. La comparación de los colores generados en photoshop a menudo producirá resultados diferentes también. No hay conversión directa, pero a menudo es lo suficientemente cerca. –

+0

El código que se encuentra aquí está utilizando la fórmula anterior: http://www.javascripter.net/faq/rgb2cmyk.htm –

+3

También es importante tener en cuenta que la fórmula anterior supone que el rojo, el verde y el azul se han normalizado (entre 0.0 y 1.0) –

10

La conversión de RGB a CMYK es dependiente en el dispositivo/proceso físico que se utiliza para depositar la tinta CMYK. Estos están representados en el software como perfiles de color. ICC y ICM Los perfiles de color de los dispositivos físicos determinan los colores resultantes.

Si no le preocupa la representación verdadera en un dispositivo físico, utilice las fórmulas de conversión directa en otras publicaciones.

Si, sin embargo, le preocupa este aspecto, entonces necesita usar Windows Color Management APIs o algo así como LittleCMS para realizar las conversiones de color (ya que aplican el perfil de color adecuado durante la conversión).

5

Si desea obtener buenos resultados, debe aplicar un perfil de color. En .NET, puede hacerlo así (asumiendo que los componentes CMYK originales están en el rango entre 0 y 255):

float[] colorValues = new float[4]; 
colorValues[0] = c/255f; 
colorValues[1] = m/255f; 
colorValues[2] = y/255f; 
colorValues[3] = k/255f; 

System.Windows.Media.Color color = Color.FromValues(colorValues, 
    new Uri(@"C:\Users\me\Documents\ISOcoated_v2_300_eci.icc")); 
System.Drawing.Color rgbColor = System.Drawing.Color.FromArgb(color.R, color.G, color.B); 

Tenga en cuenta que se utilizan dos clases de color diferente al de dos espacios de nombres diferentes. Y probablemente necesite agregar la DLL de PresentationCore como referencia.

El perfil de color requerido se puede descargar desde la sección de descargas de eci.org. Es parte de un archivo ZIP más grande que contiene varios perfiles. Ellos explícitamente recomiendan usar el perfil ISO Coated v2 300% (ECI).

Si necesita convertir una imagen completa de CMYK a RGB, hay clases especiales para esto en el mismo espacio de nombres.

+0

La cuestión es convertir de RGB a CMYK, no al revés. –

0

Creo que photoshop usa conversiones basadas en perfiles. Eche un vistazo al the documentation for the color options. Si es el caso, no podrá hacer coincidir este comportamiento con soluciones simples basadas en fórmulas.

he encontrado LCMS a ser muy práctico, sencillo y eficaz para este tipo de task.I no sabe si hay alguna .NET vinculante para ella ...

0

Estoy de acuerdo con las respuestas anteriores, pero quiero decir que:

if (K == 1) 
{ 
    C = 0 
    M = 0 
    Y = 0 
} 

que puede ser si r = g = b = 0.

3

Mi ejemplo completo para C# conversión entre CMYK < -> HEX:

public class ColorConverter 
{ 
    public static string CMYKtoHex(decimal[] cmyk) 
    { 
     if (cmyk.Length != 4) return null; 

     var r = (int)(255 * (1 - cmyk[0]) * (1 - cmyk[3])); 
     var g = (int)(255 * (1 - cmyk[1]) * (1 - cmyk[3])); 
     var b = (int)(255 * (1 - cmyk[2]) * (1 - cmyk[3])); 

     var hex = "#" + r.ToString("X2") + g.ToString("X2") + b.ToString("X2"); 
     return hex; 
    } 

    public static decimal[] HexToCMYK(string hex) 
    { 
     decimal computedC = 0; 
     decimal computedM = 0; 
     decimal computedY = 0; 
     decimal computedK = 0; 

     hex = (hex[0] == '#') ? hex.Substring(1, 6) : hex; 

     if (hex.Length != 6) 
     { 
      return null; 
     } 

     decimal r = int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); 
     decimal g = int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); 
     decimal b = int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); 

     // BLACK 
     if (r == 0 && g == 0 && b == 0) 
     { 
      computedK = 1; 
      return new[] { 0, 0, 0, computedK }; 
     } 

     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; 

     return new[] { computedC, computedM, computedY, computedK }; 
    } 
} 
Cuestiones relacionadas