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; 
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top