1
  1. RGB ビットマップから CMYK へ?
  2. 色深度を読み取るためにCMYKを数えますか?

また

  1. RGB 値をカウント (完了)、RGB を変換しない --> ICC プロファイルを使用して 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;
    }

*更新:レイヤー CMYK を分離し、各 C、M、Y、K のパーセンテージを見つける必要があるようです。ビットマップ ストリームでそれを行うにはどうすればよいですか? これは複雑な場合があります。単純なアプローチでは、RGB を見つけてから、ICC US webcotedSWOP v2 .ICC に基づいて RGB を CMYK に変換します...

上記のことを試してみて、私を正しい方向に導いてくれてありがとう


ビットマップで RGB の CMYK プロポーション値を取得しましたが、パーセンテージでの望ましい結果についてはわかりません。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();
    }
4

1 に答える 1