Подтвердить что ты не робот

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

Кто-нибудь знает, как правильно идентифицировать изображения CMYK с помощью С#? Я нашел, как это сделать с помощью ImageMagick, но мне нужно .NET-решение. Я нашел 3 фрагмента кода в сети, только один работает в Windows 7, но все они не работают в Windows Server 2008 с пакетом обновления 2 (SP2). Мне нужно, чтобы он работал хотя бы в Windows Server 2008 с пакетом обновления 2 (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; 
4b9b3361

Ответ 1

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

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

Ответ 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;
    }

Ответ 3

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

Приветствия - Джереми