WPF BitmapImage и TIFF с CMYK + Alpha - PullRequest
5 голосов
/ 01 ноября 2010

Я использую этот фрагмент кода для загрузки различных файлов изображений:

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;

Есть ли какой-нибудь официальный способ добраться до них, не прибегая к размышлениям?

Ответы [ 3 ]

0 голосов
/ 01 февраля 2011

Это только предположение, но GDI + может загружать такие файлы.

System.Drawing.Image и т. Д.

Существует класс взаимодействия, который может отображать изображения GDI + в WPF.

0 голосов
/ 04 февраля 2011

Я нашел еще один вопрос по SO, который связан с этой библиотекой:

http://freeimage.sourceforge.net/

Хорошая библиотека Tiff для .NET

Надеюсь, это поможет.

0 голосов
/ 31 января 2011

Я могу сказать это только потому, что у меня были проблемы с некоторыми файлами: это может быть лучший способ сначала преобразовать tiff в png24, а затем загрузить его.

Даже Photoshop выдает предупреждение, если пользователь пытается сохранить файл CMYK Tiff и отмечает «Прозрачность»: «Многие программы не поддерживают прозрачность в TIFF. Сохранить информацию о прозрачности?»

Таким образом, конвертация до открытия может быть безопасным способом.

Может быть, http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx сделает это, но я сомневаюсь, что вам, возможно, понадобится дополнительный трубопровод.

НТН.

...