python图像处理模块Pillow的学习详解


Posted in Python onOctober 09, 2019

今天抽空学习了一下之前了解过的pillow库,以前看到的记得这个库可以给图片上加文字加数字,还可以将图片转化成字符画,不过一直没有找时间去学习一下这个模块,由于放假不用训练,所以就瞎搞了一下

0、工欲善其事,必先利其器

关于pillow库的安装有几种方式

0、使用pip安装

$ pip install pillow

1、使用easy_install

$ easy_install pillow

2、通过pycharm安装

1、学习并使用pillow库

#导入模块
from PIL import Image
#读取文件
img = Image.open('test.jpg')
#保存文件
#img.save(filename,format)
img.save(filename,"JPEG")
#获取图片大小
(width,height) = img.size
#获取图片的源格式
img_format = img.format
#获取图片模式,有三种模式:L(灰度图像),RGB(真彩色)和CMYK(pre-press图像)
img_mode = img.mode
#图片模式的转换
img = img.convert("L") #转化成灰度图像
#获取每个坐标的像素点的RGB值
r,g,b = img.getpixel((j,i))
#重设图片大小
img = img.resize(width,height)
#创建缩略图
img.thumbnail(size)

2、实战演练

其实应该很容易想到,如果要达到这种效果,应该能想得到就是获取图上每一点的RGB值,然后根据这三种值确定这一点采用什么字符,其实根据RGB来确定的交灰值,所以可以将图片转化成灰度图片,来直接获取每一点的灰度,或者通过灰度的转换公式来使得RGB三值转化成灰度

#coding:utf-8
from PIL import Image
#要索引的字符列表
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
length = len(ascii_char)
img = Image.open('03.jpg')  #读取图像文件
(width,height) = img.size
img = img.resize((int(width*0.9),int(height*0.5))) #对图像进行一定缩小
print(img.size)
def convert(img):
 img = img.convert("L") # 转为灰度图像
 txt = ""
 for i in range(img.size[1]):
  for j in range(img.size[0]):
   gray = img.getpixel((j, i))  # 获取每个坐标像素点的灰度
   unit = 256.0 / length
   txt += ascii_char[int(gray / unit)] #获取对应坐标的字符值
  txt += '\n'
 return txt

def convert1(img):
 txt = ""
 for i in range(img.size[1]):
  for j in range(img.size[0]):
   r,g,b = img.getpixel((j, i))   #获取每个坐标像素点的rgb值
   gray = int(r * 0.299 + g * 0.587 + b * 0.114) #通过灰度转换公式获取灰度
   unit = (256.0+1)/length
   txt += ascii_char[int(gray / unit)] # 获取对应坐标的字符值
  txt += '\n'
 return txt

txt = convert(img)
f = open("03_convert.txt","w")
f.write(txt)   #存储到文件中
f.close()

给图片加上文字(福利预警,前方有福利!!!!)

#coding:utf-8
from PIL import Image,ImageDraw,ImageFont

#http://font.chinaz.com/zhongwenziti.html 字体下载网站

img = Image.open('PDD01.jpg')
draw = ImageDraw.Draw(img)
myfont = ImageFont.truetype('HYLiuZiHeiJ.ttf',size=80)
fillcolor = 'pink'
(width, height) = img.size
#第一个参数是加入字体的坐标
#第二个参数是文字内容
#第三个参数是字体格式
#第四个参数是字体颜色
draw.text((40,100),u'萌萌哒',font=myfont,fill=fillcolor)
img.save('modfiy_pdd01.jpg','jpeg')

给图片加上数字

这个大家应该见过的,就是有些头像的左上角的那个小红圈加上白色的数字,其实方法和上面那个加文字的差不多 

讲道理,我还不如用ps,移坐标移到要死要死的

#coding:utf-8
from PIL import Image,ImageDraw,ImageFont
img = Image.open("03.jpg")
draw = ImageDraw.Draw(img)
myfont = ImageFont.truetype(u"时光体.ttf",50)
(width,height) = img.size
draw.ellipse((width-40,0,width,40),fill="red",outline="red") #在图上画一个圆
draw.text((width-30,-8),'1',font=myfont,fill='white')
img.save('03_modify.jpg')

生成4位随机验证码

#coding:utf-8
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random
"""
创建四位数的验证码
"""
#产生随机验证码内容
def rndTxt():
 txt = []
 txt.append(random.randint(97,123))  #大写字母
 txt.append(random.randint(65,90))  #小写字母
 txt.append(random.randint(48,57))  #数字
 return chr(txt[random.randint(0,2)])

#随机颜色(背景)
def rndColor1():
 return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

#随机颜色(字体)
def rndColor2():
 return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

#240x60:
width = 60*4
height = 60
img = Image.new('RGB',(width,height),(255,255,255))
font = ImageFont.truetype(u'时光体.ttf',36)
draw = ImageDraw.Draw(img)
#填充每个像素
for x in range(width):
 for y in range(height):
  draw.point((x,y),fill=rndColor1())

#输出文字
for txt in range(4):
 draw.text((60*txt+10,10),rndTxt(),font=font,fill=rndColor2())
#模糊化处理
#img = img.filter(ImageFilter.BLUR)
img.save("code.jpg")

学习于:廖雪峰的官方网站

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
python实现批量监控网站
Sep 09 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
在Python中COM口的调用方法
Jul 03 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python 实现数组相减示例
Dec 27 Python
python实现串口通信的示例代码
Feb 10 Python
Python设计密码强度校验程序
Jul 30 Python
Matplotlib中rcParams使用方法
Jan 05 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 #Python
详解python路径拼接os.path.join()函数的用法
Oct 09 #Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 #Python
Python3实现zip分卷压缩过程解析
Oct 09 #Python
基于Python新建用户并产生随机密码过程解析
Oct 08 #Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 #Python
Python3 无重复字符的最长子串的实现
Oct 08 #Python
You might like
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
jQuery学习基础知识小结
2010/11/25 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python守护线程用法实例
2017/06/23 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
Python之list对应元素求和的方法
2018/06/28 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
餐厅经理岗位职责范本
2014/02/17 职场文书
节电标语大全
2014/06/23 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技