Android ApiDemos示例解析(59):Graphics->ColorFilters

本例ColorFilters和下例ColorMatrix 涉及到圖像處理中的很多專業術語:

Dither(圖像的抖動處理,當每個顏色值以低於8位表示時,對應圖像做抖動處理可以實現在可顯示顏色總數比較低(比如256色)時還保持較好的顯示效果: Dither on Wikipedia


Porter Duff Color Filter 也可以為Alpha Composting,指當在將一幅圖像繪制在已有背景圖像時如果融合前景和背景顏色的過程。Porter Duffer 定義瞭多種模式,每種模式使用不同的前景和背景色組合算法: Alpha Composting on Wikipedia

Android中的類PorterDuffColorFilter 定義瞭Port Duff Color Filter, 例子使用八種不同的顏色兩種模式: 其中顏色為0時,對應的colorFilter為null.

[java] 
mColors = new int[] { 
 0, 
 0xCC0000FF, 
 0x880000FF, 
 0x440000FF, 
 0xFFCCCCFF, 
 0xFF8888FF, 
 0xFF4444FF, 
}; 
  
mModes = new PorterDuff.Mode[] { 
 PorterDuff.Mode.SRC_ATOP, 
 PorterDuff.Mode.MULTIPLY, 
}; 

mColors = new int[] {
 0,
 0xCC0000FF,
 0x880000FF,
 0x440000FF,
 0xFFCCCCFF,
 0xFF8888FF,
 0xFF4444FF,
};
 
mModes = new PorterDuff.Mode[] {
 PorterDuff.Mode.SRC_ATOP,
 PorterDuff.Mode.MULTIPLY,
};對於每個ColorFilter調用drawSample

[java] 
private void drawSample(Canvas canvas, ColorFilter filter) { 
 Rect r = mDrawable.getBounds(); 
 float x = (r.left + r.right) * 0.5f; 
 float y = (r.top + r.bottom) * 0.5f – mPaintTextOffset; 
  
 mDrawable.setColorFilter(filter); 
 mDrawable.draw(canvas); 
 canvas.drawText("Label", x+1, y+1, mPaint2); 
 canvas.drawText("Label", x, y, mPaint); 
  
 for (Drawable dr : mDrawables) { 
 dr.setColorFilter(filter); 
 dr.draw(canvas); 
 } 

private void drawSample(Canvas canvas, ColorFilter filter) {
 Rect r = mDrawable.getBounds();
 float x = (r.left + r.right) * 0.5f;
 float y = (r.top + r.bottom) * 0.5f – mPaintTextOffset;
 
 mDrawable.setColorFilter(filter);
 mDrawable.draw(canvas);
 canvas.drawText("Label", x+1, y+1, mPaint2);
 canvas.drawText("Label", x, y, mPaint);
 
 for (Drawable dr : mDrawables) {
 dr.setColorFilter(filter);
 dr.draw(canvas);
 }
}ColorFilter的效果可以從文字“Label”來看,兩行文字隻偏移瞭一個像素,有重疊來看ColorFilter的不同效果,對應SRC_ATOP和MULTIPLY兩種模式,文字有可以以白色和黑色顯示:

 

感覺文字Lable在MULTIPLY模式下”Label”有點“凹下”的效果。除瞭SRC_ATOP和MULTIPLY之外,PorterDuff.Mode還定義定義瞭10多種不同模式:www.aiwalls.com

 作者:mapdigit
 

發佈留言