Comment identifier les images CMJN en utilisant C #
Question
Quelqu'un sait comment identifier correctement les images CMJN en utilisant C #? J'ai trouvé comment le faire en utilisant ImageMagick, mais je besoin d'une solution .NET. J'ai trouvé en ligne 3 extraits de code, une seule fonctionne sous Windows 7, mais tous échouent dans Windows Server 2008 SP2. J'ai besoin pour travailler au moins dans Windows Server 2008 SP2. Voici ce que j'ai trouvé:
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;
La solution
Je ne commence pas avec BitmapImage comme mode de chargement des données. En fait, je ne l'utiliserais pas du tout pour cela. Au lieu de cela, je voudrais utiliser BitmapDecoder::Create
et passer BitmapCreateOptions.PreservePixelFormat
. Ensuite, vous pouvez accéder à la BitmapFrame
vous intéresse et vérifier son Format
propriété qui devrait maintenant céder CMJN.
Alors, si vous avez vraiment besoin pour afficher l'image, vous pouvez simplement attribuer le BitmapFrame
, qui est aussi une sous-classe de BitmapSource
, à un Image::Source
.
Autres conseils
Mes résultats des tests sont un autre bit que le vôtre.
- Windows 7:
- ImageFlags: ColorSpaceRgb
- PixelFormat: PixelFormat32bppCMYK (8207)
- Windows Server 2008 R2:
- ImageFlags: ColorSpaceRgb
- PixelFormat: PixelFormat32bppCMYK (8207)
- Windows Server 2008:
- ImageFlags: ColorSpaceYcck
- PixelFormat: Format24bppRgb
Le code suivant devrait fonctionner:
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;
}
je suis tombé sur les mêmes questions et si vous utilisez .net 2.0 alors BitmapDecoder ne fonctionnera pas .. ce que vous voulez faire est de lire le fichier et il suffit de cocher simplement pour voir que ce que les octets disent que le fichier est .. Comment identifier les images CMJN en ASP. NET en utilisant C # Espérons que cela aide quelqu'un.
Cheers - Jeremy