如何使用C#识别CMYK图像

时间:2010-11-30 15:25:09

标签: .net wpf gdi+ cmyk

有人知道如何使用C#正确识别CMYK图像吗?我发现如何使用ImageMagick,但我需要一个.NET解决方案。我在网上找到了3个代码段,只有一个在Windows 7中运行,但在Windows Server 2008 SP2中都失败了。我需要它至少在Windows Server 2008 SP2中工作。这是我发现的:


    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Drawing;
    using System.Drawing.Imaging;

    bool isCmyk;

    // WPF
    BitmapImage wpfImage = new BitmapImage(new Uri(imgFile));

    // false in Win7 & WinServer08, wpfImage.Format = Bgr32
    isCmyk = (wpfImage.Format == PixelFormats.Cmyk32);

    // Using GDI+
    Image img = Image.FromFile(file);

    // false in Win7 & WinServer08
    isCmyk = ((((ImageFlags)img.Flags) & ImageFlags.ColorSpaceCmyk) == 
        ImageFlags.ColorSpaceCmyk); 

    // true in Win7, false in WinServer08 (img.PixelFormat = Format24bppRgb) 
    isCmyk = ((int)img.PixelFormat) == 8207; 

3 个答案:

答案 0 :(得分:5)

我不会以BitmapImage作为加载数据的方式开始。事实上,我根本不会使用它。相反,我会使用BitmapDecoder::Create并传入BitmapCreateOptions.PreservePixelFormat。然后,您可以访问您感兴趣的BitmapFrame并查看其Format属性,该属性现在应该产生CMYK。

然后,如果您确实需要显示图片,则只需将BitmapFrame(也是BitmapSource子类)分配给Image::Source

答案 1 :(得分:2)

我的测试结果与您的测试结果略有不同。

  • Windows 7:
    • ImageFlags:ColorSpaceRgb
    • PixelFormat:PixelFormat32bppCMYK(8207)
  • Windows Server 2008 R2:
    • ImageFlags:ColorSpaceRgb
    • PixelFormat:PixelFormat32bppCMYK(8207)
  • Windows Server 2008:
    • ImageFlags:ColorSpaceYcck
    • PixelFormat:Format24bppRgb

以下代码应该有效:

    public static bool IsCmyk(this 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;
    }

答案 2 :(得分:0)

我遇到了同样的问题,如果您使用.net 2.0,那么BitmapDecoder将无法工作..您要做的是读取文件并只是检查以查看该文件的字节是什么.. {{ 3}}希望这有助于某人。

干杯 - 杰里米