C#.NET中的JPEG 2000支持

25

看起来.NET无法使用GDI库打开JP2(Jpeg 2000)文件。我在谷歌上搜索过,但找不到任何库或示例代码来完成此操作。

有人有什么想法吗?除非必须,否则我真的不想支付使用库的费用。

6个回答

22

看起来我们可以使用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);

1
感谢您的指导,我给您点赞。但是在我的窗体上渲染JPEG2000图像后,由于DIB为空,我遇到了异常。在渲染管道中抛出了一个异常。---> System.ArgumentNullException: 值不能为 null。参数名: dib at FreeImageAPI.FreeImage.GetBitmap(FIBITMAP dib, Boolean copyMetadata) at FreeImageAPI.FreeImage.GetBitmap(FIBITMAP dib)。在调试时,发现方法static FIBITMAP LoadEx(string filename, FREE_IMAGE_LOAD_FLAGS flags, ref FREE_IMAGE_FORMAT format) 返回了一个结构{0},这导致了上述异常。 - Pratik Pattanayak
1
我使用最新的FreeImage NuGet包时遇到了模块未找到的异常。 - jjxtra

3
对于遇到这篇旧文章的任何人,Gordon提供的上述代码非常好用,但正如jixtra指出的那样,当通过nuget安装时,您确实会收到异常:System.DllNotFoundException: '无法加载DLL“FreeImage”:找不到指定的模块。' 我成功将其运行在.net 4.6.1中,方法是安装FreeImage-dotnet-core nuget包,并手动添加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);

// NOTE: memory needs to be explicitly freed (GC won't do this)
FreeImage.UnloadEx(ref dib);

3
我曾经寻找类似的东西,以便在可能的情况下实现它;对于.Net中使用的Image类所使用的GDI+,我的问题的回答表明目前没有记录的方法来扩展它所支持的图像格式。
我认为,如果您正在编写WPF应用程序,则可以通过Windows Imanging Components codecs扩展支持的图像格式列表,并且可能已经有一个(请向您当地友好的搜索引擎询问?)。
还有一种选择是使用附加组件,例如DotImage,它支持JPEG2000,但加载图像可能需要更多的“努力”。

2

我曾使用Leadtools来显示JPEG 2000图片。它们提供了一个.NET库,包括WPF和WinForms控件来显示这些图片。但是,价格相当高昂。


2

如果您需要完全托管的解决方案而不使用不安全的代码块,可以使用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);
}

1
此外,如果你需要一个最新的开源选项,你可以使用Emgu CV,它是OpenCV的封装。C#的基本示例代码如下:
Mat image = CvInvoke.Imread(@"\Path\To\File.jp2");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接