2010-11-30 24 views
19

Weiß jemand, wie man CMYK-Bilder mit C# richtig erkennt? Ich habe herausgefunden, wie man es mit ImageMagick macht, aber ich brauche eine .NET-Lösung. Ich habe 3 Code-Snippets online gefunden, nur eines funktioniert in Windows 7, aber alle Fehler in Windows Server 2008 SP2. Ich brauche es zumindest in Windows Server 2008 SP2 zu arbeiten. Hier ist, was ich gefunden habe:Wie erkennt man CMYK-Bilder mit C#


    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; 
+0

Ihre beiden Testboxen x86 oder x64? –

+0

Beide sind 64-Bit-Maschinen. Könnte es die GDI + dll sein? –

+0

Was gibt 'img.PixelFormat' für beide Betriebssysteme zurück? Wie wäre es mit 'wpfImage.Format'? – Gabe

Antwort

5

Ich würde nicht mit BitmapImage als Ihre Art des Ladens der Daten beginnen. Tatsächlich würde ich es überhaupt nicht verwenden. Stattdessen würde ich BitmapDecoder::Create verwenden und BitmapCreateOptions.PreservePixelFormat übergeben. Dann können Sie auf die BitmapFrame zugreifen, die Sie interessiert und überprüfen Sie seine Format Eigenschaft, die jetzt CMYK ergeben sollte.

Wenn Sie das Bild wirklich anzeigen müssen, können Sie einfach die BitmapFrame, die auch eine BitmapSource Unterklasse ist, einer Image::Source zuweisen.

+0

Danke! Es funktionierte auf beiden Plattformen. –

0

Ich lief in die gleichen Probleme und wenn Sie .net 2.0 dann BitmapDecoder wird nicht funktionieren .. was Sie tun möchten, ist die Datei lesen und einfach überprüfen, um zu sehen, was die Bytes sagen, die Datei ist .. How to identify CMYK images in ASP.NET using C# Hoffe, das hilft jemandem.

Beifall - Jeremy

2

Meine Testergebnisse sind ein bisschen anders als deine.

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