Как идентифицировать изображения CMYK с помощью С#
Кто-нибудь знает, как правильно идентифицировать изображения CMYK с помощью С#? Я нашел, как это сделать с помощью ImageMagick, но мне нужно .NET-решение. Я нашел 3 фрагмента кода в сети, только один работает в Windows 7, но все они не работают в Windows Server 2008 с пакетом обновления 2 (SP2). Мне нужно, чтобы он работал хотя бы в Windows Server 2008 с пакетом обновления 2 (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;
Ответы
Ответ 1
Я бы не начал с BitmapImage в качестве способа загрузки данных. На самом деле, я бы не использовал его вообще для этого. Вместо этого я бы использовал BitmapDecoder::Create
и перешел в BitmapCreateOptions.PreservePixelFormat
. Затем вы можете получить доступ к BitmapFrame
, который вам интересен, и проверить его свойство Format
, которое должно теперь дать CMYK.
Затем, если вам действительно нужно отобразить изображение, вы можете просто назначить BitmapFrame
, который также является подклассом BitmapSource
, на Image::Source
.
Ответ 2
Результаты моих тестов немного отличаются от ваших.
- 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;
}
Ответ 3
Я столкнулся с теми же проблемами, и если вы используете .net 2.0, то BitmapDecoder не будет работать. то, что вы хотите сделать, - это прочитать файл и просто проверить, чтобы увидеть, что байты говорят, что файл... Как идентифицировать изображения CMYK в ASP.NET с помощью С#. Надеюсь, это поможет кому-то.
Приветствия - Джереми