Как идентифицировать изображения CMYK с помощью C#

кто-нибудь знает, как правильно идентифицировать изображения CMYK с помощью C#? Я нашел, как это сделать с помощью 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 ответов


Я бы не начал с BitmapImage как ваш способ загрузки данных. На самом деле, я бы вообще не использовал его для этого. Вместо этого я бы использовал BitmapDecoder::Create и передать BitmapCreateOptions.PreservePixelFormat. Затем вы можете получить доступ к BitmapFrame вы заинтересованы в и проверить его Format свойство, которое теперь должно давать CMYK.

тогда, если вам действительно нужно, чтобы показать изображение, вы можете просто назначить BitmapFrame, который также BitmapSource подкласс, к Image::Source.


мои результаты теста немного отличаются от ваших.

  • 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;
    }

Я столкнулся с теми же проблемами, и если вы используете .net 2.0, то BitmapDecoder не будет работать.. то, что вы хотите сделать, это прочитать файл и просто проверить, что говорят байты о файле.. Как определить изображения CMYK в ASP.NET использование C# надеюсь, это кому-то поможет.

Ура - Джереми