2009-04-17 52 views
2

GDIPlus混合函數使用alpha乘以預產生的rgb通道來提高效率。然而,通過alpha進行預乘是非常昂貴的,因爲您必須逐個處理每個像素。有人有一個優化的函數預乘alpha位圖嗎?

它似乎是一個很好的候選人SSE大會。這裏有人想分享它的實施嗎?我知道這是艱苦的工作,所以這就是我問的原因。我不是想偷你的工作。如果可以的話,你可以全部考慮分享。

編輯:我不想通過軟件做alpha混合。我試圖用alpha來預乘圖像中每個像素的每個顏色分量。我這樣做是因爲alpha混合是由公式完成的:dst = src src.alpha + dst(1-dst.alpha)但是AlphaBlend Win32函數確實實現了dst = src + dst(1-dst.alpha )爲優化原因。爲了得到正確的結果,你需要在調用AlphaBlend之前使src等於src * src.alpha。

由於我對裝配知之甚少,所以我需要花一些時間才能寫出,所以我問是否有人想分享它的實現。 SSE會很好,因爲在這篇論文中,通過軟件進行alpha混合的收益是300%。

+0

您應該嘗試GDI。您可以使用DIB(在內存中)預乘位圖alpha。它的速度非常快。 http://stackoverflow.com/questions/307348/how-to-draw-32-bit-alpha-channel-bitmaps – dns 2015-08-12 23:02:19

回答

0

您可能希望有一個看看Eigen C++模板庫。它允許您使用高級C++代碼,該代碼使用優化的彙編程序,並支持SSE/Altivec。

快。 (見基準)。
表達式模板允許智能地刪除臨時對象並啓用延遲評估(如果適當的話) - Eigen會自動處理並在大多數情況下也處理別名。 針對SSE(2及更高版本)和AltiVec指令集執行顯式矢量化,並優雅地回退到非矢量化代碼。表達式模板允許爲整個表達式全局執行這些優化。 對於固定大小的對象,可以避免動態內存分配,並且在有意義時展開循環。 對於大型矩陣,應特別注意緩存友好性。

優雅。 (請參閱API展示)。
由於表達式模板,API非常乾淨和富有表現力。在Eigen之上實現算法感覺就像複製僞代碼一樣。您可以使用複雜的表達式,仍然依靠特徵生成優化的代碼:您不需要手動將表達式分解爲小步驟。

0

本機Win32 GDI apis處理每個像素並不昂貴。
請參閱MSDN