C#.NET 中的 JPEG 2000 支持

问题描述 投票:0回答:7

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

有人有什么想法吗?我真的不想花钱请图书馆来做这件事,除非我必须......

c# .net gdi jpeg2000
7个回答
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);

3
投票

不久前我一直在寻找类似的东西,如果可以的话,我希望实现一个; 对我的问题的回答意味着没有有记录的方法可以为 .Net 中的 Image 类使用的 GDI+ 执行此操作。

我相信,如果您正在编写 WPF 应用程序,那么您可以通过 Windows 图像组件编解码器 扩展支持的图像格式列表,并且 可能 已经存在(询问您本地友好的搜索引擎?)

可以选择使用支持 JPEG2000 的插件,例如 DotImage,尽管加载图像可能需要更多“努力”。


3
投票

对于任何遇到这篇旧文章的人来说,Gordon 的上述代码效果很好,但正如 jixtra 指出的那样,您确实会得到一个异常: System.DllNotFoundException: 'Unable to load DLL 'FreeImage': The指定模块无法找到.'通过 nuget 安装时。通过安装 FreeImage-dotnet-core nuget 包并手动将 FreeImage.dll 添加到 bin 文件夹,我可以让它在 .net 4.6.1 中工作。您可以在这里下载 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);

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");

0
投票

我一直在为 .NET Core 开发一个免费的开源 JPEG2000 库,称为 CoreJ2K。它主要与 SkiaSharp 兼容,但它也旨在补充其他图像库。

© www.soinside.com 2019 - 2024. All rights reserved.