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调用shell的方法
Nov 20 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
Python Flask-web表单使用详解
Nov 18 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
详解如何用django实现redirect的几种方法总结
Nov 22 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
python3下pygame如何实现显示中文
Jan 11 Python
iPython pylab模式启动方式
Apr 24 Python
python 带时区的日期格式化操作
Oct 23 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
python 合并多个excel中同名的sheet
Jan 22 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
PHP实现的简单日历类
2014/11/29 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
javascript call和apply方法
2008/11/24 Javascript
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
pygame实现俄罗斯方块游戏
2018/06/26 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
python__name__原理及用法详解
2019/11/02 Python
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
单位刻章介绍信范文
2014/01/11 职场文书
会计专业导师推荐信
2014/03/08 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
护校行动方案
2014/05/31 职场文书
电子工程求职信
2014/07/17 职场文书
离婚财产分配协议书
2014/10/21 职场文书
工程安全生产协议书
2014/11/21 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
超市主管竞聘书
2015/09/15 职场文书
Python3 类型标注支持操作
2021/06/02 Python