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 切片和range()用法说明
Mar 24 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python输出各行命令详解
Feb 01 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
Python GUI编程完整示例
Apr 04 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
3种python调用其他脚本的方法
Jan 06 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
python 实现aes256加密
Nov 27 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&amp;mysql 日期操作小记
2012/02/27 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
基于node实现websocket协议
2016/04/25 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
python Flask实现restful api service
2017/12/04 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Flask之请求钩子的实现
2018/12/23 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
Python流程控制语句的深入讲解
2020/06/15 Python
详解python tcp编程
2020/08/24 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
Python文件操作的面试题
2013/06/22 面试题
应届生简历中的自我评价
2014/01/13 职场文书
会议开场欢迎词
2014/01/15 职场文书
财务主管自我鉴定
2014/01/17 职场文书
工作表现评语
2014/01/19 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
python - asyncio异步编程
2021/04/06 Python
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android