C# 查找位图像素中的CMYK计数 RGB位图到CMYK 计算CMYK以读取颜色深度

C# 查找位图像素中的CMYK计数 RGB位图到CMYK 计算CMYK以读取颜色深度,c#,wpf,printing,bitmap,cmyk,C#,Wpf,Printing,Bitmap,Cmyk,或 计算RGB值(完成),不使用ICC配置文件转换RGB-->CMYK 如何找到位图中CMYK的百分比。类似于Ghostscript API。我不能在我的程序中使用它,因为它不受管理,也不支持并行处理。我用RGB做了这个 ,但为了便于打印机,需要在CMYK中使用此功能 public static bool IsCMYK(System.Drawing.Image image) { var flags = (ImageFlags)image.Flags;

  • 计算RGB值(完成),不使用ICC配置文件转换RGB-->CMYK
  • 如何找到位图中CMYK的百分比。类似于Ghostscript API。我不能在我的程序中使用它,因为它不受管理,也不支持并行处理。我用RGB做了这个 ,但为了便于打印机,需要在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;
        }
    
    公共静态bool IsCMYK(System.Drawing.Image)
    {
    var flags=(ImageFlags)image.flags;
    if(flags.HasFlag(ImageFlags.ColorSpaceCmyk)| | flags.HasFlag(ImageFlags.ColorSpaceyck))
    {
    返回true;
    }
    
    const int PixelFormat32bppCMYK=(15 |(32扫描仪可能使用RGB颜色模型来存储图像。如果要恢复接近真实分色的图像,则需要以远高于原始屏幕的分辨率扫描图像,然后定位各个彩色点

    一般来说,这是不可能的,因为CMYK颜色可以故意重叠打印,并且打印时由于墨水、纸张和读者感知而产生的许多非线性颜色空间效果将使这种情况变得复杂


    最好的方法可能是恢复RGB位图,然后在打印时再次创建新的分色。问题是,您可能会在生成的图像中看到瑕疵。

    扫描仪可能使用RGB颜色模型来存储图像。如果要恢复接近真实分色的内容,则需要o以远高于原始屏幕的分辨率扫描图像,然后定位各个彩色点

    一般来说,这是不可能的,因为CMYK颜色可以故意重叠打印,并且打印时由于墨水、纸张和读者感知而产生的许多非线性颜色空间效果将使这种情况变得复杂


    您最好的方法可能是恢复RGB位图,然后在打印时再次创建新的分隔。问题是,您可能会在生成的图像中看到瑕疵。

    Thnks,打印时新的分隔是什么意思。无需担心扫描工作,仅供参考这仅用于现有PDF文档检查墨水封面年龄就像在PDF Pro中一样,当您检查输出预览时,会以百分比的形式显示每页的墨水覆盖率详细信息。我是通过RGB位图获得RGB百分比的,但我需要与adobe CMYK值匹配的精确解决方案。像像素中的RGB一样,可以检测CMYK?或者我需要使用任何公式将RGB转换为CMYK吗?如果如果您不打算再次打印文档,那么问题就简单了。您仍然需要进行颜色转换。RGB颜色空间的色域不会唯一映射到CMYK,因此您的结果可能不完全正确。您应该能够评估某种规范的颜色范围,以提供覆盖范围。您可以如果必须在CMYK中进行计算,则需要进行转换。您可以尝试至少首先在RBG中获得覆盖率。我已经这样做了,我现在有RGB覆盖率的详细信息,但RGB值到CMYK转换或RGB位图到CMYK位图哪个是最好的?我不确定这些有什么不同。如果您是在谈论我们对于这两种方法,使用不同的API,则必须查看它们各自的算法来决定更好地保留原始意图。在比较值时,还需要考虑CMYK中的非唯一性。还记得大多数颜色分离会选择性地重叠像素以允许墨水通过。您无法比较RGB值的原因是什么?这些值可能不相同,但具有足够的分辨率时,应给出具有代表性的计数。Thnks,打印时新的分隔是什么意思。扫描作业无需担心,仅供参考,这仅用于现有PDF文档检查墨水覆盖率,就像在PDF Pro中检查输出时一样t Preview为您提供每页的墨水覆盖率详细信息(百分比)。我通过RGB位图获得RGB百分比,但我需要与adobe CMYK值匹配的精确解决方案。像RGB(像素)一样,可以检测CMYK?或者我需要使用任何公式将RGB转换为CMYK吗?如果您不打算再次打印文档,则问题更简单。然后您仍然需要进行颜色转换。RGB颜色空间的色域不是唯一映射到CMYK的,因此您的结果可能不完全正确。您应该能够评估某种标准颜色范围以提供覆盖范围。如果是必要的,您需要进行转换tial要用CMYK进行计算。你可以尝试用RBG进行覆盖,至少首先是这样。我已经这样做了,我现在有RGB覆盖的详细信息,但是RGB值到CMYK转换或RGB位图到CMYK位图哪个是最好的?我不确定它们有什么不同。如果你说的是对这两种方法使用不同的API,那么你将ULD必须查看它们各自的算法来决定更好地保留原始意图。在比较值时,还需要考虑CMYK中的非唯一性。还记得大多数颜色分离会选择性地重叠像素以允许墨水显示。有没有理由不能比较RGB值?将不一样,但有足够的决议,应该给代表计数。
    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();
        }