HSV色彩空间
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
六棱锥
H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一HSV颜色空间模型角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。
纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。
V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系.
取色盘,这样的去色盘,其实是V为1时,HSV颜色模型中最上面一层;
HSV
如上图的取色盘,相当于HSV颜色模型中的最顶层,相当于Value为1时的情况;那么,我们可将该平面看做一个二维坐标系,通过触摸点坐标与圆心坐标,利用反三角函数,可计算出任意一点与X轴,Y轴之间的夹角,该夹角及为HSV颜色模型中的Hue;同时通过触摸点坐标与圆心可计算出当前点距离圆心的距离,该距离与圆盘半径的比值即为HSV颜色模型中的Saturation ;
那么通过上面小圆坐标和大圆圆心位置,即可得到HSV颜色模型中的Hue和Saturation,而Value前面说过,始终是1,因此可通过java的Color类的静态方法,HSV2Color(HSV[])得到对应的点的color,同时也可转成RGB值;
代码实现如下:
1.自定义ColorPickerView,实现取色功能
package test.niexu.com.myapplication;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposeShader;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.V