色盘取出点击处的R,G,B色值(

色盘取出点击处的颜色组成并显示在控制器的背景上。

效果图:

下面为核心源代码。

色盘的两个类i:

 

//  Created by dev on 16/2/4.
//  Copyright © 2016年 DLS. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "DSColor.h"
@protocol DSColorDiskViewDelegate<NSObject>
@optional
-(void)selectCurrentColor:(DSColor *)currentColor;
@end

@interface DSColorDiskView : UIView
@property(nonatomic, strong)id<DSColorDiskViewDelegate>delegate;
@property(nonatomic, strong)DSColor *currentColor;
@end
//
//  DSColorDiskView.m
//  色盘取色
//
//  Created by dev on 16/2/4.
//  Copyright © 2016年 DLS. All rights reserved.
//

#import "DSColorDiskView.h"
#import "UIView+XMGExtension.h"
#import "Masonry.h"
#define radius self.diskImageView.frame.size.height/2-10
@interface DSColorDiskView()
@property(nonatomic, strong)UIImageView *diskImageView;
@property(nonatomic, strong)UIImage *diskImage;
@property(nonatomic, strong)UIImage *pointImage;
@property(nonatomic, strong)UIImageView *pointImageView;
@property(nonatomic, assign)CGPoint pp;
@end
@implementation DSColorDiskView
-(DSColor *)currentColor{
    if (!_currentColor) {
        _currentColor = [[DSColor alloc] init];
    }
    return _currentColor;
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self initView];
        
    }
    return self;
}
-(void)initView{
    _diskImage = [UIImage imageNamed:@"colorPicker5"];
    UIImageView *diskImageView = [[UIImageView alloc] initWithImage:_diskImage];
    
    self.diskImageView = diskImageView;
    [self addSubview:diskImageView];
    
    self.pointImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"colorPickerKnob"]];
    self.pointImageView.width = 30;
    self.pointImageView.height = 30;
    //self.pointImageView.backgroundColor = [UIColor redColor];
    [self.diskImageView addSubview:self.pointImageView];
    
}
/**
 *  布局时调用
 */
-(void)layoutSubviews{
    CGFloat Width = self.size.width;
    CGFloat Height = self.size.height;
    NSLog(@"Width = %f  Height = %f",Height,Width);
    [self.diskImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.mas_centerY);
        make.centerX.mas_equalTo(self.mas_centerX);
        make.height.mas_equalTo(Height);
        make.width.mas_equalTo(Width);
    }];
    [self.pointImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.mas_centerY);
        make.centerX.mas_equalTo(self.mas_centerX);
    }];
}
//可不用
-(void)setPp:(CGPoint )pp{
    _pp = pp;
    self.pointImageView.center = CGPointMake(_pp.x, _pp.y);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.diskImageView];
    
    double distance = sqrt(((self.diskImageView.center.x-point.x)*(self.diskImageView.center.x -point.x)) + ((self.diskImageView.center.y - point.y)*(self.diskImageView.center.y - point.y)));
    NSLog(@"radius = %f,distance = %f",radius,distance);
    if (distance > radius) {
        return;
    }
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height), point)) {
        return ;
    }
    //self.pp = point;
    self.pointImageView.center = CGPointMake(point.x, point.y);
    NSInteger pointX = trunc(point.x);
    NSInteger pointY = trunc(point.y);
    CGImageRef cgImage = self.diskImage.CGImage;
    NSUInteger width = self.frame.size.width;
    NSUInteger height = self.frame.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * 1;
    NSUInteger bitsPerComponent = 8;
    unsigned char pixelData[4] = { 0, 0, 0, 0 };
    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                 1,
                                                 1,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    
    // Draw the pixel we are interested in onto the bitmap context
    CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
    CGContextRelease(context);
    
    // Convert color values [0..255] to floats [0.0..1.0]
    self.currentColor.R   = (CGFloat)pixelData[0] / 255.0f;
    self.currentColor.G  = (CGFloat)pixelData[1] / 255.0f;
    self.currentColor.B   = (CGFloat)pixelData[2] / 255.0f;
    NSLog(@"%f%f%f",(CGFloat)pixelData[0],(CGFloat)pixelData[1],(CGFloat)pixelData[2]);
    
    NSLog(@"%f",self.currentColor.R);
    [self.delegate selectCurrentColor:self.currentColor];
 }
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.diskImageView];
    
    double distance = sqrt(((self.diskImageView.center.x-point.x)*(self.diskImageView.center.x -point.x)) + ((self.diskImageView.center.y - point.y)*(self.diskImageView.center.y - point.y)));
    if (distance > radius) {
        return;
    }
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height), point)) {
        return ;
    }
    //self.pp = point;
    //中间小圆的位置
    self.pointImageView.center = CGPointMake(point.x, point.y);
    NSInteger pointX = trunc(point.x);
    NSInteger pointY = trunc(point.y);
    CGImageRef cgImage = self.diskImage.CGImage;
    NSUInteger width = self.frame.size.width;
    NSUInteger height = self.frame.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * 1;
    NSUInteger bitsPerComponent = 8;
    unsigned char pixelData[4] = { 0, 0, 0, 0 };
    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                 1,
                                                 1,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    
    //
    CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
    CGContextRelease(context);
    
    //
    self.currentColor.R   = (CGFloat)pixelData[0] / 255.0f;
    self.currentColor.G  = (CGFloat)pixelData[1] / 255.0f;
    self.currentColor.B   = (CGFloat)pixelData[2] / 255.0f;
    NSLog(@"%f%f%f",(CGFloat)pixelData[0],(CGFloat)pixelData[1],(CGFloat)pixelData[2]);
    
    NSLog(@"%f",self.currentColor.R);
    [self.delegate selectCurrentColor:self.currentColor];
    //不通过代理直接设置父视图的背景颜色
    //self.superview.backgroundColor = [UIColor redColor];

}
@end
//
//  DSColor.h
//  色盘取色
//
//  Created by dev on 16/2/4.
//  Copyright © 2016年 DLS. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface DSColor : NSObject
@property(nonatomic, assign)CGFloat R;
@property(nonatomic, assign)CGFloat G;
@property(nonatomic, assign)CGFloat B;

@end
//
//  DSColor.m
//  色盘取色
//
//  Created by dev on 16/2/4.
//  Copyright © 2016年 DLS. All rights reserved.
//

#import "DSColor.h"

@implementation DSColor

@end

下面为控制器代码:

#import "ViewController.h"
#import "DSColorDiskView.h"
#import "Masonry.h"
@interface ViewController ()<DSColorDiskViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    DSColorDiskView *colorDiskView = [[DSColorDiskView alloc] init];
    colorDiskView.delegate = self;
    [self.view addSubview:colorDiskView];
    //colorDiskView.backgroundColor = [UIColor redColor];
    [colorDiskView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self.view.mas_centerX);
        make.centerY.equalTo(self.view.mas_centerY).offset(-50);
        make.width.mas_equalTo(200);
        make.height.mas_equalTo(200);
    }];
}
-(void)selectCurrentColor:(DSColor *)currentColor{
    
    self.view.backgroundColor = [UIColor colorWithRed:currentColor.R green:currentColor.G blue:currentColor.B alpha:1.0];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

源码连接地址:http://pan.baidu.com/s/1jHrn2lw

原文地址:https://www.cnblogs.com/DLS520/p/5182157.html