Pregunta

¿Alguien sabe cómo identificar correctamente las imágenes CMYK con C #? He encontrado cómo hacerlo usando ImageMagick, pero necesito una solución .NET. He encontrado 3 fragmentos de código en línea, solo funciona en Windows 7, pero todos fallan en Windows Server 2008 SP2. Lo necesito para el trabajo, al menos en Windows Server 2008 SP2. Esto es lo que he encontrado:


    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; 
¿Fue útil?

Solución

No se iniciaría con BitmapImage como su manera de cargar los datos. De hecho, yo no lo usaría en absoluto para esto. En su lugar me gustaría utilizar BitmapDecoder::Create y pase BitmapCreateOptions.PreservePixelFormat . A continuación, puede acceder al BitmapFrame que le interesa y comprobar su Format propiedad que ahora debe ceder CMYK.

Entonces, si realmente se necesita para mostrar la imagen, sólo puede asignar el BitmapFrame, que también es una subclase BitmapSource, a un Image::Source.

Otros consejos

Los resultados de mi prueba son un poco diferente de la suya.

  • Windows 7:
    • ImageFlags: ColorSpaceRgb
    • PixelFormat: PixelFormat32bppCMYK (8207)
  • Windows Server 2008 R2:
    • ImageFlags: ColorSpaceRgb
    • PixelFormat: PixelFormat32bppCMYK (8207)
  • Windows Server 2008:
    • ImageFlags: ColorSpaceYcck
    • PixelFormat: Format24bppRgb

El siguiente código debería funcionar:

    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;
    }

me encontré con los mismos problemas y si el uso de .NET 2.0 a continuación BitmapDecoder no funcionará .. lo que quieres hacer es leer el archivo y solo cheque fácil de ver que lo que dicen los bytes del archivo es .. Cómo identificar las imágenes CMYK en ASP. NET con C # Espero que esto ayude a alguien.

Saludos - Jeremy

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top