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

StackOverflow https://stackoverflow.com/questions/4315335

  •  29-09-2019
  •  | 
  •  

Вопрос

Кто -нибудь знает, как правильно идентифицировать изображения 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; 
Это было полезно?

Решение

Я бы не стал начинать с раствора в качестве вашего способа загрузки данных. На самом деле, я бы не стал использовать его для этого. Вместо этого я бы использовал 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: Colorspaceyck
    • 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# Надеюсь, это поможет кому-то.

Ура - Джереми

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top