Я пытаюсь загрузить файл 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;
}