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运行的17个时新手常见错误小结
Aug 07 Python
实例Python处理XML文件的方法
Aug 31 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
pandas 如何分割字符的实现方法
Jul 29 Python
django fernet fields字段加密实践详解
Aug 12 Python
python支付宝支付示例详解
Aug 22 Python
python实现名片管理器的示例代码
Dec 17 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
python TCP包注入方式
May 05 Python
Python爬虫之Selenium实现键盘事件
Dec 04 Python
教你怎么用python实现字符串转日期
May 24 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实现多条件查询实例代码
2010/07/17 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
详解django.contirb.auth-认证
2018/07/16 Python
Python 函数返回值的示例代码
2019/03/11 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
《童趣》教学反思
2014/02/19 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
党的群众路线调研报告
2014/11/03 职场文书
超市员工辞职信范文
2015/05/12 职场文书
新学期家长寄语2016
2015/12/03 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL
Python面试不修改数组找出重复的数字
2022/05/20 Python