Похоже, что .NET не может открыть файлы JP2 (Jpeg 2000), используя библиотеку GDI. Я искал google, но не могу найти какие-либо библиотеки или пример кода для этого.
У кого-нибудь есть идеи? Я не хочу платить за библиотеку, если я не буду...
Похоже, что .NET не может открыть файлы JP2 (Jpeg 2000), используя библиотеку GDI. Я искал google, но не могу найти какие-либо библиотеки или пример кода для этого.
У кого-нибудь есть идеи? Я не хочу платить за библиотеку, если я не буду...
Похоже, мы можем это сделать, используя 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);
Возможно, вы должны проверить этот проект.
Я искал что-то подобное некоторое время назад, чтобы реализовать его, если бы мог; ответы на мой вопрос подразумевают, что для GDI + не существует документального метода, который использует класс Image в .Net.
Я считаю, что если вы пишете приложение WPF, вы можете расширить список поддерживаемых форматов изображений с помощью кодеков Windows Imanging Components, и может быть уже там (спросите свою местную дружественную поисковую систему?)
Существует возможность использовать аддон, такой как DotImage, который поддерживает JPEG2000, хотя в нем может быть больше "усилий" Загрузка изображений.
Я использовал Leadtools для отображения изображений JPEG 2000. Они предоставляют библиотеку .NET, включая элементы управления WPF и WinForms для отображения изображений. Тем не менее, существует довольно крутая цена.
Для всех, кто попадает на этот старый пост, приведенный выше код от 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);
Вы можете использовать библиотеку 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);
}