Как идентифицировать изображения CMYK с помощью C # - PullRequest
19 голосов
/ 30 ноября 2010

Кто-нибудь знает, как правильно идентифицировать изображения CMYK с помощью C #?Я нашел, как это сделать с помощью ImageMagick, но мне нужно решение .NET.Я нашел в Интернете 3 фрагмента кода, только один работает в Windows 7, но все они не работают в Windows Server 2008 с пакетом обновления 2 (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 ]

5 голосов
/ 02 декабря 2010

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

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

2 голосов
/ 28 марта 2012

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

  • 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;
    }
0 голосов
/ 28 февраля 2012

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

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

...