Ответов (5)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);