【问题标题】:JPEG 2000 support in C#.NETC#.NET 中的 JPEG 2000 支持
【发布时间】:2010-10-10 01:56:50
【问题描述】:

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

有人有什么想法吗?除非我必须这样做,否则我真的不想为图书馆付费..

【问题讨论】:

    标签: c# .net gdi jpeg2000


    【解决方案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);
    

    【讨论】:

    • 感谢您的指导。 +1 为你的答案。但是在我的窗口窗体上渲染 jpeg200 图像后,由于 dib 为 null,我得到了异常。**在渲染管道中引发了异常。 ---> System.ArgumentNullException:值不能为空。参数名称:在 FreeImageAPI.FreeImage.GetBitmap(FIBITMAP dib, Boolean copyMetadata) 在 FreeImageAPI.FreeImage.GetBitmap(FIBITMAP dib)** 处的 dib。在调试时,发现方法 static FIBITMAP LoadEx(string filename, FREE_IMAGE_LOAD_FLAGS flags, ref FREE_IMAGE_FORMAT format) 返回了一个导致上述异常的结构 {0}。
    • 我在最新的 FreeImage nuget 包中发现模块未找到异常
    【解决方案2】:

    对于遇到此旧帖子的任何人,Gordon 的上述代码效果很好,但正如 jixtra 指出的那样,您确实会遇到异常: System.DllNotFoundException: 'Unable to load DLL 'FreeImage': The specified module could not被发现。'通过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);
    

    【讨论】:

      【解决方案3】:

      不久前我一直在寻找类似的东西,如果可以的话,我希望实现它; responses to my question 暗示 .Net 中的 Image 类使用的 GDI+ 没有 documented 方法来执行此操作。

      我相信,如果您正在编写 WPF 应用程序,那么您可以通过 Windows Imanging Components codecs 扩展支持的图像格式列表,并且可能已经有一个(询问您当地的友好搜索引擎?)

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          如果您需要没有不安全块的完全托管解决方案,您可以使用Jpeg2000.Net library。免责声明:我正在开发这个库,这个库是商业的。

          这是将 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);
          }
          

          【讨论】:

            【解决方案6】:

            此外,对于当前最新的开源选项,您可以使用Emgu CV,它是OpenCV 的封装。 C# 中的基本示例代码如下所示:

            Mat image = CvInvoke.Imread(@"\Path\To\File.jp2");
            

            【讨论】:

              猜你喜欢
              • 2012-09-12
              • 1970-01-01
              • 1970-01-01
              • 2020-11-13
              • 2011-10-28
              • 2014-10-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多