获取图片中某一点的颜色

demo下载链接:https://share.weiyun.com/5sjcVi5

项目主要包含两个类 :GetScreenPointColorUIImage+GetPointColor

  • GetScreenPointColor 获取触摸点并截图
  • UIImage+GetPointColor 获取图片某一点的颜色

GetScreenPointColor中包括3个方法:

  • getClickedColorWithTouches:withEvent:
    当有一个或多个手指触摸事件在当前视图或window窗体中响应
  • getClickedPointWithTouches:withEvent:
    获取当前点坐标
  • fullScreenshots:
    获取截屏

GetScreenPointColor.h

定义枚举:

typedef enum : NSUInteger {
    coordinate_window,
    coordinate_current,
} Coordinate;

定义属性及方法:

@property (nonatomic, assign) Coordinate coordinate;
//当有一个或多个手指触摸事件在当前视图或window窗体中响应
- (UIColor *)getClickedColorWithTouches:(NSSet *)touches withEvent:(UIEvent *)event;
//获取当前点坐标
- (CGPoint)getClickedPointWithTouches:(NSSet *)touches withEvent:(UIEvent *)event;
//获取截屏
-(UIImage *)fullScreenshots;

GetScreenPointColor.m

定义属性

@property (nonatomic, strong) UIImage *screenImage;

getClickedColorWithTouches:withEvent:方法

//当有一个或多个手指触摸事件在当前视图或window窗体中响应
- (UIColor *)getClickedColorWithTouches:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.coordinate = coordinate_window;
    CGPoint point = [self getClickedPointWithTouches:touches withEvent:event];
    
    self.screenImage = [self fullScreenshots];
    UIColor *currentColor = [self.screenImage colorAtPixel:point];
    return currentColor;
}

getClickedPointWithTouches:withEvent:方法

//获取当前点坐标
- (CGPoint)getClickedPointWithTouches:(NSSet *)touches withEvent:(UIEvent *)event
{
    //返回与当前接收者有关的所有的触摸对象
    NSSet *allTouches = [event allTouches];
    //视图中的所有对象
    UITouch *touch = [allTouches anyObject];
    
    CGPoint point = CGPointMake(0, 0);
    
    if (self.coordinate == coordinate_current)
    {
        //返回触摸点在当前坐标系中的当前坐标
        point = [touch locationInView:[touch view]];
    }
    
    if (self.coordinate == coordinate_window)
    {
        //返回触摸点在windows中的当前坐标
        point = [touch locationInView:[touch window]];
    }
    return point;
}

fullScreenshots方法

//获取截屏
-(UIImage *)fullScreenshots
{
    UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow];
    UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截图,包括window
    
    [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    
    return viewImage;
}

UIImage+GetPointColor.h

- (UIColor *)colorAtPixel:(CGPoint)point;

UIImage+GetPointColor.m

- (UIColor *)colorAtPixel:(CGPoint)point
{
    //判断给定的点是否被一个CGRect包含
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point))
    {
        return nil;
    }
    
    //颜色空间DeviceRGB
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    /*
     data               指向要渲染的绘制内存的地址。这个内存块的大小至少是(bytesPerRow*height)个字节
     width              bitmap的宽度,单位为像素
     height             bitmap的高度,单位为像素
     bitsPerComponent   内存中像素的每个组件的位数.例如,对于32位像素格式和RGB 颜色空间,你应该将这个值设为8
     bytesPerRow        bitmap的每一行在内存所占的比特数
     colorspace         bitmap上下文使用的颜色空间
     bitmapInfo         指定bitmap是否包含alpha通道,像素中alpha通道的相对位置,像素组件是整形还是浮点型等信息的字符串。
     */

    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, -point.x, point.y - self.size.height);
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), self.CGImage);
    CGContextRelease(context);
    
    CGFloat red   = (CGFloat)pixelData[0] / 255.0f;
    CGFloat green = (CGFloat)pixelData[1] / 255.0f;
    CGFloat blue  = (CGFloat)pixelData[2] / 255.0f;
    CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
    
    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

在 ViewController 中的使用:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UIImage *imgTest = [UIImage imageNamed:@"test.jpeg"];
    
    UIImageView *imgViewTest = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
    imgViewTest.image = imgTest;
    imgViewTest.userInteractionEnabled = YES;
    [self.view addSubview:imgViewTest];
    
    self.viewShow = [[UIView alloc] initWithFrame:CGRectMake(50, 400, 100, 100)];
    self.viewShow.layer.borderColor = [UIColor redColor].CGColor;
    self.viewShow.layer.borderWidth = 1.0f;
    [self.view addSubview:self.viewShow];
    
    self.labX = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.viewShow.frame) + 5, self.viewShow.frame.origin.y, 200, self.viewShow.frame.size.height / 2)];
    [self.view addSubview:self.labX];
    self.labX.text = @"X:";
    
    self.labY = [[UILabel alloc] initWithFrame:CGRectMake(self.labX.frame.origin.x, CGRectGetMaxY(self.labX.frame), self.labX.frame.size.width, self.labX.frame.size.height)];
    [self.view addSubview:self.labY];
    self.labY.text = @"Y";
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    GetScreenPointColor *screen = [[GetScreenPointColor alloc] init];
    
    screen.coordinate = coordinate_window;
    CGPoint pointCurrent = [screen getClickedPointWithTouches:touches withEvent:event];
    
    UIColor *colorCurrent = [screen getClickedColorWithTouches:touches withEvent:event];
    
    self.viewShow.backgroundColor = colorCurrent;
    self.labX.text = [NSString stringWithFormat:@"X:%.2f",pointCurrent.x];
    self.labY.text = [NSString stringWithFormat:@"Y:%.2f",pointCurrent.y];
}

运行效果:https://share.weiyun.com/5Iewt73

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容