歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 獲取圖片的亮度

問題:現在有一個有背景的控件AA(比如ImageView、LinearLayout、ViewGroup或者其他的控件),現在想在這個控件上放置其他控件BB來顯示當前的狀態(比如Launcher中的屏幕指示器),控件AA的背景在程序中是可以動態修改的,如果AA的背景和BB的背景色很相近,BB的效果就不是很明顯,不能很清楚的現實出當前AA的狀態。

解決辦法:獲取到AA背景的RGB值,根據RGB值計算當前屏幕的亮度,為BB制作兩套圖片,分別為較亮的和較暗的,如果AA的亮度值比較高,則BB使用較暗的圖片,如果AA的亮度值比較低,則BB使用較亮的圖片,這樣BB的作用就很明顯。

代碼如下:

  1. Drawable localDrawable = wpm.getDrawable();  
  2.         Bitmap bitmap = Bitmap  
  3.                 .createBitmap(  
  4.                         localDrawable.getIntrinsicWidth(),  
  5.                         localDrawable.getIntrinsicHeight(),  
  6.                         localDrawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
  7.                                 : Bitmap.Config.RGB_565);  
  8.         Canvas canvas = new Canvas(bitmap);  
  9.         localDrawable.setBounds(00, localDrawable.getIntrinsicWidth(),  
  10.                 localDrawable.getIntrinsicHeight());  
  11.         localDrawable.draw(canvas);  
  12.   
  13.         int localWidth = this.getWindowManager().getDefaultDisplay().getWidth();  
  14.         int y[] = { 0491318232833384348 };  
  15.         int x[] = { 0, localWidth / 8, localWidth * 2 / 8, localWidth * 3 / 8,  
  16.                 localWidth * 4 / 8, localWidth * 5 / 8, localWidth * 6 / 8,  
  17.                 localWidth * 7 / 8, localWidth };  
  18.   
  19.         int r;  
  20.         int g;  
  21.         int b;  
  22.         int number = 0;  
  23.         double bright = 0;  
  24.         Integer localTemp;  
  25.         for (int i = 0; i < x.length; i++) {  
  26.             for (int j = 0; j < y.length; j++) {  
  27.                 number++;  
  28.                 localTemp = (Integer) bitmap.getPixel(x[i], y[j]);  
  29.                 r = (localTemp | 0xff00ffff) >> 16 & 0x00ff;  
  30.                 g = (localTemp | 0xffff00ff) >> 8 & 0x0000ff;  
  31.                 b = (localTemp | 0xffffff00) & 0x0000ff;  
  32.   
  33.                 bright = bright + 0.299 * r + 0.587 * g + 0.114 * b;  
  34.                 Log.i("xiao""bright = " + bright);  
  35.             }  
  36.         }  
  37.         localDrawable = null;  
  38.         bitmap = null;  
  39.         bright =(int)(bright / number);  

代碼解釋:得到Drawable對象後轉換為Bitmap(Drawable對象沒有返回它RGB值的函數,Bitmap可以返回某個點的RGB值bitmap.getPixel),對當前區域取一些特定點獲取其RGB值,bitmap.getPixel返回的是ARGB值,通過移位操作獲取到R、G、B的值,使用亮度=0.229×R + 0.587*G + 0.114*B進行亮度值計算,將所有點的亮度值相加後取一個平均值,如果這個值比128大,則這個圖片較亮,如果這個值比128小,則這個圖比較暗。

Copyright © Linux教程網 All Rights Reserved