2012-05-28 162 views
3

我目前正在將應用程序從iOS移植到Android,並且在圖像處理方面遇到了一些困難。使用iOS混合模式的Android圖像和顏色混合

我有一個過濾器類,由ImageOverlays和ColorOverlay組成,它們以特定的順序應用於給定的基本位圖。每個ColorOverlays都有一個RGB顏色值,一個BlendModeId和一個alpha值。每個ImageOverlay都有一個圖像位圖,一個BlendModeId和一個alpha /強度值。

我的主要問題是,我需要支持從iOS版採取以下混合模式:

  1. CGBlendModeNormal
  2. CGBlendModeMultiply
  3. CGBlendModeScreen
  4. CGBlendModeOverlay
  5. CGBlendModeDarken
  6. CGBlendModeLighten
  7. CGBlendModeColorDodge

其中一些在Android中有相應的PorterDuff.Mode類型,而另一些則沒有。更糟的是,一些確實存在的模式是在最近版本的Android中引入的,我需要在API級別8上運行。

嘗試從頭開始構建模式效率極低。

此外,即使使用API​​8中存在的模式,我也無法找到混合2個圖像但允許您指定遮罩強度(來自ImageOverlay的Alpha值)的方法。與ColorOverlays類似。

iOS的功能,我想在Android的複製是

CGContextSetBlendMode(...) 
CGContextSetFillColorWithColor(...) 
CGContextFillRect(...) - This one is easy 
CGContextSetAlpha(...) 

我已經開始尋找支持這些混合模式和alpha操作小的第三方庫。最有希望的是poelocesar's lib-magick,據推測它是ImageMagick的一個端口。

儘管lib-magick確實提供了大多數所需的混合模式(稱爲CompositeOperator),但我無法找到設置強度值或使用混合模式進行顏色填充的方法。

我確定有人以前有過這個問題。任何幫助,將不勝感激。順便說一下,項目規範禁止我進入OpenGLES。

回答

2

即使我通過電子郵件幫你,我想我會發布到你的問題太多,以防有人想要一些更多的解釋:-)

2.2 API 8級,其中支持 NDK中的「libjnigraphics」庫,它允許您訪問位圖對象的像素緩衝區。 你可以手動做這些混合 - 他們是相當簡單的數學計算 ,可以很快完成。

查看this site Android的JNI位圖信息。

它很簡單,只需創建一個JNI方法混合()你需要(無論是顏色值或可能另一個位圖對象混合在一起)任何 參數,鎖定像素緩衝區爲位圖,這樣做需要 計算,並解鎖位圖。 Link

需要注意內存中位圖的格式,不過, 因爲565的移位/計算將與8888不同。請記住,如果它看起來不正確!