2009-02-26 4 views
18

Кажется, что .NET не может открыть файлы JP2 (Jpeg 2000) с использованием библиотеки GDI. Я искал в google, но не могу найти какие-либо библиотеки или пример кода для этого.Поддержка JPEG 2000 в C# .NET

У кого-нибудь есть идеи? Я действительно не хочу платить за библиотеку, если я не обязан это делать.

ответ

20

Похоже, мы можем сделать это с помощью FreeImage (который является бесплатным)

FIBITMAP dib = FreeImage.LoadEx("test.jp2"); 
//save the image out to disk  
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, dib, "test.jpg", FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYNORMAL); 
//or even turn it into a normal Bitmap for later use 
Bitmap bitmap = FreeImage.GetBitmap(dib); 
+0

спасибо за руководство. +1 для ответа ур. Но после рендеринга изображений jpeg200 в моей оконной форме я получаю исключение из-за того, что dib как null. ** Исключение было создано в конвейере рендеринга. ---> System.ArgumentNullException: значение не может быть нулевым. Имя параметра: dib на FreeImageAPI.FreeImage.GetBitmap (FIBITMAP dib, Boolean copyMetadata) на FreeImageAPI.FreeImage.GetBitmap (FIBITMAP dib) **. В процессе отладки выяснилось, что этот метод ** статический FIBITMAP LoadEx (строковое имя файла, флаги FREE_IMAGE_LOAD_FLAGS, формат FREE_IMAGE_FORMAT) ** возвращает мне структуру {0}, которая вызывает вышеупомянутое исключение. –

+1

Я получаю исключение модуля, не найденное с последним пакетом пакетов FreeImage nuget – jjxtra

2

Возможно, вам необходимо проверить проект this.

+2

Это зависит от J #, который не находится в Visual Studio 2008 + – jjxtra

2

Я искал что-то подобное некоторое время назад, с целью реализации одного, если бы мог; responses to my question подразумевают, что нет документально зарегистрированного метода для этого для GDI +, который использует класс Image в .Net.

Я считаю, что если вы пишете приложение WPF, то вы можете расширить список поддерживаемых форматов изображений через Windows Imanging Components codecs, и может быть один там уже (обратитесь к местному дружественной поисковой системы?)

Существует возможность использовать аддон, такой как DotImage, который поддерживает JPEG2000, хотя может быть больше «усилий», связанных с загрузкой изображений.

2

Я использовал Leadtools для отображения изображений JPEG 2000. Они предоставляют библиотеку .NET, включая элементы управления WPF и WinForms для отображения изображений. Тем не менее, существует довольно крутая цена.

1

для тех, кто идет по этому старый пост, приведенный выше код с Гордоном отлично работает, но, как jixtra отметил, вы действительно получите исключение: System.DllNotFoundException: «Невозможно загрузить DLL« FreeImage »: указанный модуль не найден. ' при установке через nuget. Я смог заставить его работать в .net 4.6.1, установив пакет нулевого пакета FreeImage-dotnet и вручную добавив FreeImage.dll в папку bin. Вы можете скачать dll здесь: http://freeimage.sourceforge.net/download.html.

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

var jp2Format = FREE_IMAGE_FORMAT.FIF_JP2; 
var dib = FreeImage.LoadEx("test.jp2", ref jp2Format); 

FreeImage.SetResolutionX(dib, 300); 
FreeImage.SetResolutionY(dib, 300); 
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, dib, "test.jpg", FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYSUPERB);