Преобразование PNG в TIFF с преобразованием RGB в CMYK в C # - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь загрузить файл PNG (из файла или потока) с моделью RGB, преобразовать его в формат TIFF в CMYK и сохранить обратно в файл / поток.

Какой самый эффективный способ сделать это?

Я пробовал несколько способов, в том числе: 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;
}
...