2010-03-11 5 views
8

Je suis à la recherche d'un algorithme pour convertir une couleur RVB en CMJN. Photoshop effectue la conversion ci-dessous:Convertir les couleurs RVB en CMJN?

R = 220 G = 233 B = 174

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

+0

Cela semble être à propos de l'algorithme lui-même; Si vous voulez juste CMJN de RVB et ne se soucient pas comment c'est fait, il suffit d'utiliser ImageMagick/Magick.Net, comme cela est demandé et répondu ici: http: // stackoverflow.com/questions/10032335/how-can-i-convert-an-upload-image-of-rgb-format-to-cmyk-format-in-net –

Répondre

4

Voir ce lien: http://www.codeproject.com/KB/applications/xcmyk.aspx. Ça donne cette formule.

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

Note: Bien que la conversion se rapproche, la plupart du temps elle a gagné pas correspondre à photoshop. Comparer les couleurs générées dans photoshop produira souvent des résultats différents aussi. Il n'y a pas de conversion directe, mais c'est souvent assez proche. –

+0

Le code trouvé ici est en utilisant la formule ci-dessus: http://www.javascripter.net/faq/rgb2cmyk.htm –

+3

Il est également important de noter que la formule ci-dessus suppose que le rouge, le vert et le bleu ont été normalisés (entre 0.0 et 1.0). –

10

La conversion de RVB en CMJN dépend du dispositif physique/procédé étant utilisé pour fixer l'encre CMJN. Ceux-ci sont représentés dans les logiciels en tant que profils de couleurs. ICC et ICM les profils de couleur des périphériques physiques déterminent les couleurs résultantes.

Si vous n'êtes pas concerné par une représentation réelle sur un périphérique physique, utilisez les formules de conversion directe dans d'autres publications. Si toutefois vous êtes concerné par cet aspect, alors vous devez utiliser soit le Windows Color Management APIs ou quelque chose comme LittleCMS pour faire les conversions de couleur pour vous (car ils appliquent le bon profil de couleur pendant la conversion).

5

Si vous voulez un bon résultat, vous devez appliquer un profil de couleur. Dans .NET, vous pouvez le faire comme ça (en supposant que les composants CMJN d'origine sont compris entre 0 et 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); 

Notez que deux classes de couleurs différentes de deux espaces de noms différents sont utilisés. Et vous avez probablement besoin d'ajouter la DLL PresentationCore en tant que référence.

Le profil de couleur requis peut être téléchargé à partir de la section des téléchargements de eci.org. Cela fait partie d'un fichier ZIP plus volumineux contenant plusieurs profils. Ils recommandent explicitement d'utiliser le profil ISO Coated v2 300% (ECI).

Si vous avez besoin de convertir une image complète de CMJN en RVB, il existe des classes spéciales pour cela dans le même espace de noms.

+0

La question est de convertir de RVB en CMJN, pas l'inverse. –

0

Je pense que Photoshop utilise des conversions basées sur des profils. Jetez un oeil à the documentation for the color options. Si c'est le cas, vous ne serez pas en mesure de faire correspondre ce comportement avec des solutions basées sur des formules simples.

J'ai trouvé LCMS d'être très pratique, simple et efficace pour ce genre de task.I ne sait pas s'il y a un .net contraignant pour elle ...

0

Je suis d'accord avec les réponses précédentes, mais je tiens à dire que:

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

Il peut être si r = g = b = 0.

3

Mon exemple complet pour C# conversion entre CMJN < -> 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 }; 
    } 
} 
Questions connexes