Как идентифицировать изображения CMYK с помощью C#
кто-нибудь знает, как правильно идентифицировать изображения CMYK с помощью C#? Я нашел, как это сделать с помощью ImageMagick, но мне нужно решение .NET. Я нашел 3 фрагмента кода в интернете, только один работает в Windows 7, но все терпят неудачу в 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;
3 ответов
Я бы не начал с BitmapImage как ваш способ загрузки данных. На самом деле, я бы вообще не использовал его для этого. Вместо этого я бы использовал BitmapDecoder::Create
и передать BitmapCreateOptions.PreservePixelFormat
. Затем вы можете получить доступ к BitmapFrame
вы заинтересованы в и проверить его Format
свойство, которое теперь должно давать CMYK.
тогда, если вам действительно нужно, чтобы показать изображение, вы можете просто назначить BitmapFrame
, который также BitmapSource
подкласс, к Image::Source
.
мои результаты теста немного отличаются от ваших.
- Windows 7:
- 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 не будет работать.. то, что вы хотите сделать, это прочитать файл и просто проверить, что говорят байты о файле.. Как определить изображения CMYK в ASP.NET использование C# надеюсь, это кому-то поможет.
Ура - Джереми