2010-11-01 6 views
5

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

BitmapImage bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.UriSource = new System.Uri (path); 
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
bitmap.EndInit(); 

Это прекрасно работает для TIFF-файлов, сохраненных в RGB, RGB + Альфа и CMYK. Однако, если я пытаюсь загрузить файл TIFF с использованием цветов CMYK и альфа-канала, я получаю исключение (формат файла не распознается как действительный декодером).

Я ранее использовал библиотеку FreeImage и тонкую оболочку C# поверх нее. FreeImage 3.x имеет частичную поддержку такого формата изображения, т. Е. Мне пришлось дважды загружать TIFF, как CMYK без прозрачности и один раз как RGB + Alpha; этот трюк необходим, поскольку FreeImage обеспечивает доступ не более чем к 4 одновременным цветовым каналам.

Я хотел бы узнать, поддерживается ли поддерживаемый способ загрузки растровых изображений CMYK + Alpha? Либо непосредственно на C#, либо через некоторый код взаимодействия, но предпочтительно без использования сторонней библиотеки DLL (кроме библиотек .NET 4).

Примером такого файла TIFF может быть найден here.

EDIT: Я больше не может воспроизвести проблему, следующий код работает просто отлично:

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; 

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

+0

У вас есть ссылка на TIFF с использованием CMYK с альфа-каналом, где возникает эта проблема? Я не могу воспроизвести этот –

+0

. Я добавил ссылку на мой образ TIFF в вопросе (http://www.opac.ch/files/cmyka.tif) –

+0

Ах, вы правы. Извините, полностью пропустил это. –

ответ

0

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

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

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

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

HTH.

+0

Преобразование изображения не работает (конвертер изображений, похоже, не поддерживает мои изображения CMYK + альфа-канала). И я не хочу сначала конвертировать в RGB, так как мне действительно нужно получить доступ ко всем пяти компонентам для каждого пикселя (Cyan, Magenta, Yellow, Black и Alpha). –

+0

@kyle: Я ошибся, код работает. Я понятия не имею, почему я раньше получал исключение. –

+0

Рад слышать. Хороший старый перестроил все. – keyle

0

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

System.Drawing.Image т.д.

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

+0

Я не нашел, как это сделать. Из того, что я понимаю, GDI + всегда возвращает значения RGB для меня, и нет никакого способа получить исходные значения CMYK. Или я ошибаюсь? –

+0

На самом деле я понятия не имею. Я использовал этот aaproach для получения изображений из TWAIN и выпадал их в WPF. –

0

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

http://freeimage.sourceforge.net/

Good Tiff library for .NET

Я надеюсь, что это может помочь.

+1

Спасибо, но я пришел из FreeImage, и я не хочу возвращаться назад; У меня было слишком много проблем, когда память опускалась. Я заметил много сбоев в моем приложении при вызове FreeImage, скорее всего, вызван повреждением памяти. Но libtiff.net кажется интересной альтернативой. –