在C#中使用RGB到CMYK的转换将PNG转换为TIFF

时间:2019-01-07 08:29:14

标签: c# png tiff cmyk

我正在尝试使用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;
}

0 个答案:

没有答案