iOS 基于 HSB hsv 颜色模型的颜色选择器的实现

来源:互联网 发布:java 潜艇发射导弹 编辑:程序博客网 时间:2024/06/06 17:18

//转载请注明http://blog.csdn.net/zzzqqq111222 支持原创哦

在色彩领域计算机常用的模型是rgb色彩模型,但对颜色更直观的表述却是hsb(又称hsv 我猜是为了和rgb的b区别所以叫的hsv)模型(不懂的百度)。我要实现的效果如图1


图1.

解释一下哈 外围的环用于 颜色的选择(就是hsb中的h--色相)内三角形用于其他两个参数s,b的选择。

看了一下外围的圆圈比较好实现就是画个圆环再获取在触摸事件再根据坐标计算出角度,angle ,h=angle/360; (注hsb都小于1 的)这样圆环就完成 了;

附根据坐标算角度的源码:

<pre name="code" class="objc">/**计算点所在角度的@Parameter p1 中心点@Parameter p2 @return 0-360 度数#define SQR(x ) (x)*(x)#define ToDeg(rad)( (180.0 * (rad)) / M_PI )*/static inline float AngleFromNorth(CGPoint p1, CGPoint p2) {//将坐标轴移动到中心点    CGPoint v = CGPointMake(p2.x-p1.x,p2.y-p1.y); //算出距原点的距离    float vmag = sqrt(SQR(v.x) + SQR(v.y)), result = 0;    v.x /= vmag;    v.y /= vmag;//根据坐标 三角正切公式 算角度    double radians = atan2(v.y,v.x);//转化    result = ToDeg(radians);    return (result >=0  ? 360 - result : -result );}


接下来 主要的就是三角形了 要能随圆环给的h值来变化就要弄清变化的规律。 规律是这样的(经过的多年的研究。。。):

首先定义最上边的顶点为A,最下的顶点为B最右的顶点为C

1.在C点s,b值为最大1 . 

2.  三角形上的点的p, 将p与C连线,延长线与线AB交与点D,那么此点的颜色b值=BD/AB; 而s值为Dp/DA;

接下来分析好了就是实现它了;

外围的环就用一张静态图就可以了

三角形得用像素点绘图生成图片再贴上去的方式了,还有IOS上有HSB这样表示颜色的类极大方便了我。

绘制这个三角形是个麻烦事

三角形动态绘制的源码:

-(CGImageRef)triangleImg{    unsigned int* data = malloc((int)inner_radius*(int)inner_radius*sizeof(int)*4);unsigned int* count = data;for(int j=0;j<(int)inner_radius*2;j++){        for(int i=0;i<(int)inner_radius*2;i++){                        if([self isInThisTriangle:i+outside_radius-inner_radius+PADDING :j+outside_radius-inner_radius+PADDING]){             //坐标系变幻把三角形瓣正 方便计算//                 float J_x = i - inner_radius;                float J_y = j - inner_radius;                         const float *x = CGColorGetComponents([self pointToColor:J_x :J_y].CGColor );                unsigned int r=x[0]*255;                unsigned int g=x[1]*255;                unsigned int b=x[2]*255;                unsigned int a=x[3]*255;                *count++ = a|b<<8|g<<16|r<<24 ;                            }else{                *count++ = 0;            }                     }    }    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Little;CGContextRef ctx = CGBitmapContextCreate(data, (int)inner_radius*2, (int)inner_radius*2, 8, (int)inner_radius*8, colorSpace, bitmapInfo);    CGColorSpaceRelease(colorSpace);CGImageRef img = CGBitmapContextCreateImage(ctx);CGContextRelease(ctx);free(data);return img;}

以前运行在真机上的时候好像有点啥问题 不知道改没改  你们去试试吧

源码 还是要给点分的 地址:http://download.csdn.net/detail/zzzqqq111222/7937425点击打开链接 



0 0