9
votes

Convertir la couleur RVB en CMJN?

Je recherche un algorithme pour convertir une couleur RVB en CMJN. Photoshop effectue la conversion ci-dessous:

r = 220 G = 233 B = 174

c = 15 M = 0 Y = 40 K = 0


1 commentaires

Cela semble être sur l'algorithme lui-même; Si vous voulez juste CMJN de RVB et ne vous souciez pas de la façon dont cela est fait, utilisez ImageMagick / Magick.net, comme on le demande et répondit ici: Stackoverflow .com / questions / 10032335 / ...


7 Réponses :


7
votes

Consultez ce lien: http://www.codeproject.com/kb/applications /xcmyk.aspx . Il 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) 


6 commentaires

Remarque: pendant que la conversion s'approche, la plupart du temps ne correspond pas Photoshop. La comparaison des couleurs générées dans Photoshop produira souvent des résultats différents aussi. Il n'y a pas de conversion directe, mais elle est souvent assez proche.


Le code trouvé ici utilise la formule ci-dessus: JavasCriper.net/faq/rgb2cmyk.htm


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


@DominicmCdonnell pouvons-nous dire que la prise minimale de RGB pour Noir est correcte ? Comme certains sites Web ont des formules avec maximum, par exemple Site Web rapide Tableaux . Pourquoi il y a des formules de différence avec minimum & maximum , je n'ai pas compris.


@ Formule Wade-Watt dans ce site Web: 1-max (r, g, b). 1-max (r, g, b) == min (1-r, 1-b, 1-g). C'est une façon différente de calculer la même chose.


Oh, je viens de me rendre compte que, voici les différentes formules avec le même calcul, merci



10
votes

La conversion de RVB en CMYK dépend du périphérique / processus physique utilisé pour allonger l'encre CMYK. Celles-ci sont représentées dans des logiciels sous forme de profils de couleur. ICC et ICM Les profils de couleurs des périphériques physiques déterminent les couleurs résultantes.

Si vous n'êtes pas préoccupé par une représentation vraie sur un périphérique physique, utilisez les formules de conversion directe dans d'autres messages.

Si, toutefois, vous êtes concerné par cet aspect, vous devez utiliser un API de gestion des couleurs Windows ou quelque chose comme Littlecms pour faire les conversions de couleur pour vous (comme Ils appliquent le profil de couleur approprié pendant la conversion).


0 commentaires

4
votes

Si vous voulez un bon résultat, vous devez appliquer un profil de couleur. En .NET, vous pouvez le faire comme ça (en supposant que les composants CMJJ 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);


1 commentaires

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



0
votes

Je pense que Photoshop utilise des conversions basées sur le profil. Jetez un coup d'œil à la documentation pour les options de couleur . Si tel est le cas, vous ne pourrez pas correspondre à ce comportement avec des solutions simples basées sur la formule.

J'ai trouvé des LCMS très utiles, simples et efficaces pour ce type de tâche.Je ne savez pas s'il y a une liaison .NET pour cela ...


0 commentaires

0
votes

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

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


0 commentaires

3
votes

Mon exemple complet pour la conversion C # 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 };
    }
 }


0 commentaires

0
votes

Pour convertir RVB en CMJN, vous pouvez utiliser Bibliothèque ColorHelper .

public static CMYK RgbToCmyk(RGB rgb)
{
    double modifiedR, modifiedG, modifiedB, c, m, y, k;

    modifiedR = rgb.R / 255.0;
    modifiedG = rgb.G / 255.0;
    modifiedB = rgb.B / 255.0;

    k = 1 - new List<double>() { modifiedR, modifiedG, modifiedB }.Max();
    c = (1 - modifiedR - k) / (1 - k);
    m = (1 - modifiedG - k) / (1 - k);
    y = (1 - modifiedB - k) / (1 - k);

    return new CMYK(
        (byte)Math.Round(c * 100),
        (byte)Math.Round(m * 100),
        (byte)Math.Round(y * 100),
        (byte)Math.Round(k * 100));
}


0 commentaires