- RGB bitmap to CMYK?
- Подсчитайте CMYK, чтобы прочитать глубину цвета?
илиНайти количество CMYK в растровых пикселях
- значения Count RGB (сделано), а не конвертировать RGB -> CMYK с использованием профиля ICC
Как найти процент CMYK в растровом изображении. Подобно API Ghostscript. Я не могу использовать это в своей программе, потому что он не управляется и не поддерживает параллельную обработку. Я сделал это с помощью RGB (as per this) , но для удобства принтера это нужно в CMYK.
public static bool IsCMYK(System.Drawing.Image image)
{
var flags = (ImageFlags)image.Flags;
if (flags.HasFlag(ImageFlags.ColorSpaceCmyk) || flags.HasFlag(ImageFlags.ColorSpaceYcck))
{
return true;
}
const int PixelFormat32bppCMYK = (15 | (32 << 8));
return (int)image.PixelFormat == PixelFormat32bppCMYK;
}
public void ImagemagicTool(Bitmap bi)
{
ImageMagick.MagickImage img = new MagickImage(bi);
string str= img.ColorSpace.ToString();
}
public ImageColorFormat GetColorFormat(Bitmap bitmap)
{
const int pixelFormatIndexed = 0x00010000;
const int pixelFormat32bppCMYK = 0x200F;
const int pixelFormat16bppGrayScale = (4 | (16 << 8));
// Check image flags
var flags = (ImageFlags)bitmap.Flags;
if (flags.HasFlag(ImageFlags.ColorSpaceCmyk) || flags.HasFlag(ImageFlags.ColorSpaceYcck))
{
return ImageColorFormat.Cmyk;
}
else if (flags.HasFlag(ImageFlags.ColorSpaceGray))
{
return ImageColorFormat.Grayscale;
}
// Check pixel format
var pixelFormat = (int)bitmap.PixelFormat;
if (pixelFormat == pixelFormat32bppCMYK)
{
return ImageColorFormat.Cmyk;
}
else if ((pixelFormat & pixelFormatIndexed) != 0)
{
return ImageColorFormat.Indexed;
}
else if (pixelFormat == pixelFormat16bppGrayScale)
{
return ImageColorFormat.Grayscale;
}
// Default to RGB
return ImageColorFormat.Rgb;
}
* Обновление: Похоже я должен отделить слои CMYK, а затем найти процент каждого из C, M, Y & K.How делать, что в растровом потоке? Это может быть сложным, для более простого подхода Находить RGB, а затем конвертировать RGB в CMYK на основе ICC США webcotedSWOP v2 .ICC ...
Просто пытаюсь с выше, оценить, чтобы поставить меня в правильном направлении
Теперь у меня есть значения propotionate CMYK для RGB в растровом изображении, но не уверены в желаемом результате в процентах, есть ли верхний предел для CMYK?
public static CMYK RGBtoCMYK(int red, int green, int blue)
{
double c = (double)(255 - red)/255;
double m = (double)(255 - green)/255;
double y = (double)(255 - blue)/255;
double min = (double)Math.Min(c, Math.Min(m, y));
if (min == 1.0)
{
return new CMYK(0, 0, 0, 1);
}
else
{
return new CMYK((c - min)/(1 - min), (m - min)/(1 - min), (y - min)/(1 - min), min);
}
}
public class CMYK
{
public double Cyan { get; set; }
public double Magenta { get; set; }
public double Yellow { get; set; }
public double Black { get; set; }
public CMYK()
{
}
public CMYK(double cyan, double magenta, double yellow,double black)
{
Cyan = cyan;
Magenta = magenta;
Yellow = yellow;
Black = black;
}
}
public static void GetRGBlock(Bitmap bmp)
{
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
List<System.Drawing.Color> cols = new List<System.Drawing.Color>();
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
int x = 0;
int y = 0;
int dx = 0;
int l = 0;
for (y = 0; y <= rect.Height - 1; y++)
{
l = y * bmpData.Stride;
//calulate line based on stride
for (x = 0; x <= rect.Width - 1; x++)
{
dx = l + x * 3;
//3 for RGB, 4 for ARGB, notice l is used as offset
cols.Add(System.Drawing.Color.FromArgb(rgbValues[dx + 2], rgbValues[dx + 1], rgbValues[dx]));
}
}
List<CMYK> cmykcols = new List<CMYK>();
foreach (var item in cols)
cmykcols.Add(RGBtoCMYK(item.R, item.G, item.B));
bmp.UnlockBits(bmpData);
bmp.Dispose();
}
Thnks, что вы подразумеваете под новым разделением при печати. Не стоит беспокоиться о задаче сканирования, FYI это только для существующих документов PDF, чтобы проверить покрытие чернил, как и в PDF Pro, когда вы проверяете вывод Preview вы детали покрытия чернил в процентах для каждой страницы. Я сделал это по RGB-растровому изображению и получил процент RGB, но мне нужно точное решение, соответствующее значениям CMYK. Как RGB в пикселях можно обнаружить CMYK? или мне нужно преобразовать RGB в CMYK с любыми формулами? – Jay
Если вы еще не собираетесь печатать документ, проблема проста. Затем вам нужно будет сделать преобразования цвета. Цветовая гамма цветового пространства RGB не однозначно сопоставляется с CMYK, поэтому ваши результаты могут оказаться не совсем корректными. Вы должны иметь возможность оценить какой-то канонический цветовой диапазон, чтобы дать вам покрытие. Вам нужно будет выполнить конверсии, если это необходимо для расчета в CMYK. Вы могли бы попытаться получить покрытие в RBG, по крайней мере, сначала. – Pekka
Я сделал это, теперь у меня есть информация о покрытии RGB, но лучше всего это значения RGB для преобразования CMYK или растрового изображения RGB в растровое изображение CMYK? – Jay