C# 将浮点RGBA位图转换为标准Dotnet位图
我正在尝试使用FreeImage.Net库打开图像并将其转换为标准位图,但可能是我缺少一个步骤,或者FreeImage无法将浮点RGBA转换为32BPP RGBA:C# 将浮点RGBA位图转换为标准Dotnet位图,c#,winforms,freeimage,C#,Winforms,Freeimage,我正在尝试使用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); //return
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+来绘制它。如果有必要的话,我愿意使用不同的图像库,或者如果有人认为有一个解决方案在WiFrices上,可以考虑WPF。
我上传了一个用于测试的浮点EXR示例:正如Niko所说,您应该手动执行。使用不安全的代码和指针,这些指针会锁定内存缓冲区并使其不可移动,这样您的例程执行起来既快又容易编写
如果您只有一个源和一个目标格式,则更是如此。您可以从一个位图读取数据,然后将其写入另一个位图…FreeImage.Net不支持此转换-请参阅(第36页),如果您上载了需要解析的位图文件的示例,则会有所帮助。@Niko:这是可能的最后手段,但是我觉得应该有一个更快的方法。@ NIRBRUNE:是的,我知道,但是我无法想象为什么转换会如此困难。你认为正确的基于指针的代码是否会运行得和一个非同一过程的非托管C++实现一样快?如果你能用C++来编码它,并通过代码>静态Stutux<代码>来调用它,那就是赢家。我按照你的建议做了,并且考虑到这是我的第一个C++代码,结果是不错的。C++代码比等效的不安全C代码快40%左右。我会再等一天,然后再颁发答案,只是为了给其他可能的答案提供机会。谢谢你,我很高兴它为你工作,并感谢你分享结果。它不仅现在起作用了,而且工作得很好!parallelFor是野兽!:)我可以在5毫秒内转换800*600的图像。谢谢你的帮助。