Я использую этот фрагмент кода для загрузки различных файлов изображений:
BitmapImage bitmap = new BitmapImage ();
bitmap.BeginInit ();
bitmap.UriSource = new System.Uri (path);
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmap.EndInit ();
Это прекрасно работает для файлов TIFF, хранящихся в формате RGB, RGB + Alpha и CMYK. Однако, если я пытаюсь загрузить файл TIFF с использованием цветов CMYK и альфа-канала, я получаю исключение (формат файла не распознается как допустимый декодером).
Ранее я использовал библиотеку FreeImage и тонкую оболочку C # поверх нее. FreeImage 3.x частично поддерживает этот тип изображения, то есть мне пришлось дважды загружать TIFF, один раз как CMYK без прозрачности, а один раз как RGB + Alpha; этот трюк необходим, поскольку FreeImage предоставляет доступ только к максимум 4 одновременным цветным каналам.
Хотелось бы узнать, есть ли поддерживаемый способ загрузки битовых карт CMYK + Alpha? Либо непосредственно в C #, либо с помощью некоторого кода взаимодействия, но желательно без использования сторонних DLL (кроме библиотек инфраструктуры .NET 4).
Пример такого файла TIFF можно найти здесь .
РЕДАКТИРОВАТЬ : я больше не могу воспроизвести проблему, следующий код работает просто отлично:
BitmapImage bitmap = new BitmapImage ();
bitmap.BeginInit ();
bitmap.UriSource = new System.Uri (path);
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmap.EndInit ();
byte[] pixels = new byte[bitmap.PixelHeight*bitmap.PixelWidth*5];
bitmap.CopyPixels (pixels, bitmap.PixelWidth * 5, 0);
Но я все еще застрял: как я могу узнать, что исходное изображение было закодировано как CMYK плюс альфа-канал? Глядя на свойство Format
, я получаю только информацию о том, что изображение имеет 40 бит на пиксель. Все интересные вещи хранятся в следующих закрытых свойствах:
bitmap.Format.FormatFlags == IsCMYK | NChannelAlpha;
bitmap.Format.HasAlpha == true;
Есть ли какой-нибудь официальный способ добраться до них, не прибегая к размышлениям?