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修改list中所有元素类型的三种方法
Apr 09 Python
pandas值替换方法
Jul 10 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 Python
浅谈怎么给Python添加类型标注
Jun 08 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
实用函数10
2007/11/08 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
jQuery 动画基础教程
2008/12/25 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Python 导入文件过程图解
2019/10/15 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
《故都的秋》教学反思
2014/04/15 职场文书
食堂标语大全
2014/06/11 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
vue使用element-ui按需引入
2022/05/20 Vue.js