iOS 实现图片颜色拾取器

  • 为什么需要颜色拾取
  • iOS颜色拾取器的实现
    • CGContext的使用
    • 自定义颜色采集板View
    • 颜色选择器的使用
  • 结束

为什么需要颜色拾取

有些APP开发业务中经常需要用到颜色拾取的功能,来完成对所需颜色的选择,比如主题设置功能,废话不多说,需要的同学自己拿去用吧!

iOS颜色拾取器的实现

CGContext的使用

使用CGContext进行图片颜色的拾取能够节省内存的使用(CGContext对图片管理的具体使用后期来专讲一下)

  1. 获取UIImageView中的UIImage
  2. 拾取坐标的转换
  3. 利用BitmapInfo来获取UIImage的RGB分布
  4. 利用CGContext获取目标像素的分布值
  5. 输出对应位置的颜色值
func getColor(inImageView imageview: UIImageView, selectedPoint: CGPoint) -> UIColor?{//imageview图片let image: UIImage = imageview.image!//imageview中的坐标对用image的坐标let x_factor = image.size.width/imageview.frame.widthlet y_factor = image.size.height/imageview.frame.heightlet newSelectedPoint: CGPoint = CGPoint.init(x: selectedPoint.x*x_factor, y: y_factor*selectedPoint.y)if !CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height).contains(newSelectedPoint){return nil}// 用来存放目标像素值var pixel = [UInt8](repeatElement(0, count: 4))// 颜色空间为 RGB,这决定了输出颜色的编码是 RGB 还是其他(比如 YUV)let colorSpace = CGColorSpaceCreateDeviceRGB()// 设置位图颜色分布为 RGBAlet bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValueguard let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo) else {return nil}// 设置 context 原点偏移为目标位置所有坐标context.translateBy(x: -newSelectedPoint.x, y: -newSelectedPoint.y)// 将图像渲染到 context 中imageview.layer.render(in: context)return UIColor(red: CGFloat(pixel[0]) / 255.0,green: CGFloat(pixel[1]) / 255.0,blue: CGFloat(pixel[2]) / 255.0,alpha: CGFloat(pixel[3]) / 255.0)}

自定义颜色采集板View

  1. View中包含UIImageView显示需要采集颜色的图片
  2. 包含UIButton作为采集位置的指示器
  3. 利用UIPanGestureRecognizer实现拖动UIButton选择采集位置
import UIKit
typealias ColorChange = (UIColor?)->Void //选择颜色的闭包
@IBDesignable         //可视化的关键字
class ColorSelectedView: UIView {@IBOutlet var bgview: UIView!@IBOutlet weak var gradientImageView: UIImageView!@IBOutlet weak var selectedBtn: UIButton!var panGesture: UIPanGestureRecognizer!var colorChange: ColorChange?override init(frame: CGRect) {       //每一步都必须super.init(frame: frame)//实现父初始化bgview = loadViewFromNib()  //从xib中加载视图bgview.frame = bounds       //设置约束或者布局addSubview(bgview)          //将其添加到自身中}required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)bgview = loadViewFromNib()bgview.frame = boundsaddSubview(bgview)}//MARK:加载xib文件的view视图func loadViewFromNib() -> UIView {//重点注意,否则使用的时候不会同步显示在IB中,只会在运行中才显示。//注意下面的nib加载方式直接影响是否可视化,如果bundle不确切(为nil或者为main)则看不到实时可视化let nib = UINib(nibName:String(describing: ColorSelectedView.self), bundle: Bundle(for:ColorSelectedView.self))//【????】怎么将类名变为字符串:String(describing: MyView.self) Bundle的参数为type(of: self)也可以。let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIViewpanGesture = UIPanGestureRecognizer.init(target: self, action: #selector(gestureAction))selectedBtn?.addGestureRecognizer(panGesture)return view}//拖动选择需要采集颜色的位置@objc func gestureAction(_ sender: UIPanGestureRecognizer){if sender.view == self.selectedBtn{if sender.state != .ended && sender.state != .failed{let point: CGPoint = sender.location(in: self)var newpoint: CGPoint = pointif point.x < 0 {newpoint.x = 0}if point.y < 0 {newpoint.y = 0}if point.x > self.frame.size.width-30 {newpoint.x = self.frame.size.width-30}if point.y > self.frame.size.height-30 {newpoint.y = self.frame.size.height-30}self.selectedBtn.frame.origin = newpointlet selecteColor: UIColor? =self.getColor(inImageView: self.gradientImageView, selectedPoint: CGPoint.init(x: newpoint.x+15, y: newpoint.y+15))if selecteColor != nil{if colorChange != nil{colorChange!(selecteColor)}}}}}
}

颜色选择器的使用

  1. 在xib文件中或者在storyboard可视化界面中直接使用
  2. 在代码中直接使用
@IBOutlet weak var colorSelectedView: ColorSelectedView!
...
colorSelectedView.colorChange = {(color: UIColor?) -> Void inif color != nil{...//按自己需要使用该颜色}}

结束

哈哈,可以自己拖动Button进行位置选择,当拖动时会实时输出选中位置的颜色。好了,就是这么简单!你也来试试吧!

动手教你撸一个iOS颜色拾取器相关推荐

  1. 手把手教你撸一个Web汇率计算器

    手把手教你撸一个Web汇率计算器 前言 前段时间刚接触到前端网页开发,但是对于刚入门的小白而言,像flask.Django等这类稍大型的框架确实不太适合,今天这个Dash是集众家之长于一体的轻量化We ...

  2. 颜色拾取器color picker (javascript version)

    颜色拾取器 216种web safe color的构造方法 var cl = ['00','33','66','99','CC','FF'];     var clist = [];     for( ...

  3. 用 WPF 写的颜色拾取器

    之前都是用别人的颜色拾取器,今天自己用WPF写了一个颜色拾取器小程序 拾取鼠标所在位置的颜色,按键盘上的空格键停止取色 程序下载:MyWPFScreenColorE.rar 程序里面有一个全局的勾子实 ...

  4. windows(C语言版)——颜色拾取器

    2019独角兽企业重金招聘Python工程师标准>>> 这段时间一直有看<windows程序设计>,通过C语言调用windows API,这并不是件轻松的事,window ...

  5. 物联网全栈教程--手把手教你开发一个智能浇花器

    下面来说一下课程的安排,本教程可以分为三大章节,30个小章节,在1-10章节,手把手讲解了如何实现一个定时/实时控制的浇花器,可以对浇花器电量进行显示,可以进行定时设置,以及实时控制,低功耗模式等等, ...

  6. Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享

    场景 效果 实现 关键代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  7. 在线颜色拾取器 - 资源篇

    在线颜色拾取器 - 资源篇 点击访问资源: 在线颜色拾取器 截图示下:

  8. html5 url颜色,HTML5input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型.本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧 定义和用法 type ...

  9. Pickr.js响应式颜色拾取器插件

    下载地址 Pickr是简单的响应式颜色拾取器插件,可删节拾色.它没有依赖关系,兼容所有的CSS框架比如Bootstrap.主要特色简单的使用没有依赖关系多种颜色表示颜色比较不透明度控制支持触摸设备轻量 ...

  10. VS编程,WPF中,通过telerik控件创建颜色选择器,颜色拾取器,调色板的一种方法

     这里展示使用telerik控件时,调用颜色调色板,颜色选择器,颜色拾取器的一种方法 1.增加引用 2.前台定义引用 xmlns:telerik="http://schemas.teleri ...

最新文章

  1. hihocoder offer收割编程练习赛11 B 物品价值
  2. 【青少年编程】【Scratch】06 侦测模块
  3. 2021年的第一盆冷水:有人说别太把图神经网络当回事儿
  4. java打印出继承体系的类(包括抽象类)、接口、域字段
  5. android 网络加载图片点击大图后 浏览 可 缩放,Android 网络加载图片点击大图后 浏览 可 缩放...
  6. 移动应用专项测试思路和方法
  7. Common Lisp 操作Mysql
  8. Radare - 逆向工程框架
  9. 变动翻屏展示图片效果
  10. 面相终端的计算机网络的阶段特征,计算机网络习题汇编
  11. 前端基础7:a标签常用方法和元素居中方式,响应式@media
  12. Linux挂载iso文件步骤
  13. 面试—每日一题(7)
  14. ISIS 中 Level1-2路由器向本区域内Level-1邻居下发缺省路由
  15. 拓端tecdat|Python用GARCH、离散随机波动率模型DSV模拟和估计股票收益时间序列与蒙特卡洛可视化
  16. pip 下载安装时使用清华大学镜像(各种国内源配置)
  17. H5手写板电子签名开发
  18. IBM GPFS并行文件系统
  19. c语言setw函数怎么用,C++中setw()的用法?
  20. 机器学习因子:在线性因子模型中捕捉非线性

热门文章

  1. 【转载】C# ListView控件的一些用法
  2. [Silverlight]解决Silverlight无法…
  3. 传奇hero引擎版本服务端转换GEE引教程教学篇
  4. Loadrunner11 下载、安装及破解
  5. winrar 4.20注册码
  6. 怎么用Wireshark抓包QQ的到对方的IP地址
  7. XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
  8. mac mysql客户端工具 知乎_Mac OS X 平台上有哪些好用且免费的MySQL客户端工具?
  9. 三阶魔方还原步骤图_3阶魔方教程 1~7步骤,三阶魔方顶层还原图解
  10. 粒子群优化算法求解函数最值