PIL/Pillow 是 Python强大的图像处理库,功能包括:基本图像操作(创建缩略图、几何变换、图像裁剪、图像分离与合并、粘贴图片)图像存储、图像显示、格式转换、截屏操作、图像绘制功能、图像滤镜功能以及其他常用方法等!

介绍PIL、Pillow

PIL(Python Imaging Library)是Python图像处理库,PIL模块于2009年9月发布,最新版本是1.1.7,仅支持Python1.5.2 - 2.7

目前PIL项目已经停止开发,最后一次更新是在2011年

强调一下:PIL不支持Python3.x

而Pillow也是Python的图像处理库,与PIL区别:Pillow是PIL特定版本Fork代码,Pillow兼容PIL绝大多数用法,开发活跃,更主要是Pillow库支持Python3.x,所以推荐使用Pillow

现在说的PIL,一般都指Pillow,包括文章下面说的PIL,都是Pillow模块

本节使用演示图片:

PIL操作图片

  • 图片大小:1680x1050
  • 图片格式:JPEG
  • 图片颜色模式:RGB

Image类

Image是PIL最重要的类,PIL大部分功能都是从Image类实例开始的

Image实例有5个属性:

  • format : 返回图像格式(PNG,JPG,…),如果图像不是从文件读取的,则值None
  • mode : 返回图像的模式,常用模式有:
  • L (luminance) 灰度图像,8位像素,表示黑和白
  • RGB 3x8位像素,为真彩色图像
  • RGBA 4x8位像素,有透明通道的真彩色
  • CMYK 4x8位像素,颜色分离,出版图像
  • P 8位像素,使用调色板映射到其他模式
  • 1 1位像素,表示黑和白,但是存储的时候每个像素存储为8bit
  • YCbCr:3x8位像素,彩色视频格式
  • I 32位整型像素
  • F 32位浮点型像素
  • PIL支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)
  • size : 是一个二元tuple,包含width和height(宽度和高度,单位是px)
  • palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例
  • info : info信息,返回/设置图像一些额外信息,一个字典结构对象

示例代码

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': # 打开图片 im = Image.open('xiana.jpg') # 得到图片大小 print(im.size) # 图片格式 print(im.format) # 图片色彩模式 print(im.mode) # 返回 ImagePalette 实例 print(im.palette) # 实例信息(dict) print(im.info) # 打开,并查看图片 im.show()

说一下最后一个方法show() 查看图片,原理是将图片暂存为一个临时文件,然后调用操作系统默认图片浏览软件打开图片文件

Pillow库不会直接解码或者加载全部图像数据当用Image.open打开一个图片文件,只会读取文件头信息来确定格式、颜色模式、大小等,文件其他数据不会处理,这种方式保证了图片操作性能可以说Image.open是一个懒操作(只读文件头信息,直到图像操作才会读取整个图像数据),因此调用load()方法可以强行加载图像数据额外说一下“通道”概念每张图片都是由一个或多个数据通道构成,例如RGB图像是由三个数据通道构成,分别为R、G和B通道获得图片通道数及通道名称:Image.getbands()

图像操作

创建缩略图

Image.thumbnail()方法可以制作缩略图,接受一个二元数组作为缩略图的尺寸,然后将实例图片缩小到指定尺寸

生成JPG缩略图,示例如下:

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': # 打开图片 im = Image.open('xiana.jpg') print(im.size) x, y = im.size # 缩略图大小 im.thumbnail((x//2, y//2)) print(im.size) # 打开,查看图片 im.show()

裁剪图片

Image.crop() 能从图像中提取一个子矩形选区

Pillow库以图像左上角为坐标原点 (0,0),矩形选区区域由一个元组决定,元组信息包括 (左,上,右,下) 的坐标

裁剪图片示例:

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': # 打开图片 im = Image.open('test.png') # (左,上,右,下) selected = (610,140,1100,820)  # 得到400x680px图片 region = im.crop(selected) region.show()

裁剪得到图片:

PIL裁剪图片

几何变换

  • Image.resize() 设置图像大小
  • Image.rotate() 旋转图像,按照给定角度顺时钟沿图像中心旋转图像
  • Image.transpose(method) 翻转、旋转图像,method取值:
  • FLIP_LEFT_RIGHT 左右颠倒
  • FLIP_TOP_BOTTOM 上下颠倒
  • ROTATE_90 旋转90°
  • ROTATE_180 旋转180°
  • ROTATE_270 旋转270°

示例代码:

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': im = Image.open('cj_xiana.jpg') out = im.resize((2180, 1300)) # 顺时针选择45度 out = im.rotate(45) # 旋转图像 # 左右颠倒 out = im.transpose(Image.FLIP_LEFT_RIGHT) # 上下颠倒 out = im.transpose(Image.FLIP_TOP_BOTTOM) out.show() # 旋转90° out = im.transpose(Image.ROTATE_90) # 旋转180° out = im.transpose(Image.ROTATE_180) # 旋转270° out = im.transpose(Image.ROTATE_270)

图像格式转换

PIL支持不同图像格式转换,使用 Image.open() 从磁盘中读取图片文件,它会根据图像信息自动确定图像格式

可使用save(filename, format) 将图片指定格式保存本地,若不指定图像格式,save()会根据文件扩展名指定图像格式

将图片转换为png格式示例

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': # 打开图片 im = Image.open('xiana.jpg') # 保存指定格式 im.save("xiana.png") # 打开,并查看图片 Image.open('xiana.png').show()

图像模式转换

使用convert()方法,进行图像模式转换

这个库支持 “L” 模式和 “RGB” 模式的互相转换. 要想转换到其它的模式, 可能需要使用一个中介模式, 比如 “RGB”.

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': im = Image.open('xiana.jpg') print(im.mode) # 彩色变黑白 im = im.convert("L") im.show()

将“RGB”模式的xiana.jpg图像转换为“L”模式的图像,图像效果:

PIL模式转换

粘贴图片

Image.paste(image, box) 将一个Image实例粘贴到另一个Image实例上

  • box 一个元组 定义了左,上,右和下像素坐标,如果给定box值,被粘贴的图像的尺寸必须与区域尺寸一致
  • 如果图像模式不匹配,被粘贴的图像将被转换为当前图像模式
# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': im = Image.open('cj_xiana.jpg') w, h = im.size right_im = im.crop((w//2,0,w, h)) left_im = im.crop((0,0,w//2, h)) im.paste(left_im, (w//2,0,w, h)) im.paste(right_im, (0,0,w//2, h)) im.show()

把一个图片一份两半,右半部分粘贴到左边,左半部分粘贴到右边,最后效果:

PIL粘贴图片

Image.paste(colour, box) 可以把颜色填充到box对应的区域,对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组

# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': im = Image.open('cj_xiana.jpg') w, h = im.size im.paste((1, 149, 200), (w//4,h//4,w*3//4, h*3//4)) im.show()

效果:

PIL区域填充

分离和合并颜色通道

对于多通道图像,有时候能够分别对每个数据通道进行处理,处理完成重新整合

  • Image.split()将图像各通道进行分离,每个通道即是一个图像
  • Image.merge()将多个单通道图像合并,创建新图像
# -*- coding:utf-8 -*-from PIL import Imageif __name__ == '__main__': im = Image.open('cj_xiana.jpg') r,g,b = im.split() # 单通道图像展示 b.show() # 大量通道次序,合并 im1 = Image.merge("RGB

pil显示图片_Python之PIL模块使用相关推荐

  1. python 拼接图片_python使用PIL剪切和拼接图片

    本文实例为大家分享了python使用PIL剪切图片和拼接图片的具体代码,供大家参考,具体内容如下 因工作需要,接触到了PIL这个包,看其他人的博客踩了一些坑,有些博客并没有注明各个位置参数的含义,今天 ...

  2. python显示图片_python图像显示

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 使用python进行数字图片处理,还得安装pillow包. 虽然python里面 ...

  3. python gui按顺序显示图片_python tkinter GUI绘制,以及点击更新显示图片代码

    tkinter 绘制GUI简单明了,制作一些简单的GUI足够,目前遇到的一个问题是不能同时排列显示多幅图片(目前没找到同时显示解决方法), 退而求其次,改成增加一个update按钮,每次点下按钮自动更 ...

  4. python将矩阵转化为图片_Python利用PIL将数值矩阵转化为图像

    要求:输入一个n*n的矩阵,矩阵包括从-1到1的浮点数,将其转化为可视化图像 调库 from PIL import Image import numpy as np import math 载入图像, ...

  5. python label显示图片_python 实现在tkinter中动态显示label图片的方法

    在编程中我们往往会希望能够实现这样的操作:点击Button,选择了图片,然后在窗口中的Label处显示选到的图片.那么这时候就需要如下代码: from tkinter import * from tk ...

  6. 怎么看python环境变量配置是否好了验证图片_python 的 tesserocr 模块安装与获取图片验证码...

    OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.对于图形验证码来说,它们都是一些不规则的字符,这些字符确实 ...

  7. pythontkinter显示图片_python – 使用Tkinter显示图像

    我正在研究一个使用Tkinter和ImageTk显示一系列图像的python程序.我无法显示多个图像.下面是一个重现错误的小型完整程序.程序直接递归搜索当前的jpg文件,并在用户按Enter键时显示它 ...

  8. python kivy显示图片_python基于Kivy写一个图形桌面时钟程序代码示例

    本篇文章小编给大家分享一下python基于Kivy写一个图形桌面时钟程序代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Kivy 是一个开源的 ...

  9. python显示图片_python 一个figure上显示多个图像的实例

    方法一:主要是inshow()函数的使用 首先基本的画图流程为: import matplotlib.pyplot as plt #创建新的figure fig = plt.figure() #必须通 ...

最新文章

  1. 2017.4.24 js 中的iscroll
  2. Keras创建者深度思考:不要将AI作为操纵用户的工具
  3. SP2-0110: Cannot create save file afiedt.buf
  4. 优酷开放SDK之setOnCompletionListener
  5. 《大数据》第1期“聚焦”——从系统角度审视大数据计算
  6. OPPO首部5G手机亮相 10倍混合光学变焦技术惊艳MWC
  7. 圆章能随便刻吗_当归、人参、虫草熬成的养生汤,能随便销售吗?
  8. Viod Class 启动
  9. SpringMVC的URL路径映射@RequestMapping
  10. android 一个界面显示多个窗口,Android Studio多个项目窗口怎么切换?
  11. Unigam标注和Ngram标注
  12. 11月3日 迅雷白金会员vip账号分享 91freevip 23:00更新
  13. 91.(leaflet篇)leaflet态势标绘-进攻方向绘制
  14. 李忠汇编语言-初学-第九章详解
  15. java共享充电宝管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  16. 数据分析-数据指标描述业务之--咸鱼APP
  17. 触漫机器人_触漫携手壹心理打破亲子僵局 让爱驻家守护亲子健康
  18. 还想贪小便宜?建议你先了解一下物联卡收费标准!
  19. 欧美剧集观看最佳索引 US SHOWS GUIDE 【2005-12-27 转verycd】
  20. FFmpeg源码分析:swr_convert()音频格式转换

热门文章

  1. 上传大文件:在 System.Web.HttpRequest.GetEntireRawContent()
  2. springboot项目根据不同的环境启动不同的配置,如开发环境dev,测试环境sit,生产环境application...
  3. .Net开源源码查询
  4. 20140120收藏夹
  5. 页面用ajax实现简单的连接数据库
  6. linux的日志系统,Linux上的日志系统
  7. 新生周赛:小青的宿舍(C语言)
  8. android 会话 java_java – Android会话管理
  9. 信息奥赛一本通(1231:最小新整数)
  10. 信息学奥赛一本通(1143:最长最短单词)