android 圖片調色


先說一下調色的一些基本概念

圖片的色彩主要由色相、飽和度、明度決定。色相主要是說色彩的變化,比如紅色變化後變成綠色。飽和度是說顏色的鮮豔、豐富程度。而明度則是強調明暗,最暗則爲全黑,最亮爲全白。明度的概念比較好理解。下面用photoshop裏的圖片來說明色相和飽和度。


A.飽和度B.色相C.亮度D.全部色相


色相表現爲色輪的旋轉角度。

photo文本框中顯示的值反映像素原來的顏色在色輪中旋轉的度數。正值表示順時針旋轉,負值表示逆時針旋轉。數值的範圍可以從 -180 到 +180。

飽和度表現爲距離色輪中心的距離

顏色相對於所選像素的起始顏色值,從色輪中心向外移動,或從外向色輪中心移動。數值的範圍可以從 -100 到 +100。

明亮度則表現爲RGB各分量的大小,0表示最暗,255表示最亮

代碼:

           Bitmap show;                                         //這就是原始的圖片

           int flag;                                                 // 比特位0 表示是否改變色相,比位1表示是否改變飽和度,比特位2表示是否改變明亮度

            int wi = show.getWidth();                      //得到寬度
            int he = show.getHeight();                    //得到高度
            Bitmap bmp = Bitmap.createBitmap(wi, he, Bitmap.Config.ARGB_8888);     

                                                                       //創建一個相同尺寸的可變的位圖區,用於繪製調色後的圖片
            Canvas canvas = new Canvas(bmp); //得到畫筆對象
            Paint paint = new Paint();                  //新建paint
            paint.setAntiAlias(true);                     //設置抗鋸齒,也即是邊緣做平滑處理

            ColorMatrix cm1=new ColotMatrix(); //用於顏色變換的矩陣,android  位圖顏色變化處理主要是靠該對象完成
            ColorMatrix cm2=new ColotMatrix();           

            ColorMatrix cm3=new ColotMatrix();            

            cm1.reset();                                     //設爲默認值

            if ((flag & 1) != 0)                           //需要改變色相
            {

               //hueColor就是色輪旋轉的角度,正值表示順時針旋轉,負值表示逆時針旋轉
                cm1.setRotate(0, hueColor);    //控制讓紅色區在色輪上旋轉hueColor葛角度
                cm1.setRotate(1, hueColor);    //控制讓綠紅色區在色輪上旋轉hueColor葛角度
                cm1.setRotate(2, hueColor);    //控制讓藍色區在色輪上旋轉hueColor葛角度

              //這裏相當於改變的是全圖的色相
            }
            if ((flag & 2) != 0)                         //需要改變飽和度
            {

               //saturation 飽和度值,最小可設爲0,此時對應的是灰度圖(也就是俗話的“黑白圖”),

               //爲1表示飽和度不變,設置大於1,就顯示過飽和

                cm2.reset();
                cm2.setSaturation(saturation);
                cm1.postConcat(cm2);          //效果疊加
            }
            if ((flag & 4) != 0)
            {

               //f 表示亮度比例,取值小於1,表示亮度減弱,否則亮度增強

                cm3.reset();
                cm3.setScale(f, f, f, 1);  //紅、綠、藍三分量按相同的比例,最後一個參數1表示透明度不做變化,此函數詳細說明參考 android doc

                cm1.postConcat(cm3);       //效果疊加
            }
            paint.setColorFilter(new ColorMatrixColorFilter(cm1));//設置顏色變換效果
            canvas.drawBitmap(show, 0, 0, paint);      //將顏色變化後的圖片輸出到新創建的位圖區
            return bmp;                        //返回新的位圖,也即調色處理後的圖片

                           

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章