接上篇,我们来完善另一重要部分,白底气泡图的生成。效果演示:

过程复盘:根据复用原则,我们希望做成通用的代码,这就需要对前面的代码进行简单的改造。改造1:把所有气泡生成位置的参照物,改为leftStart。根据对称原理:白底气泡图的起始位置就应该是1080-919,因为绿底的离右边缘是这么远。if who=="Me":leftStart=919-cenLen-2*welse:leftStart=1080-919完成以上这步,所有原代码中涉及919来参照边界的,统统改为leftStart加距离来实现,以实现代码的通用性。毕竟除了三角,定好左边界和上边界,这个气泡就可以完整的画出来。例如:top=Image.open(picDir "上填充.png")#上中top=top.resize((cenLen,h))bg.paste(top,(leftStart w,tp,leftStart w cenLen,tp h))

leftStart w cenLen是气泡上面中间的填充部分,我们弃用919-w。

改造2:气泡背景的三角部分,做一个分支判断,分别加载。arr=Image.open(picDir "箭头.png").convert("RGBA")r,g,b,a =arr.split()if who=="Me":bg.paste(arr,(919,tp h,919 13,tp h 26),mask=a)bg.save("bgEnd.png")else:arrL=arr.transpose(Image.FLIP_LEFT_RIGHT)r,g,b,a =arrL.split()bg.paste(arrL,(leftStart-13,tp h,leftStart,tp h 26),mask=a)

改造3:绿图素材PS一份完全一样的白图素材,按需调用。如图,src目录下的M放绿图素材,U目录放白图素材。

改造4:将头像生成代码,精简成函数,头像与模板图放入tx目录。改造的核心就是,按需加载合适的头像,按传入高度写入背景。

from PIL import Image

def makeHead(srcImg):

tx = Image.open(srcImg).resize((103,103)).convert("RGBA")

mb = Image.open(src/tx/mb.png)

mb.paste(tx, mask=mb)

return mb

def drawHead(bgImg,startTop,who):

bg=Image.open(bgImg)

if who=="Me":

startLeft=946

srcImg="src/tx/M.jpg"

else:

startLeft=26

srcImg="src/tx/U.jpg"

rd=makeHead(srcImg).convert("RGBA")

r,g,b,a = rd.split()

bg.paste(rd,(startLeft,startTop,startLeft 103,startTop 103),mask=a)

bg.save("bgEnd.png")你会发现,在位置方面,我们也是考虑了两个头像左右对称。改造5:适当的调整字间距、文字对应图片宽度等参数,使比例合适。间距改为4,文字背景图宽改为40,文字上偏移改为8。最终的txtDialog.py是这样的:from PIL import Image,ImageDraw,ImageFont

from wxtx import drawHead

def drawText(txtPic,words,x,y):

img=Image.open(txtPic)

draw=ImageDraw.Draw(img)

fontType = /System/Library/Fonts/msyh.ttc#调用系统微软雅黑字体

font = ImageFont.truetype(fontType,40)#创建字体对象

i=0

for w in words:

if i<16:

draw.text((x 40*i i*4,y-8),w, (0,0,0,255), font)

else:

draw.text((x 40*(i%16) (i%16*4),y i//16*40 22*(i//16)-8),w, (0,0,0,255), font)

i =1

img.save("bgEnd.png")

def createBubble(bdPic,str,tp,who):

picDir="src/M/"

if who=="U":

picDir="src/U/"

n=len(str)

if n<16:

cenLen=n*40 (n-1)*4

else:

cenLen=16*40 (16-1)*4

lines=n//16 1#最多16个字一行

bdr=919

img=Image.open(picDir "拐角.png").convert("RGBA")

w,h=img.size

bg=Image.open(bdPic)

r,g,b,a =img.split()

if who=="Me":

leftStart=919-cenLen-2*w

else:

leftStart=1080-919

bg.paste(img,(leftStart,tp,leftStart w,tp h),mask=a)#左上

top=Image.open(picDir "上填充.png")#上中

top=top.resize((cenLen,h))

bg.paste(top,(leftStart w,tp,leftStart w cenLen,tp h))

rt = img.transpose(Image.FLIP_LEFT_RIGHT)#右上

r,g,b,a =rt.split()

bg.paste(rt,(leftStart w cenLen,tp,leftStart w cenLen w,tp h),mask=a)

lr=Image.open(picDir "左右填充.png")#中间部分

lr=lr.resize((cenLen 2*w,42*lines (lines-1)*22))

bg.paste(lr,(leftStart,tp h,leftStart w cenLen w,tp h 42*lines (lines-1)*22))

rt = img.transpose(Image.FLIP_TOP_BOTTOM)#左下

r,g,b,a =rt.split()

bg.paste(rt,(leftStart,tp h 40*lines (lines-1)*22,leftStart w,tp h 40*lines (lines-1)*22 h),mask=a)

bg.paste(top,(leftStart w,tp h 40*lines (lines-1)*22,leftStart w cenLen,tp h 40*lines (lines-1)*22 h))#下中

rt = img.transpose(Image.FLIP_LEFT_RIGHT)#右下

rt=rt.transpose(Image.FLIP_TOP_BOTTOM)

r,g,b,a =rt.split()

bg.paste(rt,(leftStart w cenLen,tp h 40*lines (lines-1)*22,leftStart w cenLen w,tp h 40*lines (lines-1)*22 h),mask=a)

arr=Image.open(picDir "箭头.png").convert("RGBA")

r,g,b,a =arr.split()

if who=="Me":

bg.paste(arr,(919,tp h,919 13,tp h 26),mask=a)

bg.save("bgEnd.png")

else:

arrL=arr.transpose(Image.FLIP_LEFT_RIGHT)

r,g,b,a =arrL.split()

bg.paste(arrL,(leftStart-13,tp h,leftStart,tp h 26),mask=a)

bg.save("bgEnd.png")

return (leftStart,tp h 42*lines (lines-1)*22 h)

def Chat(ImgPath,text,startHeiht,who):

ls=createBubble(ImgPath,text,startHeiht,who)

drawHead("bgEnd.png",startHeiht,who)

drawText("bgEnd.png",text,ls[0] 24,startHeiht 32)

return ls[1]

【注意】

return (leftStart,tp h 42*lines (lines-1)*22 h)函数的返回值是个元组,主要我要用到俩值,第一个是气泡画好了,左边距在哪,方便写字的时候确定起点;第二个是气泡画好了,下部边缘到哪了。这样下一个人的回话位置就可以确定了。

这样,就可以开始文字“聊天”了。from txtDialog import Chat

ch=Chat("bgSrc.png","马总,在吗,我是小潘",342,"Me")

ch=Chat("bgEnd.png","有点小事麻烦一下你",ch 32,"Me")

ch=Chat("bgEnd.png","有事说一声就行",ch 32,"U")

ch=Chat("bgEnd.png","都是老朋友了,能办的我一定办",ch 32,"U")

ch=Chat("bgEnd.png","我最近缺钱花了,能不能刷点花呗借呗,你给我设置个免还?",ch 32,"Me")

ch=Chat("bgEnd.png","就这事?",ch 32,"U")

ch=Chat("bgEnd.png","已经搞定,下次留言说一下就好,都是小事!",ch 32,"U")

ch=Chat("bgEnd.png","好的,谢谢",ch 32,"Me")

ch=Chat("bgEnd.png","下次直接留言!",ch 32,"Me")

准备初始图片(人名暂时是PS上的):

运行代码后:

至此,我们的目标已经基本实现了。整理一下本部分的知识点:用好函数的返回值,如果要返回多个值,可以用元组拼成一个。

左右两侧的聊天虽不同,找到共性leftStart,可以写成通用代码。

利用参数进行分支判断,做不同的处理过程。如气泡背景加载处理。

做好代码文件和图片资源的合理划分,规划好存放目录。

下期预告《收尾工作:添加更多可变参数,优化功能》

如果你觉得有用,可以点个在看↓

python if实现对话_Python生成微信对话生成器(四)相关推荐

  1. 【实测有效】一键生成微信对话视频,微信聊天记录生成器,

    微信对话视频生成器是一款非常实用的工具,它可以将平常的微信聊天记录转化为精彩纷呈的对话视频,让你的聊天更有趣.更生动!现在,无需任何专业技能,只需几步操作,你就可以快速生成属于自己的微信对话视频. 使 ...

  2. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)

    引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟 ...

  3. python朋友圈教程_Python 生成你的朋友圈九宫格图片

    关于微信之前写过以下文章,有兴趣可以点击查看: 如何导出你的微信语音 c 盘空间又满了?微信清理神器帮你释放空间 微信撤回的消息也能看到! 如何备份可能被删的公众号文章和网页 如何在电脑上登陆多个微信 ...

  4. python分配红包程序_Python版微信红包分配算法

    Python版微信红包分配算法 发布于 2015-05-08 10:54:23 | 151 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计算机 ...

  5. python设定数值范围_Python 生成周期性波动的数据 可指定数值范围

    代码 import numpy as np import math import matplotlib.pyplot as plt #python在指定的时间段生成周期性波动的数据: #周期性 lon ...

  6. c语言 余额 自动生成,微信余额生成器

    安卓微信余额生成器是一款一键生成微信余额的软件,能自由修改微信余额显示,当然只能生成截图,可以发到朋友圈用.恶搞朋友什么的棒棒哒,一键截图发送给好友,微信余额生成器2018可以让变的更加简单,感兴趣的 ...

  7. python 打卡程序_python获取微信企业号打卡数据并生成windows计划任务

    由于公司的系统用的是Java版本,开通了企业号打卡之后又没有预算让供应商做数据对接,所以只能自己捣鼓这个,以下是个人设置的一些内容,仅供大家参考 安装python python的安装,这里就不详细写了 ...

  8. 【剪辑必备】情感对话号必备-微信对话生成脚本,一键生成视频【安卓永久版脚本】

    微信模拟聊天软件,可以自行更改网名,改头像,聊天内容随意修改,下载即可使用!没有试用教程,用法非常简单 设备需求:安卓系统 教程+工具请到CSDN下载https://download.csdn.net ...

  9. python朋友圈头像_Python读取微信好友头像,拼成祝福语九宫格

    今天有位老哥过生日,结合着微信头像和点阵字,搞了个头像拼字的代码,朋友圈九宫格效果如下: 其中,每个字都是16*16的点阵,点阵中每个点可以拆解为4个好友头像图片: 代码中汉字文本可以自定义输入,头像 ...

  10. python编写性别比例_Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】...

    本文实例讲述了Python分析微信好友性别比例和省份城市分布比例的方法.分享给大家供大家参考,具体如下: 安装itchat pip install itchat 使用 新建wxfx.py,拷贝以下代码 ...

最新文章

  1. mysql存储过程结构体_八、mysql视图、存储过程、函数以及时间调度器
  2. Java中六大时间类的使用和区别
  3. 性能之巅:Linux网络性能分析工具-netstat,ifconfig,nicstat,traceroute,tcpdump
  4. 计算机四级考试题数据库,计算机四级考试《数据库系统工程师》试题及答案
  5. Mysql 中Sql控制流语句_DCL语句/控制流语句
  6. 新浪uc2010免费下载
  7. Djaongo 中间件
  8. python下绘制折线图
  9. python中常见的运行时错误_新手常见Python运行时错误汇总
  10. (十一)C语言中内存堆和栈的区别
  11. Pytorch Tensor.unfold()的简单理解与用法
  12. 阀体端面钻6孔组合机床设计及夹具设计
  13. 光流在视频检测和分割的再应用
  14. 《软件工程之美》打卡第六周
  15. Linux虚拟机挂载新的硬盘
  16. win7开不了机按f8修复计算机没反应,win7开不了机按f8没用怎么办
  17. 使用itextpdf实现横板PDF文件与竖版PDF文件的相互转换
  18. 电子烟市场Juul来袭,锐刻福禄们该如何做防?
  19. 微星B550M MORTAR WIFI 的蓝牙模块消失的解决办法
  20. 好文转载—程序员的禅修之路

热门文章

  1. 作为一名基层管理者如何利用情商管理自己和团队(二)
  2. python实现最小二乘拟合函数(选择三种不同基函数,基函数可改变)
  3. Acunetix 网站漏洞扫描软件 检测您网站的安全性。
  4. BIOS和EFI启动过程
  5. linux硬盘的两个分区合并_linux新加硬盘合并
  6. 多网卡多网关设置错误:RTNETLINK answers: File exists
  7. [AHK]给PPT插入图片
  8. bufferedimage 保存图片_如何提取图片中的文字
  9. 一网打尽!炫酷枪火打击视频+图文+源码!哔哔哔......
  10. 上传本地网页到github网址完整详细步骤