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 del()函数用法
Mar 24 Python
python生成随机验证码(中文验证码)示例
Apr 03 Python
python计算一个序列的平均值的方法
Jul 11 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
python实现逻辑回归的方法示例
May 02 Python
scrapy爬虫实例分享
Dec 28 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
python Plotly绘图工具的简单使用
Mar 03 Python
Opencv求取连通区域重心实例
Jun 04 Python
python反扒机制的5种解决方法
Feb 06 Python
python用字节处理文件实例讲解
Apr 13 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 sprintf()函数让你的sql操作更安全
2008/07/23 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
Date对象格式化函数代码
2010/07/17 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
微信小程序 简易计算器实现代码实例
2019/09/02 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
python定义类的简单用法
2020/07/24 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
抽象类和接口的区别
2012/09/19 面试题
机械工程师求职自我评价
2013/09/23 职场文书
法人身份证明书
2014/10/08 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
2014年老干部工作总结
2014/11/21 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL
Python+tkinter实现高清图片保存
2022/03/13 Python