Wie man CMYK-Bilder mit C # identifizieren
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;
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