Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Возможно, вы должны проверить этот проект.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Для всех, кто попадает на этот старый пост, приведенный выше код от Gordon отлично работает, но, как отметил jixtra, вы действительно получите исключение: System.DllNotFoundException: "Невозможно загрузить DLL" FreeImage ": указанный модуль не смог быть найденным.' при установке через nuget. Я смог заставить его работать в .net 4.6.1, установив пакет нулевого пакета FreeImage-dotnet и вручную добавив 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);

Ответ 6

Вы можете использовать библиотеку 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);
}