当前位置: 首页 > news >正文

iOS 提取图片的主题色,并支持灵活提取

遇到一个需求,要提取图片中的色调,但还有一点特殊的需求,就是不是提取颜色最多的色调,也不是平均的色调,是图片中偏暗的色调
这就需要我们动态的调整我们提取的算法,
下面就看代码

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 第一步 先把图片缩小 加快计算速度. 但越小结果误差可能越大int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;CGSize thumbSize = CGSizeMake(100, 100*self.backgroundImgView.height/(self.backgroundImgView.width ?: 100));CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(NULL,thumbSize.width,thumbSize.height, 8, thumbSize.width*4, colorSpace,bitmapInfo);CGRect drawRect = CGRectMake(0, 0, thumbSize.width, thumbSize.height);CGContextDrawImage(context, drawRect, image.CGImage);CGColorSpaceRelease(colorSpace);// 第二步 取每个点的像素值unsigned char* data = CGBitmapContextGetData (context);if (data == NULL) {dispatch_async(dispatch_get_main_queue(), ^{callBack(nil);});};NSCountedSet* cls = [NSCountedSet setWithCapacity: thumbSize.width * thumbSize.height];for (int x = 0; x < thumbSize.width; x++) {for (int y = 0; y < thumbSize.height; y++) {int offset = 4 * (x * y);int red = data[offset];int green = data[offset + 1];int blue = data[offset + 2];int alpha =  data[offset + 3];// 过滤透明的、基本白色、基本黑色// 这里限制170是因为要去除偏亮的颜色 越接近250越亮if (alpha > 0 && (red < 170 && green < 170 && blue < 170) && (red > 5 && green > 5 && blue > 5)) {NSArray *clr = @[@(red),@(green),@(blue),@(alpha)];[cls addObject:clr];}}}CGContextRelease(context);//第三步 找到出现次数最多的那个颜色NSEnumerator *enumerator = [cls objectEnumerator];NSArray *curColor = nil;NSArray *MaxColor = nil;NSUInteger MaxCount = 0;while ((curColor = [enumerator nextObject]) != nil){NSUInteger tmpCount = [cls countForObject:curColor];if ( tmpCount < MaxCount ) continue;MaxCount = tmpCount;MaxColor = curColor;}UIColor * subjectColor = [UIColor colorWithRed:([MaxColor[0] intValue]/255.0f) green:([MaxColor[1] intValue]/255.0f) blue:([MaxColor[2] intValue]/255.0f) alpha:([MaxColor[3] intValue]/255.0f)];dispatch_async(dispatch_get_main_queue(), ^{callBack(subjectColor);});});
}

如以上代码,要注意这句条件限制
red < 170 && green < 170 && blue < 170 ,这就限制我们提取比较暗的色调,因为越接近250, 颜色是越亮的,当然,我们可以根据自己的实际需求自己动态的调整提取的色调

http://www.lryc.cn/news/448657.html

相关文章:

  • 语雀笔记使用记录
  • 安全教育培训小程序系统开发制作方案
  • 【面试题】软件测试实习(含答案)
  • 后端回写前端日期格式化
  • 微信小程序开发系列之-在微信小程序中使用云开发
  • 《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024
  • 零基础教你如何开发webman应用插件
  • AVL树(平衡二叉树)的介绍以及相关构建
  • SAP员工士气因重组受到打击
  • Unity3D 中构建行为树插件详解
  • 数学符号练习-函数连续性与导数
  • 笔记本维修与拆解(一)
  • 【JavaSE系列】IO流
  • 深入探讨在线教育系统源码:搭建知识付费平台实战方案详解
  • 前端全屏模式切换
  • 构建高可用和高防御力的云服务架构第二部分:SLB负载均衡(2/5)
  • 计算机毕业设计Python+Spark知识图谱微博舆情预测 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 Hadoop 大数据毕业设计
  • excel-VBA知识点记录
  • RabbitMQ——消息的可靠性处理
  • babylon.js-1:入门篇
  • VS Code调整字体大小
  • Python基础语句教学
  • ansible 配置
  • 堆排序算法详解:原理与Python实现
  • [论文阅读] ChartInstruct: Instruction Tuning for Chart Comprehension and Reasoning
  • 基于springboot+vue学生宿舍管理系统设计与实现
  • 【Android】模糊搜索与数据处理
  • 机器学习-KNN
  • python 安装包 site-packages
  • 大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!