当前位置: 首页 > 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, 颜色是越亮的,当然,我们可以根据自己的实际需求自己动态的调整提取的色调

相关文章:

  • WingetUI:可视化Windows常用的命令行包管理工具
  • php中打印函数
  • 文件的管理
  • 资质申请中常见的错误有哪些?
  • Python酷库之旅-第三方库Pandas(130)
  • net core mvc 数据绑定 《1》
  • 基于php摄影门户网站
  • Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据
  • 机器学习(2):机器学习的相关术语
  • .Net 6.0 监听Windows网络状态切换
  • [CSP-J 2022] 解密
  • LeetCode 热题 100 回顾8
  • 智能红外抄表系统的设计与实现(论文+源码)_kaic
  • iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行
  • 组合优化与凸优化 学习笔记5 对偶拉格朗日函数
  • 【笔记】你不知道的JS读书笔记——Promise
  • Android开源项目规范总结
  • C++类中的特殊成员函数
  • Java应用性能调优
  • js写一个简单的选项卡
  • js正则,这点儿就够用了
  • leetcode讲解--894. All Possible Full Binary Trees
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • nfs客户端进程变D,延伸linux的lock
  • react 代码优化(一) ——事件处理
  • Redux 中间件分析
  • Vue 2.3、2.4 知识点小结
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 彻底搞懂浏览器Event-loop
  • 使用agvtool更改app version/build
  • 小程序01:wepy框架整合iview webapp UI
  • 优化 Vue 项目编译文件大小
  • 主流的CSS水平和垂直居中技术大全
  • linux 淘宝开源监控工具tsar
  • 积累各种好的链接
  • 如何正确理解,内页权重高于首页?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (生成器)yield与(迭代器)generator
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)Dubbo快速入门、介绍、使用
  • (一)VirtualBox安装增强功能
  • **python多态
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net dataexcel 脚本公式 函数源码
  • .NET Micro Framework初体验
  • .net 调用php,php 调用.net com组件 --
  • .net和jar包windows服务部署
  • .Net实现SCrypt Hash加密
  • .net网站发布-允许更新此预编译站点