How to identify CMYK images in ASP.NET using C#

后端 未结 6 1537
我寻月下人不归
我寻月下人不归 2021-02-02 14:54

Does anybody know how to properly identify CMYK images in ASP.NET using C#? When I check the Flags attribute of a Bitmap instance, I get incorrect resu

6条回答
  •  没有蜡笔的小新
    2021-02-02 15:28

    I use a combination of the ImageFlags and PixelFormat values. Note that PixelFormat.Forma32bppCMYK is missing from .NET - I grabbed it out of GdiPlusPixelFormats.h in the Windows SDK.

    The trick is that Windows 7 and Server 2008 R2 returns the correct pixel format but is missing the image flags. Vista and Server 2008 return an invalid pixel format but the correct image flags. Insanity.

    public ImageColorFormat GetColorFormat(this Bitmap bitmap)
    {
        const int pixelFormatIndexed = 0x00010000;
        const int pixelFormat32bppCMYK = 0x200F;
        const int pixelFormat16bppGrayScale = (4 | (16 << 8);
    
        // Check image flags
        var flags = (ImageFlags)bitmap.Flags;
        if (flags.HasFlag(ImageFlags.ColorSpaceCmyk) || flags.HasFlag(ImageFlags.ColorSpaceYcck))
        {
            return ImageColorFormat.Cmyk;
        }
        else if (flags.HasFlag(ImageFlags.ColorSpaceGray))
        {
            return ImageColorFormat.Grayscale;
        }
    
        // Check pixel format
        var pixelFormat = (int)bitmap.PixelFormat;
        if (pixelFormat == pixelFormat32bppCMYK)
        {
            return ImageColorFormat.Cmyk;
        }
        else if ((pixelFormat & pixelFormatIndexed) != 0)
        {
            return ImageColorFormat.Indexed;
        }
        else if (pixelFormat == pixelFormat16bppGrayScale)
        {
            return ImageColorFormat.Grayscale;
        }
    
        // Default to RGB
        return ImageColorFormat.Rgb;
    }    
    
    public enum ImageColorFormat
    {
        Rgb,
        Cmyk,
        Indexed,
        Grayscale
    }
    

提交回复
热议问题