Поддержка JPEG 2000 в C# .NET

Кажется, что .NET не может открывать файлы JP2 (Jpeg 2000) с помощью библиотеки GDI. Я искал в Google, но не могу найти для этого никаких библиотек или примеров кода.

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

Ответов (5)

Решение

Похоже, мы можем сделать это с помощью 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);

Вы можете использовать библиотеку Jpeg2000.Net, если вам нужно полностью управляемое решение без небезопасных блоков. Отказ от ответственности: я работаю над этой библиотекой, библиотека коммерческая.

Вот базовый образец для декодирования изображения JPEG 2000 в TIFF:

string fileName = ...; // path to JPEG 2000 image
using (var image = new J2kImage(fileName))
{
    var options = new J2kDecodingOptions
    {
        UpsampleComponents = true
    };

    // Alternatively, you can decode only part of the image using J2kImage.DecodeArea method
    var imageData = image.Decode(options);
    imageData.Save(tiffFileName, J2kOutputFormat.Tiff);
}

Некоторое время назад я искал нечто подобное, чтобы реализовать его, если смогу; В ответ на мой вопрос означает , что нет документально способ сделать это для GDI + , что класс Image в .Net использований.

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

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

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

Для всех, кто сталкивается с этим старым постом, приведенный выше код от Gordon отлично работает, но, как указал jixtra, вы действительно получите исключение: System.DllNotFoundException: 'Unable to load DLL' FreeImage ': указанный модуль не может быть найден. ' при установке через nuget. Мне удалось заставить его работать в .net 4.6.1, установив пакет Nuget FreeImage-dotnet-core и вручную добавив FreeImage.dll в папку bin. Вы можете скачать dll здесь: http://freeimage.sourceforge.net/download.html .

Мне нужно было более качественное изображение для использования с tesseract, поэтому я внес несколько незначительных изменений, которые сильно повлияли на качество нового 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);