我正在尝试使用RGB模型加载PNG文件(从文件或流),将其转换为CMYK的TIFF,然后将其保存回文件/流。
最有效的方法是什么?
我尝试了多种方法,包括: 1)外部库,但是它们不会将颜色配置文件更改为CMYK。 2)下面的代码(使用颜色管理配置文件将像素从像素转换为颜色)。无法正确转换。每个像素具有黑色= 1,每隔一个颜色具有NaN。转换需要无限的时间。 3)使用Bitmap.Save方法保存文件(也不会另存为CMYK)
private static Bitmap ConvertFromPNGToTIFF(Bitmap inputPNG)
{
Bitmap result = new Bitmap(inputPNG);
for (int column = 0; column < inputPNG.Width; column++)
{
for (int row = 0; row < inputPNG.Height; row++)
{
Color pixel = inputPNG.GetPixel(column, row);
float[] cmykPixel = RgbToCmyk(pixel.R, pixel.G, pixel.B);
media.Color cmykColor = media.Color.FromValues(cmykPixel,
new System.Uri(@"C:\Users\Admin\Desktop\pngtotiff\ISOcoated_v2_300_eci.icc"));
result.SetPixel(column, row,
Color.FromArgb(cmykColor.A, cmykColor.R, cmykColor.G, cmykColor.B));
}
}
return result;
}
static float[] RgbToCmyk(byte red, byte green, byte blue)
{
float black = ToSingle(System.Math.Min(1.0 - red / 255.0, System.Math.Min(1.0 - green / 255.0, 1.0 - blue / 255.0)));
float cyan = ToSingle((1.0 - (red / 255.0) - black) / (1.0 - black));
float magenta = ToSingle((1.0 - (green / 255.0) - black) / (1.0 - black));
float yellow = ToSingle((1.0 - (blue / 255.0) - black) / (1.0 - black));
return new[] { cyan, magenta, yellow, black };
}
public static float ToSingle(double value)
{
return (float)value;
}