2012-01-01 68 views
0

我試圖使用FreeImage.Net庫打開圖像並將其轉換爲標準位圖,但要麼必須有我缺少的步驟,或者FreeImage只是簡單的不能浮點RGBA轉換爲32bpp的RGBA:將浮點RGBA位圖轉換爲標準Dotnet位圖

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 +繪製。如果有必要,我願意使用不同的圖像庫,或者如果有人認爲在那裏會找到解決方案,可以考慮使用Winforms上的WPF。

我上傳一個例子浮點EXR來進行測試:http://dl.dropbox.com/u/2817180/test.exr

+1

好吧,你總是可以從一個位圖讀取數據並將其寫入另一個... – neeKo 2012-01-03 20:12:28

+0

FreeImage.Net不支持此轉換 - 請參見[documentation](http://ignum.dl.sourceforge.net/ project/freeimage/Source%20Documentation/3.15.1/FreeImage3151.pdf)(第36頁) – nirbruner 2012-01-03 20:59:15

+0

如果您上傳了需要解析的位圖文件的示例,這將有所幫助。 – 2012-01-03 23:13:07

回答

2

AS尼科說,你應該做手工。使用不安全的代碼,以及可以固定你的內存緩衝區並使其不可移動的指針,你的例程將會快速執行並且易於編寫。

更何況,如果你只有一個源和一個目標格式。

+0

您是否認爲基於不安全指針的代碼運行速度與同一過程的非託管C++實現一樣快? – Rotem 2012-01-04 09:15:41

+1

並不快。如果你能用C++編寫代碼並通過「static extern」調用它,那將是贏家。 – 2012-01-04 09:17:24

+1

我按照你的建議做了,考慮到這是我的第一個C++代碼,結果是體面的。 C++代碼比等效的不安全的C#代碼執行速度快大約40%。爲了給其他潛在的答案機會,我將等待另一天,然後才答覆答案。 – Rotem 2012-01-05 12:30:14