Frage

Weiß jemand, wie man richtig CMYK-Bilder identifizieren C #? Ich fand, wie es mit ImageMagick zu tun, aber ich brauche eine .NET-Lösung. Ich fand 3 Code-Schnipsel online, nur ein Werk in Windows 7, aber alle in Windows Server 2008 SP2 fehlschlagen. Ich brauche es zumindest in Windows Server 2008 SP2 zu arbeiten. Hier ist, was ich gefunden habe:


    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; 
War es hilfreich?

Lösung

Ich würde nicht mit Bitmap als Weg des Ladens der Daten beginnen. In der Tat würde ich überhaupt nicht dafür verwenden Sie es. Stattdessen würde ich BitmapDecoder::Create und übergeben BitmapCreateOptions.PreservePixelFormat . Dann können Sie die BitmapFrame Sie interessiert sind und überprüfen Sie die Format Eigenschaft, die sollte nun CMYK ergeben.

Dann, wenn Sie wirklich das Bild anzeigen müssen, können Sie einfach die BitmapFrame zuweisen, die auch eine BitmapSource Unterklasse, zu einem Image::Source.

Andere Tipps

Meine Testergebnisse sind ein bisschen anders als bei Ihnen.

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

Der folgende Code sollte funktionieren:

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

Ich lief in den gleichen Fragen und wenn Ihr .net 2.0 verwenden dann BitmapDecoder wird nicht funktionieren .. was Sie tun wollen, ist die Datei lesen und einfach nur geprüft, dass zu sehen, was die Bytes sagen die Datei .. ist Wie CMYK-Bilder in ASP zu identifizieren. NET mit C # hoffe, das hilft jemand.

Prost - Jeremy

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top