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统计字符串中指定字符出现次数的方法
Apr 04 Python
python如何在循环引用中管理内存
Mar 20 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
Python 移动光标位置的方法
Jan 20 Python
解决python线程卡死的问题
Feb 18 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
Python List列表对象内置方法实例详解
Oct 22 Python
python读取与处理netcdf数据方式
Feb 14 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
python代数式括号有效性检验示例代码
Oct 04 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 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
菜鸟修复电子管记
2021/03/02 无线电
用缓存实现静态页面的测试
2006/12/06 PHP
php文件下载处理方法分析
2015/04/22 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
python多线程操作实例
2014/11/21 Python
python批量生成本地ip地址的方法
2015/03/23 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
python版本的读写锁操作方法
2016/04/25 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
如何基于Python实现自动扫雷
2020/01/06 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
2014年五四青年节活动方案
2014/03/29 职场文书
党支部活动策划方案
2014/08/18 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
护理自荐信
2019/05/14 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript