9

RGB カラーを CMYK に変換するアルゴリズムを探しています。Photoshop は以下の変換を実行しています。

R=220 G=233 B=174

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

4

7 に答える 7

10

RGB から CMYK への変換は、CMYK インクを配置するために使用される物理デバイス/プロセスに依存します。これらはソフトウェアでカラー プロファイルとして表されます。 物理デバイスのICCおよびICMカラー プロファイルによって、結果の色が決まります。

物理デバイスでの真の表現に関心がない場合は、他の投稿で直接変換式を使用してください。

ただし、この側面に関心がある場合は、Windows カラー管理 APIまたはLittleCMSなどを使用して色変換を行う必要があります (変換中に適切なカラー プロファイルが適用されるため)。

于 2010-03-11T16:04:27.317 に答える
8

このリンクをチェックしてください: http://www.codeproject.com/KB/applications/xcmyk.aspx。この式が得られます。

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) 
于 2010-03-11T15:57:44.753 に答える
4

良い結果が必要な場合は、カラー プロファイルを適用する必要があります。.NET では、次のように実行できます (元の CMYK コンポーネントが 0 から 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);

2 つの異なる名前空間の 2 つの異なる Color クラスが使用されていることに注意してください。おそらく、PresentationCore DLL を参照として追加する必要があります。

必要なカラー プロファイルは、 eci.orgのダウンロード セクションからダウンロードできます。これは、複数のプロファイルを含む大きな ZIP ファイルの一部です。ISO Coated v2 300% (ECI) プロファイルの使用を明示的に推奨しています。

完全なイメージを CMYK から RGB に変換する必要がある場合、同じ名前空間にこのための特別なクラスがあります。

于 2010-12-10T19:08:17.060 に答える
3

CMYK <-> HEX 間の C# 変換の完全な例:

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 };
    }
 }
于 2014-05-12T08:35:56.807 に答える
2

前の回答に同意しますが、言いたいのは次のとおりです。

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

r = g = b = 0 の場合は可能です。

于 2014-03-04T17:09:27.583 に答える
0

Photoshop はプロファイル ベースの変換を使用していると思います。color options のドキュメントを参照してください。その場合、この動作を単純な数式ベースのソリューションと一致させることはできません。

この種のタスクには、LCMS が非常に便利で、シンプルで、効率的であることがわかりました。.net バインディングがあるかどうかはわかりません...

于 2012-10-05T19:26:15.717 に答える