Domanda

Qualcuno sa come identificare correttamente le immagini CMYK utilizzando C #? Ho trovato come farlo usando ImageMagick, ma ho bisogno di una soluzione .NET. Ho trovato 3 frammenti di codice in linea, solo uno funziona in Windows 7, ma tutti falliscono in Windows Server 2008 SP2. Ho bisogno di lavorare almeno in Windows Server 2008 SP2. Ecco cosa ho trovato:


    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; 
È stato utile?

Soluzione

Non vorrei iniziare con BitmapImage come il tuo modo di caricamento dei dati. In realtà, io non lo uso a tutti per questo. Invece vorrei utilizzare BitmapDecoder::Create e passare BitmapCreateOptions.PreservePixelFormat . Poi si può accedere al BitmapFrame che ti interessa e controllarne la Format proprietà che ora dovrebbe cedere CMYK.

Quindi, se si ha realmente bisogno per visualizzare l'immagine, si può semplicemente assegnare il BitmapFrame, che è anche una sottoclasse BitmapSource, a un Image::Source.

Altri suggerimenti

I miei risultati dei test sono un po 'diversa dalla vostra.

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

Il seguente codice dovrebbe funzionare:

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

ho incontrato gli stessi problemi e se la vostra utilizzando .net 2.0, allora BitmapDecoder non funzionerà .. ciò che si vuole fare è leggere il file e basta controllare gli occhi di tutti che ciò che i byte dicono che il file è .. Come identificare le immagini CMYK in ASP. NET utilizzando C # Spero che questo aiuta qualcuno.

Cheers - Jeremy

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top