2013-09-23 1 views
1
  1. RGB bitmap to CMYK?
  2. Подсчитайте CMYK, чтобы прочитать глубину цвета?

илиНайти количество CMYK в растровых пикселях

  1. значения 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(); 
    } 

ответ

1

Сканер, вероятно, использует цветовую модель RGB для хранения изображений. Если вы хотите восстановить что-то близкое к истинному разнесению цветов, вам нужно будет сканировать изображение с разрешением намного выше исходного экрана, а затем найти отдельные цветные точки.

В целом это невозможно, так как цвета CMYK могут быть напечатаны с уклоном, а много нелинейных цветовых пространств в печати из-за чернил, бумаги, восприятия читателя сделают это сложным.

Ваш лучший подход, вероятно, состоит в том, чтобы восстановить растровое изображение RGB, а затем снова создать новые разделения при печати. Проблема в том, что вы можете увидеть артефакты Moiré в результирующих изображениях.

+0

Thnks, что вы подразумеваете под новым разделением при печати. ​​Не стоит беспокоиться о задаче сканирования, FYI это только для существующих документов PDF, чтобы проверить покрытие чернил, как и в PDF Pro, когда вы проверяете вывод Preview вы детали покрытия чернил в процентах для каждой страницы. Я сделал это по RGB-растровому изображению и получил процент RGB, но мне нужно точное решение, соответствующее значениям CMYK. Как RGB в пикселях можно обнаружить CMYK? или мне нужно преобразовать RGB в CMYK с любыми формулами? – Jay

+0

Если вы еще не собираетесь печатать документ, проблема проста. Затем вам нужно будет сделать преобразования цвета. Цветовая гамма цветового пространства RGB не однозначно сопоставляется с CMYK, поэтому ваши результаты могут оказаться не совсем корректными. Вы должны иметь возможность оценить какой-то канонический цветовой диапазон, чтобы дать вам покрытие. Вам нужно будет выполнить конверсии, если это необходимо для расчета в CMYK. Вы могли бы попытаться получить покрытие в RBG, по крайней мере, сначала. – Pekka

+0

Я сделал это, теперь у меня есть информация о покрытии RGB, но лучше всего это значения RGB для преобразования CMYK или растрового изображения RGB в растровое изображение CMYK? – Jay