android 擷取圖片的亮度

來源:互聯網
上載者:User

 

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

 

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

 

代碼如下:

 

 

Drawable localDrawable = wpm.getDrawable(); 

        Bitmap bitmap = Bitmap 

                .createBitmap( 

                        localDrawable.getIntrinsicWidth(), 

                        localDrawable.getIntrinsicHeight(), 

                        localDrawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 

                                : Bitmap.Config.RGB_565); 

        Canvas canvas = new Canvas(bitmap); 

        localDrawable.setBounds(0, 0, localDrawable.getIntrinsicWidth(), 

                localDrawable.getIntrinsicHeight()); 

        localDrawable.draw(canvas); 

 

        int localWidth = this.getWindowManager().getDefaultDisplay().getWidth(); 

        int y[] = { 0, 4, 9, 13, 18, 23, 28, 33, 38, 43, 48 }; 

        int x[] = { 0, localWidth / 8, localWidth * 2 / 8, localWidth * 3 / 8, 

                localWidth * 4 / 8, localWidth * 5 / 8, localWidth * 6 / 8, 

                localWidth * 7 / 8, localWidth }; 

 

        int r; 

        int g; 

        int b; 

        int number = 0; 

        double bright = 0; 

        Integer localTemp; 

        for (int i = 0; i < x.length; i++) { 

            for (int j = 0; j < y.length; j++) { 

                number++; 

                localTemp = (Integer) bitmap.getPixel(x[i], y[j]); 

                r = (localTemp | 0xff00ffff) >> 16 & 0x00ff; 

                g = (localTemp | 0xffff00ff) >> 8 & 0x0000ff; 

                b = (localTemp | 0xffffff00) & 0x0000ff; 

 

                bright = bright + 0.299 * r + 0.587 * g + 0.114 * b; 

                Log.i("xiao", "bright = " + bright); 

            } 

        } 

        localDrawable = null; 

        bitmap = null; 

        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小,則這個圖比較暗。

 

摘自:xiaoxiaobian3310903的專欄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.