BlendMode参数值及表现形式

blendMode作用

在对图片进行手动处理的时候,可能用到图层混合,如改变图片的颜色。常常获取CGContext,然后设置其blendMode参数。

为了形象理解BlendMode值的变化,我使用了一张主图标和辅图标(支付宝图标)作为测试,测试颜色为红色,注释中有序号的可以对应其变换结果

BlendModel参数值结束

如下(转):

    switch (blendMode) {  case kCGBlendModeNormal: {  strMsg = @"kCGBlendModeNormal: 正常;也是默认的模式。前景图会覆盖背景图";  break;  }  case kCGBlendModeMultiply: {  strMsg = @"kCGBlendModeMultiply: 正片叠底;混合了前景和背景的颜色,最终颜色比原先的都暗";  break;  }  case kCGBlendModeScreen: {  strMsg = @"kCGBlendModeScreen: 滤色;把前景和背景图的颜色先反过来,然后混合";  break;  }  case kCGBlendModeOverlay: {  strMsg = @"kCGBlendModeOverlay: 覆盖;能保留灰度信息,结合kCGBlendModeSaturation能保留透明度信息,在imageWithBlendMode方法中两次执行drawInRect方法实现我们基本需求";  break;  }  case kCGBlendModeDarken: {  strMsg = @"kCGBlendModeDarken: 变暗";   //将线条色变为黑色,背景色设置为目的色break;  }  case kCGBlendModeLighten: {  strMsg = @"kCGBlendModeLighten: 变亮";  break;  }  case kCGBlendModeColorDodge: {  strMsg = @"kCGBlendModeColorDodge: 颜色变淡";  break;  }  case kCGBlendModeColorBurn: {  strMsg = @"kCGBlendModeColorBurn: 颜色加深";  //线条颜色(原本)加深,背景色设置为目的色break;  }  case kCGBlendModeSoftLight: {  strMsg = @"kCGBlendModeSoftLight: 柔光";  break;  }  case kCGBlendModeHardLight: {  strMsg = @"kCGBlendModeHardLight: 强光";  //全为目的色break;  }  case kCGBlendModeDifference: {  strMsg = @"kCGBlendModeDifference: 插值";  break;  }  case kCGBlendModeExclusion: {  strMsg = @"kCGBlendModeExclusion: 排除";  break;  }  case kCGBlendModeHue: {  strMsg = @"kCGBlendModeHue: 色调";  break;  }  case kCGBlendModeSaturation: {  strMsg = @"kCGBlendModeSaturation: 饱和度";  break;  }  case kCGBlendModeColor: {  strMsg = @"kCGBlendModeColor: 颜色";   //感觉将图片线条色设置为白色,背景色设置为目的色,之后再再图片上加一个有透明度的目的色break;  }  case kCGBlendModeLuminosity: {  strMsg = @"kCGBlendModeLuminosity: 亮度";  break;  }  //Apple额外定义的枚举  //R: premultiplied result, 表示混合结果  //S: Source, 表示源颜色(Sa对应透明度值: 0.0-1.0)  //D: destination colors with alpha, 表示带透明度的目标颜色(Da对应透明度值: 0.0-1.0)  case kCGBlendModeClear: {  strMsg = @"kCGBlendModeClear: R = 0"; //1.清空(如果图标背景色为白色则为全白) break;  }  case kCGBlendModeCopy: {  strMsg = @"kCGBlendModeCopy: R = S";  //2全色覆盖整个图片break;  }  case kCGBlendModeSourceIn: {  strMsg = @"kCGBlendModeSourceIn: R = S*Da";  //3.线条变色break;  }  case kCGBlendModeSourceOut: {  strMsg = @"kCGBlendModeSourceOut: R = S*(1 - Da)";  //4.背景变为目的色,线条自动变为白色(比如图标线条原为蓝色,会自动变为白色)break;  }  case kCGBlendModeSourceAtop: {  strMsg = @"kCGBlendModeSourceAtop: R = S*Da + D*(1 - Sa)";   //5.线条变色,目前感觉和SourceIn效果一致break;  }  case kCGBlendModeDestinationOver: {  strMsg = @"kCGBlendModeDestinationOver: R = S*(1 - Da) + D";  //6.背景色变为目的色,线条色不变break;  }  case kCGBlendModeDestinationIn: {  strMsg = @"kCGBlendModeDestinationIn: R = D*Sa;能保留透明度信息";  //7.只看到线条色(本色),无其他颜色break;  }  
        case kCGBlendModeDestinationOut: {  strMsg = @"kCGBlendModeDestinationOut: R = D*(1 - Sa)";     //8.空白什么都没哟break;  }  case kCGBlendModeDestinationAtop: {  strMsg = @"kCGBlendModeDestinationAtop: R = S*(1 - Da) + D*Sa";  //9.会把整个矩形的背景填充目的色(如图9系列)原色保留break;  }  case kCGBlendModeXOR: {  strMsg = @"kCGBlendModeXOR: R = S*(1 - Da) + D*(1 - Sa)";  //10.线条变白,背景色变为目的色break;  }  case kCGBlendModePlusDarker: {  strMsg = @"kCGBlendModePlusDarker: R = MAX(0, (1 - D) + (1 - S))";  //11.线条变为黑色, 背景色变为目的色break;  }  case kCGBlendModePlusLighter: {  strMsg = @"kCGBlendModePlusLighter: R = MIN(1, S + D)(最后一种混合模式)";  //12.线条变为白色(混合色:如color为红色,就是偏粉色的白,有一定透明度的感觉)break;  }  default: {  break;  }  

以上中文解释(含//)是在如下代码段情况下发生的,不同代码段可能表示形式不一。

测试图标依赖下面代码,实际使用要考虑实际效果

改变图标代码参考:

func changeColor(_ color:UIColor, blendMode:CGBlendMode) -> UIImage {//方式一(可以)UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale)let context = UIGraphicsGetCurrentContext()color.setFill()//移动图片context!.translateBy(x: 0, y: self.size.height)context!.scaleBy(x: 1.0, y: -1.0)let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)context!.draw(self.cgImage!, in: rect)//模式配置context!.setBlendMode(blendMode)context!.addRect(rect)context!.drawPath(using: CGPathDrawingMode.fill)//创建获取图片let coloredImage = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()return coloredImage!}

颜色变换参考

原型图标:这里传颜色是传入的是red红色

 

3/5。

7.

9.

10

11

12(支付宝的图标有圆角处理)所以边角也有点色

这个是blendMode.Color的变换效果

BlendMode颜色混合模式枚举值相关推荐

  1. 扩展方法 枚举值_扩展枚举功能的两种方法

    扩展方法 枚举值 前言 在上一篇文章中,我解释了如何以及为什么在Java代码中使用enums而不是switch/case控制结构. 在这里,我将展示如何扩展现有enums功能. 介绍 Java enu ...

  2. CSS颜色混合模式特效

    查看原文:http://www.ibloger.net/article/394.html 注意:只有使用最新版的谷歌浏览器.火狐浏览器,才能正确的显示本文中的演示. Photoshop里最没有用处的一 ...

  3. DxfCode各枚举值意义

    转自:http://www.cnblogs.com/jdmei520/articles/1326117.html 下表给出了组码(或组码范围)及其说明.在表中,"固定"表示该组码的 ...

  4. Java –比较枚举值

    在Java中,可以使用==运算符比较Enum值. 1. Java枚举示例 Language.java package com.mkyong.javapublic enum Language {JAVA ...

  5. 获取枚举值上的Description特性说明

    /// <summary> /// 获取枚举值上的Description特性说明 /// </summary> /// <typeparam name="T&q ...

  6. 输入今天是星期几的序号,给今天和昨天赋予枚举值,并输出昨天是星期几的枚举值

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p165 习题6 4.输入今天是星期几的序号(0~6代表星期天至星期六),给今天和昨天赋予枚举值,并输出 ...

  7. 如何从Java中的字符串值获取枚举值?

    说我有一个枚举 public enum Blah {A, B, C, D } 我想找到一个字符串的枚举值,例如"A"就是Blah.A 怎么可能做到这一点? Enum.valueOf ...

  8. mysql 改变枚举值_mysql 改变数据类型为枚举不成功?

    很明显的错误啊,你表里面内容有误,可以先将列gender的内容全部update成female和male,然后再运行这条sql脚本. 以下内容来源:MYSQL中 ENUM 类型 ENUM类型 ENUM ...

  9. OpenCV中函数imread的参数flags的枚举值(可设置值)及其具体意义

    imread函数的原型如下: C++: Mat cv::imread(const String & filename,int flags = IMREAD_COLOR) Python: ret ...

最新文章

  1. Django3.0 +Python3 连接mysql遇到django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer
  2. 最长上升子序列(LIS)长度及其数量
  3. DSP平台实现图像识别算法总体来说不如嵌入式?
  4. windowsAPI验证上下级证书关系
  5. SAP Spartacus 关于列表点击focus Accessibility的需求
  6. 如何对AWS RDS SQL Server数据库进行分类
  7. angularJs为什么在近几年风头一时无二?
  8. flutter去掉输入框最大字数显示
  9. 空调开关html,酒店墙上空调开关图解—酒店墙上空调开关图案是什么意思
  10. linux异步io缺陷,具有libaio性能问题的Linux异步IO
  11. cocos2dx报错OpenGL error 0x0501
  12. 【SQL注入技巧拓展】————14、Bypass 360主机卫士SQL注入防御(附tamper脚本)
  13. 站在巨人的肩膀上(转载)
  14. 申万一级行业指数是什么?
  15. Hog源码注释(hog.cpp的注解)
  16. H6062FNL 普思Pulse 网络变压器
  17. 【考研经验】双非二战山东大学计算机技术初试第二经验贴
  18. 10个维修中最常见的蓝屏代码,值得收藏!
  19. 一次jdk1.7升级jdk1.8后导致redis运行时blocked_clients过多问题解决
  20. 为什么myeclipse9.0解析类时会多一个类名呢!解决方案

热门文章

  1. [转载]树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像...
  2. 使用TaskManager爬取2万条代理IP实现自动投票功能
  3. css如何自动换行对于div,p等块级元素(转)
  4. Struts2教程2:处理一个form多个submit
  5. linux清空文件内容
  6. git 常用操作总结
  7. Android性能调优篇之探索垃圾回收机制
  8. ViewPager Indicator的使用方法
  9. 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
  10. 04、数据绑定控件 ListBox 的一个 Bug