先說一下調色的一些基本概念
圖片的色彩主要由色相、飽和度、明度決定。色相主要是說色彩的變化,比如紅色變化後變成綠色。飽和度是說顏色的鮮豔、豐富程度。而明度則是強調明暗,最暗則爲全黑,最亮爲全白。明度的概念比較好理解。下面用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; //返回新的位圖,也即調色處理後的圖片