它們之間顏色效果會存在一些差異,爲了減少這些差異可以通過一下計算方式去匹配出對應的顏色數據。
/// <summary>
/// CMYK列印顏色
/// </summary>
public sealed class CMYKColor
{
#region --- 成員 Begin ---
[CompilerGenerated]
private double _C;
/// <summary>
/// C值
/// </summary>
public double C
{
[CompilerGenerated]
get { return _C; }
[CompilerGenerated]
set { _C = value; }
}
[CompilerGenerated]
private double _M;
/// <summary>
/// M值
/// </summary>
public double M
{
[CompilerGenerated]
get { return _M; }
[CompilerGenerated]
set { _M = value; }
}
[CompilerGenerated]
private double _Y;
/// <summary>
/// Y值
/// </summary>
public double Y
{
[CompilerGenerated]
get { return _Y; }
[CompilerGenerated]
set { _Y = value; }
}
[CompilerGenerated]
private double _K;
/// <summary>
/// K值
/// </summary>
public double K
{
[CompilerGenerated]
get { return _K; }
[CompilerGenerated]
set { _K = value; }
}
#endregion --- 成員 End ---
#region --- 構造方法 Begin ---
/// <summary>
/// CMYKColor默認構造方法
/// </summary>
public CMYKColor()
{
this._C = 0.0;
this._M = 0.0;
this._Y = 0.0;
this._K = 1.0;
}
/// <summary>
/// CMYKColor使用Int值模式賦值
/// </summary>
/// <param name="c">C 取值範圍0~100</param>
/// <param name="m">M 取值範圍0~100</param>
/// <param name="y">Y 取值範圍0~100</param>
/// <param name="k">K 取值範圍0~100</param>
public CMYKColor(int c, int m, int y, int k)
{
if (c >= 0 && c <= 100)
{
this._C = c / 100.0;
}
else
{
this._C = 0.0;
}
if (m >= 0 && m <= 100)
{
this._M = m / 100.0;
}
else
{
this._M = 0.0;
}
if (y >= 0 && y <= 100)
{
this._Y = y / 100.0;
}
else
{
this._Y = 0.0;
}
if (k >= 0 && k <= 100)
{
this._K = k / 100.0;
}
else
{
this._K = 1.0;
}
}
/// <summary>
/// CMYKColor使用Double值模式賦值
/// </summary>
/// <param name="c">C 取值範圍1~0.00</param>
/// <param name="m">M 取值範圍1~0.00</param>
/// <param name="y">Y 取值範圍1~0.00</param>
/// <param name="k">K 取值範圍1~0.00</param>
public CMYKColor(double c, double m, double y, double k)
{
this._C = c;
this._M = m;
this._Y = y;
this._K = k;
}
/// <summary>
/// CMYKColor使用System.Drawing.Color賦值
/// </summary>
/// <param name="color">顏色類型</param>
public CMYKColor(Color color)
{
this.ColorToCMYKColor(color);
}
#endregion --- 構造方法 End ---
#region --- 轉換方法 Begin ---
/// <summary>
/// 從顏色類型轉換爲CMYKColor
/// </summary>
/// <param name="color">需要轉換的顏色</param>
public void ColorToCMYKColor(Color color)
{
double numR = ((double)(0xff - color.R)) / 255;
double numG = ((double)(0xff - color.G)) / 255;
double numB = ((double)(0xff - color.B)) / 255;
double numContrast = Math.Min(numR, Math.Min(numG, numB));
if (numContrast == 1)
{
this._C = 0.0;
this._M = 0.0;
this._Y = 0.0;
this._K = 1.0;
}
else
{
this._C = (numR - numContrast) / (1 - numContrast);
this._M = (numG - numContrast) / (1 - numContrast);
this._Y = (numB - numContrast) / (1 - numContrast);
this._K = numContrast;
}
}
/// <summary>
/// 從CMYK轉換爲Color
/// </summary>
/// <returns></returns>
public Color CMYKColorToColor()
{
return Color.FromArgb(Convert.ToInt32((double)(((1 - this._C) * (1 - this._K)) * 255)), Convert.ToInt32((double)(((1 - this._M) * (1 - this._K)) * 255)), Convert.ToInt32((double)(((1 - this._Y) * (1 - this._K)) * 255)));
}
/// <summary>
/// 獲取CMYK的百分比
/// </summary>
/// <param name="value">C or M or Y or K</param>
/// <param name="digits">小數後多少位</param>
/// <returns></returns>
public double GetPercent(double value, int digits)
{
return Math.Round((double)(value * 100), digits);
}
#endregion --- 轉換方法 End ---
/// <summary>
/// 顯示CMYK各值的百分比
/// </summary>
/// <returns></returns>
public override string ToString()
{
int digits = 2;
return string.Format("C={0}%; M={1}%; Y={2}%; K={3}%", this.GetPercent(this._C, digits), this.GetPercent(this._M, digits), this.GetPercent(this._Y, digits), this.GetPercent(this._K, digits));
}
}