一张图片,通过混合模式绘制后,能得到不同效果的图片。

这里的示例仅是测试效果;实际上可以通过不同程度的混合模式绘制,来得到符合需求的效果。

效果如下:

ViewController.h

1 #import <UIKit/UIKit.h>
2
3 @interface ViewController : UIViewController
4 @property (strong, nonatomic) UIImageView *imgVBlend;
5 @property (strong, nonatomic) UILabel *lblMsg;
6
7 @end

ViewController.m

  1 #import "ViewController.h"
  2 #import "UIImage+BlendMode.h"
  3
  4 @interface ViewController ()
  5 - (void)layoutUI;
  6 - (void)changeBlendMode;
  7 @end
  8
  9 @implementation ViewController
 10 #define kImgBlend [UIImage imageNamed:@"ImageForBlend"]
 11
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14
 15     [self layoutUI];
 16 }
 17
 18 - (void)didReceiveMemoryWarning {
 19     [super didReceiveMemoryWarning];
 20     // Dispose of any resources that can be recreated.
 21 }
 22
 23 - (void)layoutUI {
 24     //添加图片视图_imgVBlend
 25     CGPoint newPoint = self.view.center;
 26     _imgVBlend = [[UIImageView alloc] initWithImage:kImgBlend];
 27     _imgVBlend.center = newPoint;
 28     //在允许进行用户交互操作前提下,通过为图片视图_imgVBlend添加点击手势识别器,来实现点击事件操作
 29     _imgVBlend.userInteractionEnabled = YES; //设置是否允许进行用户交互操作;默认值为NO
 30     UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self
 31                                                                               action:@selector(changeBlendMode)];
 32     gesture.numberOfTouchesRequired = 1; //设置触摸手指数;默认值为1
 33     gesture.numberOfTapsRequired = 1; //设置点击数;默认值为1,表示单击
 34     [_imgVBlend addGestureRecognizer:gesture];
 35     [self.view addSubview:_imgVBlend];
 36
 37     //添加标签_lblMsg
 38     _lblMsg = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 40, 120)];
 39     newPoint.y += 144;
 40     _lblMsg.center = newPoint;
 41     _lblMsg.numberOfLines = 0;
 42     _lblMsg.text = @"在屏幕中绘图时设置透明度;点击图片切换为混合模式绘制的图片";
 43     _lblMsg.textAlignment = NSTextAlignmentLeft;
 44     _lblMsg.textColor = [UIColor blackColor];
 45     _lblMsg.layer.borderColor = [UIColor grayColor].CGColor;
 46     _lblMsg.layer.borderWidth = 1.0;
 47     [self.view addSubview:_lblMsg];
 48
 49
 50 //    enum CGBlendMode {
 51 //        /* Available in Mac OS X 10.4 & later. */
 52 //        kCGBlendModeNormal,
 53 //        kCGBlendModeMultiply,
 54 //        kCGBlendModeScreen,
 55 //        kCGBlendModeOverlay,
 56 //        kCGBlendModeDarken,
 57 //        kCGBlendModeLighten,
 58 //        kCGBlendModeColorDodge,
 59 //        kCGBlendModeColorBurn,
 60 //        kCGBlendModeSoftLight,
 61 //        kCGBlendModeHardLight,
 62 //        kCGBlendModeDifference,
 63 //        kCGBlendModeExclusion,
 64 //        kCGBlendModeHue,
 65 //        kCGBlendModeSaturation,
 66 //        kCGBlendModeColor,
 67 //        kCGBlendModeLuminosity,
 68 //
 69 //        /* Available in Mac OS X 10.5 & later. R, S, and D are, respectively,
 70 //         premultiplied result, source, and destination colors with alpha; Ra,
 71 //         Sa, and Da are the alpha components of these colors.
 72 //
 73 //         The Porter-Duff "source over" mode is called `kCGBlendModeNormal':
 74 //         R = S + D*(1 - Sa)
 75 //
 76 //         Note that the Porter-Duff "XOR" mode is only titularly related to the
 77 //         classical bitmap XOR operation (which is unsupported by
 78 //         CoreGraphics). */
 79 //
 80 //        kCGBlendModeClear,            /* R = 0 */
 81 //        kCGBlendModeCopy,            /* R = S */
 82 //        kCGBlendModeSourceIn,        /* R = S*Da */
 83 //        kCGBlendModeSourceOut,        /* R = S*(1 - Da) */
 84 //        kCGBlendModeSourceAtop,        /* R = S*Da + D*(1 - Sa) */
 85 //        kCGBlendModeDestinationOver,    /* R = S*(1 - Da) + D */
 86 //        kCGBlendModeDestinationIn,        /* R = D*Sa */
 87 //        kCGBlendModeDestinationOut,        /* R = D*(1 - Sa) */
 88 //        kCGBlendModeDestinationAtop,    /* R = S*(1 - Da) + D*Sa */
 89 //        kCGBlendModeXOR,            /* R = S*(1 - Da) + D*(1 - Sa) */
 90 //        kCGBlendModePlusDarker,        /* R = MAX(0, (1 - D) + (1 - S)) */
 91 //        kCGBlendModePlusLighter        /* R = MIN(1, S + D) */
 92 //    };
 93 //    typedef enum CGBlendMode CGBlendMode; /* Available in Mac OS X 10.4 & later. */
 94 }
 95
 96 - (void)changeBlendMode {
 97     static CGBlendMode blendMode = kCGBlendModeNormal;
 98     NSString *strMsg;
 99     switch (blendMode) {
100         case kCGBlendModeNormal: {
101             strMsg = @"kCGBlendModeNormal: 正常;也是默认的模式。前景图会覆盖背景图";
102             break;
103         }
104         case kCGBlendModeMultiply: {
105             strMsg = @"kCGBlendModeMultiply: 正片叠底;混合了前景和背景的颜色,最终颜色比原先的都暗";
106             break;
107         }
108         case kCGBlendModeScreen: {
109             strMsg = @"kCGBlendModeScreen: 滤色;把前景和背景图的颜色先反过来,然后混合";
110             break;
111         }
112         case kCGBlendModeOverlay: {
113             strMsg = @"kCGBlendModeOverlay: 覆盖;能保留灰度信息,结合kCGBlendModeSaturation能保留透明度信息,在imageWithBlendMode方法中两次执行drawInRect方法实现我们基本需求";
114             break;
115         }
116         case kCGBlendModeDarken: {
117             strMsg = @"kCGBlendModeDarken: 变暗";
118             break;
119         }
120         case kCGBlendModeLighten: {
121             strMsg = @"kCGBlendModeLighten: 变亮";
122             break;
123         }
124         case kCGBlendModeColorDodge: {
125             strMsg = @"kCGBlendModeColorDodge: 颜色变淡";
126             break;
127         }
128         case kCGBlendModeColorBurn: {
129             strMsg = @"kCGBlendModeColorBurn: 颜色加深";
130             break;
131         }
132         case kCGBlendModeSoftLight: {
133             strMsg = @"kCGBlendModeSoftLight: 柔光";
134             break;
135         }
136         case kCGBlendModeHardLight: {
137             strMsg = @"kCGBlendModeHardLight: 强光";
138             break;
139         }
140         case kCGBlendModeDifference: {
141             strMsg = @"kCGBlendModeDifference: 插值";
142             break;
143         }
144         case kCGBlendModeExclusion: {
145             strMsg = @"kCGBlendModeExclusion: 排除";
146             break;
147         }
148         case kCGBlendModeHue: {
149             strMsg = @"kCGBlendModeHue: 色调";
150             break;
151         }
152         case kCGBlendModeSaturation: {
153             strMsg = @"kCGBlendModeSaturation: 饱和度";
154             break;
155         }
156         case kCGBlendModeColor: {
157             strMsg = @"kCGBlendModeColor: 颜色";
158             break;
159         }
160         case kCGBlendModeLuminosity: {
161             strMsg = @"kCGBlendModeLuminosity: 亮度";
162             break;
163         }
164         //Apple额外定义的枚举
165         //R: premultiplied result, 表示混合结果
166         //S: Source, 表示源颜色(Sa对应透明度值: 0.0-1.0)
167         //D: destination colors with alpha, 表示带透明度的目标颜色(Da对应透明度值: 0.0-1.0)
168         case kCGBlendModeClear: {
169             strMsg = @"kCGBlendModeClear: R = 0";
170             break;
171         }
172         case kCGBlendModeCopy: {
173             strMsg = @"kCGBlendModeCopy: R = S";
174             break;
175         }
176         case kCGBlendModeSourceIn: {
177             strMsg = @"kCGBlendModeSourceIn: R = S*Da";
178             break;
179         }
180         case kCGBlendModeSourceOut: {
181             strMsg = @"kCGBlendModeSourceOut: R = S*(1 - Da)";
182             break;
183         }
184         case kCGBlendModeSourceAtop: {
185             strMsg = @"kCGBlendModeSourceAtop: R = S*Da + D*(1 - Sa)";
186             break;
187         }
188         case kCGBlendModeDestinationOver: {
189             strMsg = @"kCGBlendModeDestinationOver: R = S*(1 - Da) + D";
190             break;
191         }
192         case kCGBlendModeDestinationIn: {
193             strMsg = @"kCGBlendModeDestinationIn: R = D*Sa;能保留透明度信息";
194             break;
195         }
196         case kCGBlendModeDestinationOut: {
197             strMsg = @"kCGBlendModeDestinationOut: R = D*(1 - Sa)";
198             break;
199         }
200         case kCGBlendModeDestinationAtop: {
201             strMsg = @"kCGBlendModeDestinationAtop: R = S*(1 - Da) + D*Sa";
202             break;
203         }
204         case kCGBlendModeXOR: {
205             strMsg = @"kCGBlendModeXOR: R = S*(1 - Da) + D*(1 - Sa)";
206             break;
207         }
208         case kCGBlendModePlusDarker: {
209             strMsg = @"kCGBlendModePlusDarker: R = MAX(0, (1 - D) + (1 - S))";
210             break;
211         }
212         case kCGBlendModePlusLighter: {
213             strMsg = @"kCGBlendModePlusLighter: R = MIN(1, S + D)(最后一种混合模式)";
214             break;
215         }
216         default: {
217             break;
218         }
219     }
220     _imgVBlend.image = [kImgBlend imageWithBlendMode:blendMode tintColor:[UIColor orangeColor]]; //使用分类Category来扩展UIImage,添加自定义实例方法imageWithBlendMode
221     _lblMsg.text = strMsg;
222
223     blendMode++;
224     if (blendMode > kCGBlendModePlusLighter) {
225         blendMode = kCGBlendModeNormal;
226     }
227 }
228
229 @end

UIImage+BlendMode.h

1 #import <UIKit/UIKit.h>
2
3 @interface UIImage (BlendMode)
4 - (UIImage *)imageWithBlendMode:(CGBlendMode)blendMode tintColor:(UIColor *)tintColor;
5
6 @end

UIImage+BlendMode.m

 1 #import "UIImage+BlendMode.h"
 2
 3 @implementation UIImage (BlendMode)
 4
 5 - (UIImage *)imageWithBlendMode:(CGBlendMode)blendMode tintColor:(UIColor *)tintColor {
 6     UIImage *img;
 7     UIGraphicsBeginImageContextWithOptions(self.size, NO, 0); //开始图片上下文绘制
 8
 9     [tintColor setFill]; //填充颜色
10     CGRect newRect = CGRectMake(0, 0, self.size.width, self.size.height);
11     UIRectFill(newRect);
12     [self drawInRect:newRect blendMode:blendMode alpha:1.0]; //设置绘画透明混合模式和透明度
13     if (blendMode == kCGBlendModeOverlay) {
14         [self drawInRect:newRect blendMode:kCGBlendModeDestinationIn alpha:1.0]; //能保留透明度信息
15     }
16
17     img = UIGraphicsGetImageFromCurrentImageContext();
18
19     UIGraphicsEndImageContext(); //结束图片上下文绘制
20     return img;
21 }
22
23 @end

转载于:https://www.cnblogs.com/huangjianwu/p/4581509.html

154在屏幕中绘图时设置透明度(扩展知识:为图片视图添加点击手势识别器,来实现点击事件操作)...相关推荐

  1. originlab设置_Origin绘图时设置坐标断点——Break功能的使用方法

    如果Origin软件绘图的数据,比如光谱数据分布在两个相隔较远的区域,而它们之间没有任何有效数据,那么图表中间会有很大一块空白区,这样既浪费空间,也使得数据不集中影响阅读数据和排版的美观.为了使得数据 ...

  2. python改变背景颜色_python中绘图时怎么改背景颜色?

    python中一般使用matplotlib库进行绘图,下面我们就来看一下python中绘图时修改背景颜色的方法: 子图可以对plt.subplot的参数做修改,下面是对子图的背景颜色修改代码:impo ...

  3. python怎么更改背景颜色_python中绘图时怎么改背景颜色?

    python中一般使用matplotlib库进行绘图,下面我们就来看一下python中绘图时修改背景颜色的方法: 子图可以对plt.subplot的参数做修改,下面是对子图的背景颜色修改代码:impo ...

  4. 给Flutter中的Widget设置透明度

    给Flutter中的Widget设置透明度 在项目开发中,需要经常用到透明度:比如在app中弹出一个提示框,这个时候的提示框就需要上下左右离边距有一定的距离,然后背景色舍黑色,需要设置透明度为0.4: ...

  5. Python使用matplotlib.pyplot绘图时设置坐标轴刻度

    问题描述:在使用matplotlib绘图时,可能会需要设置坐标轴上刻度之间的距离,或者为刻度设置标签. 技术要点:pyplot的xticks()和yticks()函数的用法. 参考代码1: 运行结果1 ...

  6. matlab中绘图时横坐标XTickLabel设置latex字体的大小

    第一步:打开属性编译器. 第二步:axes编辑. 第三步:更改比例值.

  7. Python matplotlib库绘图时设置标题 (label)、坐标轴 (axis) 和标注 (legend)的字体及大小

    文章目录 1 标题 2 坐标轴 3 标注 4 示例 5 展示 6 说明 1 标题 plt.xlabel('False positive rate', fontdict={"family&qu ...

  8. 新版谷歌浏览器怎么查找和改变编码格式(新版chrome中工具,设置编码功能取消,新版如何添加插件)

    今天在家开发一个项目,无意中在解决一个乱码问题,后台是有过判断解决兼容性问题,但是有个别电脑还是有乱码问题,就去想改变下前台的编码格式,突然发现一向好用的谷歌,居然找不到编码格式了!原来自己把chro ...

  9. java swing 图片容器_Java Swing中两种设置背景图(容器图片)

    在java swing中需要为容器添加图片,或者背景图片. 提供两种简单的解决方案,一种利用JPanel,另一种利用JLabel 1.JPanel(源代码) package oo; import ja ...

最新文章

  1. 美好生活从java开始
  2. XGBoost 重要参数、方法、函数理解及调参思路(附例子)
  3. Burpsuite如何抓取使用了SSL或TLS传输的 IOS App流量
  4. python db2 linux 安装,python安装DB2模块
  5. java 一切object_javaObject类
  6. Android7.0以后的ninja编译系统
  7. RuntimeException
  8. linux uuid挂载磁盘_Linux磁盘设备磁盘设备的UUID标识代码(sda,sdb,sdc…)变化的解决办法...
  9. RS485芯片与单片机接口中的一个容易忽略的隐患
  10. mysql 创建数据库 utf8 命令_mysql创建数据库 utf8
  11. @开源镜像站(linux系统:Center OS|Ubuntu|Debian)
  12. 工作记录--------unbuntu20搭建微信和Foxmail
  13. 【简●解】[SDOI2008] Sue的小球
  14. 周鸿祎:35告老的大富豪
  15. Android开发 之 OpenGL ES系列(5--3D立体图形)
  16. 结合环境专业计算机思维论文,环境艺术设计思维的表达论文范文
  17. pytorch基本知识—主要轮子简介
  18. 给csdn童鞋们的一封信 (csdn为什么不能粘贴图片写博客?)
  19. thingsboard从搭建环境到安装部署,给安装出错,或者安装失败的小伙伴现场写一遍(修正版)
  20. 二维离散变换由c语言编写,离散余弦变换(DCT)的DSP程序设计与实现

热门文章

  1. teach and learn
  2. 收到了7封拒信的观后感哈哈哈哈哈哈哈哈哈哈
  3. 利物浦大学的office里面没有powerBI
  4. 剑桥毕业之后创业的可能的在商学院的出路
  5. 关于游戏开发中时间性能统计工具本身overhead较高的问题
  6. 关于【C++项目:无法解析的外部符号】
  7. Android获取网速的方法
  8. 融合的胜利——惠普连发SDS、闪存、超融合方案
  9. EA+svn实现UML的版本号控制
  10. win8下面卸载MYSQL数据库