2013-09-23 74 views
1
  1. RGB位圖到CMYK?
  2. 計算CMYK以讀取顏色深度?

在位圖像素中查找CMYK計數

  1. 計數RGB值(已完成),而不是RGB轉換 - >使用CMYK ICC配置文件

如何找到CMYK的位圖的百分比。與Ghostscript API類似。我不能在我的程序中使用它,因爲它不受管理,並且不支持並行處理。我已經使用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 ...

與上述只是想,體會到把我在正確的方向


現在我已經獲得了位圖中RGB的CMYK propotionate值,但不確定所需結果的百分比,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

Thiks,打印時新的分隔意味着什麼。沒有必要擔心掃描作業,僅供參考當PDF文檔檢查輸出時,只有現有PDF文檔才能檢查墨水覆蓋率預覽給出你爲每個頁面的百分比油墨覆蓋率的詳細信息。我是通過RGB位圖來獲取RGB百分比,但我需要與Adobe CMYK值相匹配的精確解決方案。像RGB中的像素可以檢測CMYK?或者我需要用任何公式將RGB轉換爲CMYK? – Jay

+0

如果您不打算再次打印文檔,則問題更簡單。您仍然需要進行顏色轉換。 RGB色彩空間的色域沒有唯一地映射到CMYK,因此您的結果可能不完全正確。你應該能夠評估某種規範的色彩範圍,以給你的覆蓋面。如果必須在CMYK中進行計算,則需要執行轉換。你可以嘗試在RBG中獲得覆蓋面,至少首先。 – Pekka

+0

我已經這樣做了,現在我有RGB覆蓋細節,但哪一個最好是將CMYK轉換爲RGB值還是將RGB位圖轉換爲CMYK位圖? – Jay