質問
C#を使用してCMYK画像を適切に識別する方法を知っている人はいますか? ImageMagickを使用してそれを行う方法を見つけましたが、.NETソリューションが必要です。オンラインで3つのコードスニペットが見つかりましたが、Windows 7では1つだけ動作しますが、Windows Server 2008 SP2ではすべて失敗しました。少なくともWindows Server 2008 SP2で動作する必要があります。これが私が見つけたものです:
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;
解決
データをロードする方法として、BitMapimageから始めません。実際、私はこれにはまったく使用しません。代わりに使用します BitmapDecoder::Create
そして渡されます BitmapCreateOptions.PreservePixelFormat
. 。次に、にアクセスできます BitmapFrame
あなたは興味があり、それをチェックします Format
現在、CMYKを生成するプロパティ。
次に、本当に画像を表示する必要がある場合は、 BitmapFrame
, 、これもaです BitmapSource
サブクラス、 Image::Source
.
他のヒント
私のテスト結果はあなたのテスト結果とは少し異なります。
- Windows7:
- ImageFlags:Colorspacergb
- pixelformat:pixelformat32bppcmyk(8207)
- Windows Server 2008 R2:
- ImageFlags:Colorspacergb
- pixelformat:pixelformat32bppcmyk(8207)
- Windows Server 2008:
- ImageFlags:colorspaceycck
- pixelformat: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;
}
私は同じ問題に遭遇し、.NET 2.0を使用している場合、BitMapDecoderは機能しません。あなたがしたいことはファイルを読んで、バイトがファイルが言うことを確認するための単純なチェックです。 C#を使用してASP.NETでCMYK画像を識別する方法 これが誰かを助けることを願っています。
乾杯 - ジェレミー
所属していません StackOverflow