【问题标题】:Convert floating point RGBA bitmap to standard Dotnet Bitmap将浮点 RGBA 位图转换为标准 Dotnet 位图
【发布时间】:2012-06-19 13:42:57
【问题描述】:

我正在尝试使用 FreeImage.Net 库打开图像并将其转换为标准位图,但是我必须缺少一个步骤,或者 FreeImage 根本无法将浮点 RGBA 转换为 32BPP RGBA :

FreeImageBitmap fib = new FreeImageBitmap("C:\\test.exr");
Console.WriteLine(fib.ImageType); //FIT_RGBAF   
fib.ConvertType(FREE_IMAGE_TYPE.FIT_BITMAP, true); //returns False

转换失败:

无法从类型 12 转换为类型 1;不存在这样的转换。

我需要它作为 32BPP RGBA 位图,只是为了能够将其转换为System.Drawing.Bitmap,因此我可以使用 GDI+ 绘制它。如有必要,我愿意使用不同的图像库,或者如果有人认为在那里可以找到解决方案,我愿意考虑 WPF 而不是 Winforms。

我上传了一个用于测试的浮点 EXR 示例:http://dl.dropbox.com/u/2817180/test.exr

【问题讨论】:

  • 好吧,您总是可以从一个位图中读取数据并将其写入另一个...
  • FreeImage.Net 不支持这种转换 - 请参阅 documentation(第 36 页)
  • 如果您上传了需要解析的位图文件示例,将会有所帮助。
  • @Niko :这可能是最后的手段,但我觉得应该有更快的方法。
  • @nirbruner :是的,我明白了,但我无法想象为什么转换会这么难。

标签: c# winforms freeimage


【解决方案1】:

正如 Niko 所说,您应该手动操作。使用不安全的代码和指针,将您的内存缓冲区锁定并使其不可移动,您的例程将既快速执行又易于编写。

如果您只有一种源格式和一种目标格式,则更是如此。

【讨论】:

  • 您认为基于不安全指针的代码运行速度与同一过程的非托管 C++ 实现一样快是正确的吗?
  • 没有那么快。如果你能够用 C++ 编写代码并通过static extern 调用它,那将是赢家。
  • 我按照你的建议做了,考虑到这是我的第一个 C++ 代码,结果还不错。 C++ 代码的执行速度比等效的不安全 C# 代码快大约 40%。我会再等一天再授予答案,只是为了给其他可能的答案提供机会。
  • 谢谢,我很高兴它对你有用,感谢分享结果。
  • 它不仅现在可以工作,而且工作得很好! parallelFor 是一头野兽! :) 我可以在约 5 毫秒内转换 800*600 的图像。感谢您的帮助。
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 2012-07-23
  • 2020-05-13
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多