遇到的问题

比如我现在有以下这个图片:

然后我想做到以下这种效果:

第一种方法

应该是最简单的一种方法,直接提供带描边的图片,在这里例子里就是提供一张篮框绿底的图片以及一张红框黄底的图片。

但是问题来了,如果需要提供多种配色方案怎么办?比如白天模式下是一种配色方案,夜晚模式下是另一种配色方案,或者哪天想把当前配色方案修改掉,这会导致程序里需要存储大量的图片。目前iOS每种图片都需要提供三种分辨率的图片,多一张图片就意味着其实要多三张图片。

还有一个问题就是,泡泡有两种方向,难道我们也需要提供两种图片吗?再结合第一个问题,好像我们需要提供很多图片。

第二种方法

这就是这篇文章所要阐述的方法。该方法就是由程序自动给图片上色。

让我们定义如下这个方法:

- (UIImage *)imageMaskedWithColor:(UIColor *)color {UIImage *bubbleImage = [UIImage imageNamed:@"bubble"];CGRect imageRect = CGRectMake(0.0f, 0.0f, bubbleImage.size.width, bubbleImage.size.height);UIImage *newImage = nil;UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, bubbleImage.scale);{CGContextRef context = UIGraphicsGetCurrentContext();// 根据文档,使用这种方式展示图片会是上下颠倒的// 因此先要将图片向下反转CGContextScaleCTM(context, 1.0f, -1.0f);// 反转之后再把反转后的图片移回到原来位置CGContextTranslateCTM(context, 0.0f, -(imageRect.size.height));CGContextClipToMask(context, imageRect, bubbleImage.CGImage);// 填充所期望的颜色CGContextSetFillColorWithColor(context, color.CGColor);CGContextFillRect(context, imageRect);// 生成新的图片返回newImage = UIGraphicsGetImageFromCurrentImageContext();}UIGraphicsEndImageContext();return newImage;
}

该函数调用方式如下:

self.imageview.image = [self imageMaskedWithColor:[UIColor yellowColor]];

展示效果如下:

那接下来我们再来处理描边的问题。这里我也研究了很久,如果想纯粹用程序自动来做一个通用的非规则图片描边,目前看来好像比较困难(如果大家有比较好的办法,请不吝告知)。

因此我选择了相对简单的办法,就是直接用泡泡的图片把中间扣掉,然后生成一张描边图片,如以下图片:

然后我们直接使用上面的技术,分别为实心的泡泡图片和描边的泡泡图片填充想要的颜色,然后再把两种图片画在一起,这样一张带描边的实心泡泡图片就出来了。

让我们定义如下这个新的方法:

- (UIImage *)imageMaskedWithColor:(UIColor *)color strokeColor:(UIColor *)strokeColor {UIImage *bubbleImage = [UIImage imageNamed:@"bubble"];UIImage *strokeImage = [UIImage imageNamed:@"bubble_stroke"];CGRect imageRect = CGRectMake(0.0f, 0.0f, bubbleImage.size.width, bubbleImage.size.height);UIImage *newImage = nil;UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, bubbleImage.scale);{CGContextRef context = UIGraphicsGetCurrentContext();CGContextScaleCTM(context, 1.0f, -1.0f);CGContextTranslateCTM(context, 0.0f, -(imageRect.size.height));// 设置底色CGContextClipToMask(context, imageRect, bubbleImage.CGImage);CGContextSetFillColorWithColor(context, color.CGColor);CGContextFillRect(context, imageRect);// 设置描边色CGContextClipToMask(context, imageRect, strokeImage.CGImage);CGContextSetFillColorWithColor(context, strokeColor.CGColor);CGContextFillRect(context, imageRect);newImage = UIGraphicsGetImageFromCurrentImageContext();}UIGraphicsEndImageContext();return newImage;
}

该函数调用方式如下:

self.imageview.image = [self strokeImageWithColor:[UIColor yellowColor]strokeColor:[UIColor redColor]];

展示效果如下:

那我们还就剩下最后一个问题了,反向的泡泡怎么办?

我们在定义一个方法,用来使得泡泡图片转向:

- (UIImage *)horizontallyFlippedImageFromImage:(UIImage *)image
{return [UIImage imageWithCGImage:image.CGImagescale:image.scaleorientation:UIImageOrientationUpMirrored];
}

和之前定义的方法结合起来使用:

UIImage *newImage = [self strokeImageWithColor:[UIColor greenColor]strokeColor:[UIColor blueColor]];
self.imageview.image = [self horizontallyFlippedImageFromImage:newImage];

展示效果如下:

总结

到这里这次要介绍的内容都已经介绍完了,这篇博客所介绍方法的最大好处就是可以非常容易适应各种配色方案,同时提供了一种比较实用的描边方式,也解决图片过多导致程序无谓膨胀的问题。

当然也有缺点,比如描边的宽度无法自定义,除非重新截图。另外如果泡泡形状发生改变,也需要重新截图。

其实我这里使用的一些方法基本都来自于JSQMessagesViewController这个第三方库。在我们目前的程序中也使用到了这个库,当然为了适应我们自己的程序,已经被我改的有些面目全非了,哈哈。

转载于:https://www.cnblogs.com/shanpow/p/4115040.html

一种简易的聊天泡泡设置颜色以及添加描边的方式相关推荐

  1. EasyExcel 单元格背景颜色、字体颜色使用2种设置颜色方法(IndexedColors中定义的颜色,自定义RGB颜色)实现

    1 Maven配置 <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifa ...

  2. 056:cesium 七种方法设置颜色

    第056个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置颜色,这里用到了7种方法,查看API,还有很多种方法 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现 ...

  3. 大数据可视化python_大数据分析之Python数据可视化的四种简易方法

    本篇文章探讨了大数据分析之Python数据可视化的四种简易方法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 数据可视化是任何数据科学或机器学习项目的一个重要组成部分 ...

  4. python 财务分析可视化方法_Python数据可视化的四种简易方法

    Python数据可视化的四种简易方法 作者:PHPYuan 时间:2018-11-28 03:40:43 摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视 ...

  5. 避免图像去雾算法中让天空部分出现过增强的一种简易方法

    FROM:http://www.chawenti.com/articles/25193.html 在经典的几种去雾算法中,包括何凯明的暗通道去雾.Tarel的基于中值滤波的去雾以及一些基于其他边缘保留 ...

  6. python做前端可视化_Python数据可视化的四种简易方法

    摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视化是任何数据科学或机器学习项目的一个重要组成部分.人们常常会从探索数据分析(EDA)开始,来深入了解数据, ...

  7. 新浪微博开发-添加子视图控制器设置颜色

    一.添加子视图控制器 二.设置颜色 设置颜色:两种方法 一种较为繁琐,详见视频 第二种: //设置颜色 self.tabBar.tintColor = UIColor.orangeColor() 转载 ...

  8. android 布局颜色设置颜色设置,怎么在Android中利用view设置布局颜色

    怎么在Android中利用view设置布局颜色 发布时间:2020-12-10 16:16:37 来源:亿速云 阅读:154 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中利 ...

  9. Python数据可视化的四种简易方法

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视化是任何数据科学或机器学习项目的 ...

最新文章

  1. 设计模式学习(一) 基本理念
  2. linux 组调度浅析
  3. 中科院院士指出“万物互联”只是开始,“万物控制”是物联网下一个挑战
  4. 参加Google™ Code Jam - 中国编程挑战赛(2)
  5. 3ds Max 2018 在安装后无法启动或出现不稳定
  6. stl min函数_std :: min_element()函数以及C ++ STL中的示例
  7. 漫步最优化三十九——Fletcher-Reeves法
  8. c语言直流电机控制实验报告,直流电机实验报告.docx
  9. 美国纽约法院定于明年3月对BitMEX前高管进行审判
  10. 5绘制收银台程序_进来学知识了:实操之C/C++的绘制
  11. 我的所有邮箱 My all E-mail
  12. JavaScript之全局函数详解
  13. linux 内存优化
  14. linux 禁 ip 分片,Linux iptables 设置允许(禁止)IP范围
  15. 对overflow与zoom”清除浮动”的一些认识
  16. macOS:实现 声音内录 不用其它App
  17. 线性稳压芯片的选取要素
  18. python基础练习题:查找首都【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  19. 「镁客·请讲」第六镜叶雨桐:进一步细化产品应用,做大规模场景的动态识别...
  20. Kafka: Consumer

热门文章

  1. 测试工作——XPath
  2. C# 4.0中对Office编程的预览和对可选参数的体验
  3. java 蓝桥杯算法训练 纪念品分组(题解)
  4. 继承类 基类的赋值_Chapter10:继承与派生(四)
  5. (109)FPGA面试题-Verilog实现4位Johnson Counter
  6. (34)VHDL实现T触发器
  7. (04)Verilog HDL模块仿真激励
  8. oracle存储过程导出查询结果,ORACLE如何实现函数、包、存储过程的导入和导出
  9. RTL8201EL介绍
  10. win7如何安装mysql5.7_Win7下安装MySQL5.7备忘