论取任意图片上任意点的颜色值

原来,我们可爱的产品汪有个需求,就是显示访客啊,或者企业头像啊,外圈呢默认不加边框,这样显得更文艺,头像和背景酷炫的图片完美融合,但是背景图都是浅色调,如果遇到用户头像是白色背景,或者室外蓝天白云的,就会模糊不清,分不清头像和背景图,然后就有了一个需求,取头像最外圈的色值,如果是浅色调,那给它加上浅蓝色边框,如果是深色不做处理,然后就有了这个demo,参考过别人代码,自己做过修正,无内存泄漏。话不多说,贴代码。

//

//  ViewController.m

//  获取图片某一点颜色值

//

//  Created by Minge on 16/11/15.

//  Copyright ? 2016年 guoxin. All rights reserved.

//

#import "ViewController.h"

#import <CoreImage/CoreImage.h>

#import <CoreGraphics/CoreGraphics.h>

@interface ViewController ()

@property (nonatomic, strong) UIImageView *imageView;

@property (nonatomic, strong) UIView *showView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

UILabel *label = [[UILabel alloc] init];

label.text = @"取色板";

[self.view addSubview:label];

UILabel *label1 = [[UILabel alloc] init];

label1.text = @"显色板";

[self.view addSubview:label1];

//239 × 168 pixels

UIImageView *imageView = [[UIImageView alloc] init];

imageView.frame = CGRectMake((self.view.frame.size.width - 240) * 0.5, 150, 240, 168);

imageView.image = [UIImage imageNamed:@"colors.jpg"];

imageView.userInteractionEnabled = NO;

imageView.backgroundColor = [UIColor redColor];

self.imageView = imageView;

[self.view addSubview:imageView];

label.frame = CGRectMake((self.view.frame.size.width - 240) * 0.5, 120, 100, 20);

UIView *showView = [[UIView alloc] init];

showView.backgroundColor = [UIColor blackColor];

self.showView = showView;

showView.frame = CGRectMake((self.view.frame.size.width - 240) * 0.5, 350, 50, 50);

[self.view addSubview:showView];

label1.frame = CGRectMake((self.view.frame.size.width - 240) * 0.5, 320, 100, 20);

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

NSSet *allTouches = [event allTouches];

UITouch *touch = [allTouches anyObject];

CGPoint touchPoint = [touch locationInView:self.imageView];

int x = touchPoint.x;

int y = touchPoint.y;

NSLog(@"touch (x, y) is (%d, %d) in (%f, %f)", x, y,self.imageView.frame.size.width,self.imageView.frame.size.height);

if (touchPoint.x > self.imageView.frame.size.width || touchPoint.y > self.imageView.frame.size.height) {

NSLog(@"超出图片范围,无法识别");

return;

} else {

UIColor *color = [self getPixelColorAtLocation:touchPoint inImage:[UIImage imageNamed:@"colors.jpg"]];

self.showView.backgroundColor = color;

}

}

- (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image

{

UIColor* color = nil;

CGImageRef inImage = image.CGImage;

CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];

if (cgctx == NULL) {

return nil;

}

size_t w = CGImageGetWidth(inImage);

size_t h = CGImageGetHeight(inImage);

CGRect rect = {{0,0},{w,h}};

CGContextDrawImage(cgctx, rect, inImage);

unsigned char* data = CGBitmapContextGetData (cgctx);

if (data != NULL) {

int offset = 4*((w*round(point.y))+round(point.x));

int alpha =  data[offset];

int red = data[offset+1];

int green = data[offset+2];

int blue = data[offset+3];

color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:

(blue/255.0f) alpha:(alpha/255.0f)];

}

CGContextRelease(cgctx);

if (data) {

free(data);

}

return color;

}

- (CGContextRef)createARGBBitmapContextFromImage:(CGImageRef)inImage

{

CGContextRef context = NULL;

CGColorSpaceRef colorSpace;

void *bitmapData;

int bitmapByteCount;

int bitmapBytesPerRow;

size_t pixelsWide = CGImageGetWidth(inImage);

size_t pixelsHigh = CGImageGetHeight(inImage);

bitmapBytesPerRow   = (int)(pixelsWide * 4);

bitmapByteCount     = (int)(bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();

if (colorSpace == NULL)

{

fprintf(stderr,"Error allocating color space\n");

return NULL;

}

bitmapData = malloc(bitmapByteCount);

if (bitmapData == NULL)

{

fprintf(stderr,"Memory not allocated!");

CGColorSpaceRelease(colorSpace);

return NULL;

}

context = CGBitmapContextCreate(bitmapData,

pixelsWide,

pixelsHigh,

8,

bitmapBytesPerRow,

colorSpace,

kCGImageAlphaPremultipliedFirst);

if (context == NULL)

{

free(bitmapData);

fprintf(stderr,"Context not created!");

}

CGColorSpaceRelease(colorSpace);

return context;

}

@end

中间有两张我测试用的图片,随便给一个就好了,放上效果图。

通过这个demo就可以轻松完成产品汪的需求了,取图片上几个点的色值,拿出来让ui给个浅色的参考标准,判断一下就可以了。

时间: 2024-10-10 23:23:36

论取任意图片上任意点的颜色值的相关文章

使用python爬取MedSci上的影响因子排名靠前的文献

使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn/sci的交互过程.可以使用谷歌或火狐浏览器的“审查元素-->Network”,然后就可以看到操作页面就可以看到网站的交互信息.当在网页上点击“我要查询”时,网页会发送一个POST消息给服务器,然后,服务器返回查询结果 然后,将查询到的结果使用正则表达式提取出需要的数据. 最后将提取出的数据输出到文

41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少

//1.输入数字需要保存在数组中,注意数组的首元素问题//2.需要截取出各位数字//3.判断是哪一个数字//4.进行计数 (1)我出错的程序: #include<iostream> using namespace std; int main() { int p[20]; int temp; int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0; cout<<"please input 20 numbers between 1~99: &q

Python编写网页爬虫爬取oj上的代码信息

OJ升级,代码可能会丢失. 所以要事先备份. 一开始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启发和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 python2.7版本, 试了一下修改到3.0版本, 要做很多包的更替,感觉比较烦,所以索性就在这个2.7版本上完善了. 首先观赏一下原始代码,我给加了一些注释: # -*- coding: cp936 -*- import urllib2 import urllib import re import

用Python爬取网页上的小说,让你从此告别书荒!

人生苦短,我用Python.有道爱看小说的小伙伴们,在看小说的期间总会遇到那么一段书荒期,在这段期间想看书却找不到,要么就是要VIP,要么就是下载不了.所以学会爬取网站上的小说是很有必要的,今天就以爬取笔趣阁小说为例,进行网页上小说的爬取.首先当我们打开笔趣阁的网页时,我们会看到很多的小说列表,如下图所示: ? 就拿爬取图上所示的小说来说,我们要进行以下的几个步骤: 爬取小说首先要构建请求表头: ? 然后我们的获取下载链接: ? 接下来我们进行文章内容的爬取: ? 最后我们将爬取来的小说写入到文

爬取链家任意城市租房数据(北京朝阳)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 15:56 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市租房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import os

爬取链家任意城市二手房数据(天津)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 12:40 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市二手房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import o

二、windows下使用git拉取github上的项目(通过设置ssh key方式)

一.windows下使用git拉取github上的项目 1.创建仓库 说明: 2.打开git bash 3.使用ssh-keygen命令生成自己的公钥和私钥 首先输入ssh-keygen,这里会提示你输入私钥保存的位置,直接回车使用默认位置即可, 后面会两次提示输入密码 直接回车 这里标红的两个文件 id_rsa和id_rsa.pub分别是私钥和公钥 4.查看生成的秘钥 cat ~/.ssh/id_rsa.pub 此时打开C:UsersAdministrator.ssh 文件夹(.ssh文件夹默

charles抓取线上接口数据替换为本地json格式数据

最近要做下拉刷新,无奈测试服务器的测试数据太少,没有足够的数据做下拉刷新,所以用charles抓取了测试服务器的接口,然后在伪造了很多数据返回到我的电脑上,下面来说说使用方法: 第一步: 安装FQ软件 XX-net,这个自己去百度安装方法,切换连接方式为系统代理,如下图: 第二步:以window为例,让charles支持跨域 打开charles软件 - > proxy菜单栏 -> 勾选windows proxy -> Flie菜单栏 -> New Session ->刷新你的

抓取Iphone上app的网络数据

这一小节主要记录下我在使用青花瓷(charles)进行手机联结mac并进行抓包时遇到的问题,主要是青花瓷软件的相关设置. 由于苹果公司对app数据安全性的强制要求,目前市面上很多app的接口都使用https.所以现在单纯的拿青花瓷来直接抓取手机上app的数据显然是行不通了.如果想要截取到完好的https数据,需要以下几步: 一.在mac端安装charles的证书:打开charles,Help->SSL Proxying->Install Charles Root Certifacate,会自动