2010-11-30 19 views
19

C#を使用してCMYKイメージを正しく識別する方法を知っている人はいますか?私はImageMagickを使用してそれを行う方法を見つけましたが、.NETソリューションが必要です。 3つのコードスニペットがオンラインで見つかりましたが、Windows 7では1つのみが動作しますが、Windows Server 2008 SP2ではすべてが失敗します。私はWindows Server 2008 SP2で少なくとも動作する必要があります。ここに私が見つけたものがあります:C#を使用してCMYKイメージを特定する方法


    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; 
+0

は、あなたのテストボックスのx86の両方またはですx64? –

+0

どちらも64ビットマシンです。それはGDI + dllかもしれませんか? –

+0

両方のOSに対して 'img.PixelFormat'は何を返しますか? 'wpfImage.Format'はどうですか? – Gabe

答えて

5

私はデータの読み込み方法としてBitmapImageを使い始めません。実際、私はこれをまったく使用しませんでした。代わりにBitmapDecoder::Createを使用し、BitmapCreateOptions.PreservePixelFormatを渡します。次に、あなたが興味を持っているBitmapFrameにアクセスして、FormatプロパティがCMYKになるはずです。

実際に画像を表示する必要がある場合は、サブタイトルのBitmapFrameImage::Sourceに割り当てることができます。

+0

ありがとう!両方のプラットフォームで動作しました。 –

0

同じ問題が発生しました.net 2.0を使用している場合、BitmapDecoderは動作しません。何をしたいのですか?ファイルを読み込んで、バイトがファイルの内容を... .. How to identify CMYK images in ASP.NET using C#これが誰かを助けることを望みます。

乾杯 - ジェレミー

2

私のテスト結果はあなたとは少し異なります。

  • のWindows 7:
    • ImageFlags:ColorSpaceRgb
    • ピクセルフォーマット:PixelFormat32bppCMYK(8207)
  • のWindows Server 2008 R2:
    • ImageFlags:ColorSpaceRgb
    • ピクセルフォーマット:PixelFormat32bppCMYK( 8207)
  • のWindows Server 2008:
    • ImageFlags:ColorSpaceYcck
    • ピクセルフォーマット:Format24bppRgb

次のコードは動作するはずです:

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; 
    } 
関連する問題