# Python Image Library(PIL)库学习记录
# open()函数,该库根据文件的内容自动确定格式,除非确实需要,否则库不会解码或加载栅格数据。
# open()将读取文件头以确定文件格式并提取解码文件所需的模式、大小和其他属性等内容,但文件的其余部分直到稍后才会处理。
# 即open()打开图像文件是一项快速操作,它与文件大小和压缩类型无关。
# save()方法,保存文件时,名称很重要。除非指定格式,否则库将使用文件扩展名来发现要使用的文件存储格式
# show()的标准版本不是很有效,因为它将图像保存到临时文件并调用实用程序来显示图像,依赖于已经安装的其他图片查看工具
# convert()在不同像素表示之间转换图像,图片格式转换,B,G,R,L通道等转换
# split merge 通道分离及合并
# thumbnails创建缩略图
# crop paste 剪切粘贴合并图像
# transpose翻转图像
# roll翻转 图像滚动拼接
# 图像类包含resize()和rotate(),前者采用元组给出新大小,后者采用逆时针方向的角度(以度为单位)。
# transpose()翻转平移
# 创建MASK imout = im.point(lambda i: expression and 255)
# ImageEnhance调整对比度,亮度,色彩平衡和清晰度( contrast, brightness, color balance and sharpness)。
# PIL包含对图像序列(也称为动画格式)的一些基本支持。支持的序列格式包括 FLI/FLC、GIF 和一些实验格式。TIFF文件还可以包含多个帧。
# 当打开序列文件时,PIL会自动加载序列中的第一帧。可以使用seek和tell不同帧之间移动:
# 读取动图并遍历每一帧展示,seek,tell或者ImageSequence.Iterator(im)
# 图像文本图形等绘制
# draft()方法操作已打开但尚未加载的图像,使其尽可能接近给定的模式和大小。这是通过重新配置图像解码器来完成的
# draft()草稿模式下的阅读仅适用于 JPEG 和 MPO 文件
# draft()生成的图像可能与请求的模式和大小不完全匹配。若要确保图像不大于给定大小,请改用缩略图thumbnails方法。
import os
import sys
from pathlib import Path
from urllib.request import urlopen
from PIL import Image, TarIO
from PIL import ImageEnhance # 图像增强:调整对比度,亮度,色彩平衡和清晰度(像素级操作)
from PIL import ImageFilter # 图像过滤:高斯平滑,边缘
from PIL import ImageSequence # 图像读取保存展示,gif等读取,一帧一帧,帧跳转获取等;
from PIL import PSDraw # 图像文本图形图像等绘制
# open()函数,该库根据文件的内容自动确定格式
# save()方法,保存文件时,名称很重要。除非指定格式,否则库将使用文件扩展名来发现要使用的文件存储格式
# 读取保存图片,获取图片属性
def readSave():
# 从文件加载图片
im = Image.open("ml.jpg")
# 以上下文对象方式读取
# with Image.open("hopper.ppm") as im:
# im.show()
# 从打开的文件读取
# with open(’ml.jpg‘, "rb") as fp:
# im = Image.open(fp)
# 从二进制文件读取
# im = Image.open(io.BytesIO(buffer))
# 从url读取
url = "https://python-pillow.org/images/pillow-logo.png"
img = Image.open(urlopen(url))
# 或者使用ContainerIO or TarIO从压缩文件/大文件读取
fp = TarIO.TarIO("Tests/images/hopper.tar", "hopper.jpg")
im = Image.open(fp)
# 像素类型和深度。常见的模式是灰度图像的“L”(亮度),真彩色图像的“RGB”和印前图像的“CMYK”。
print(im.format, im.size, im.mode)
# JPEG (512, 512) RGB
# show()的标准版本不是很有效,因为它将图像保存到临时文件并调用实用程序来显示图像,依赖于已经安装的其他图片查看工具
im.show()
# 图片格式转换
def convert(infile):
# for infile in sys.argv[1:]:
f, e = os.path.splitext(infile)
outfile = f + ".jpg"
if infile != outfile:
try:
with Image.open(infile) as im:
im.save(outfile)
except OSError:
print("cannot convert", infile)
# 创建JPEG缩略图(thumbnails)
def thumbnails(infile):
size = (128, 128)
# for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + ".thumbnail"
if infile != outfile:
try:
# 请务必注意,除非确实需要,否则库不会解码或加载栅格数据。
# 打开文件时,将读取文件头以确定文件格式并提取解码文件所需的模式、大小和其他属性等内容,但文件的其余部分直到稍后才会处理。
# 即open()打开图像文件是一项快速操作,它与文件大小和压缩类型无关。
with Image.open(infile) as im:
im.thumbnail(size)
# im.thumbnail((200, 200), Image.ANTIALIAS)
print("thumbnail =", im.mode, im.size)
im.save(outfile, "JPEG")
im.show()
except OSError:
print("cannot create thumbnail for", infile)
# 下面是一个简单的脚本,用于快速识别一组图像文件:
def identify():
print(sys.argv)
print(sys.argv[1:])
for infile in sys.argv[1:]:
try:
with Image.open(infile) as im:
print(infile, im.format, f"{im.size}x{im.mode}")
except OSError:
pass
# 剪切、粘贴、合并图像
def crop(infile):
im = Image.open(infile)
# 该区域由 4 元组定义,其中坐标为(左、上、右、下)。Python 成像库使用左上角为 (0, 0) 的坐标系。
# 坐标是指像素之间的位置,因此上例中的区域正好为 300x300 像素
box = (100, 100, 400, 400)
# 提取子矩形
region = im.crop(box)
region.show()
# 将区域旋转180°,再粘贴回去
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
im.show()
def roll(im, delta):
"""横向滚动图像"""
xsize, ysize = im.size
print(xsize, ysize)
delta = delta % xsize
print(delta)
if delta == 0:
return im
part1 = im.crop((0, 0, delta, ysize))
part2 = im.crop((delta, 0, xsize, ysize))
im.paste(part1, (xsize - delta, 0, xsize, ysize))
im.paste(part2, (0, 0, xsize - delta, ysize))
im.show()
# 合并图像
def merge(im1, im2):
w = im1.size[0] + im2.size[0]
h = max(im1.size[1], im2.size[1])
# paste方法还可以将透明度掩码作为可选参数。值255表示粘贴的图像在该位置是不透明的(即,粘贴的图像应按原样使用)。
# 值 0 表示粘贴的图像是完全透明的。介于两者之间的值表示不同的透明度级别。
# 例如,粘贴 RGBA图像并将其用作蒙版将粘贴图像的不透明部分,但不粘贴其透明背景。
im = Image.new("RGBA", (w, h))
im.paste(im1)
im.paste(im2, (im1.size[0], 0))
im.show()
# 分离和合并通道
def mergeSplit(im):
# 单通道图像的话,split方法只返回自身
r, g, b = im.split()
r.show()
g.show()
b.show()
# Image是rgb格式
# im = Image.merge("BGR", (b, g, r))
# im.show()
im = Image.merge("RGB", (r, g, b))
im.show()
# 几何变换
# 图像类包含resize()和rotate()的方法。前者采用元组给出新大小,后者采用逆时针方向的角度(以度为单位)。
# transpose()翻转平移
# convert()在不同像素表示之间转换图像。
def geometricalTransform(im):
out = im.resize((128, 128))
out.show()
# out = im.rotate(45) # degrees counter-clockwise
# out.show()
# out = im.transpose(Image.FLIP_LEFT_RIGHT)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
basic_drawing.py 基础绘制脚本示例 measure_image_temperature.py 测试图片温度 measure_video_temperature.py 测试视频温度 gray8_vs_gray16.py gray6与gray16互相转换及增加颜色条 measure_camera_video_temperature.py 测试实时摄像头视频流温度 plot_bar.py measure_image_click_temperature.py 鼠标时间测试任意一点温度 images/ 测试照片 lighter_gray16_image.tiff pygame_icon.tiff 测试照片 pil.py
资源推荐
资源详情
资源评论


















收起资源包目录




















共 17 条
- 1
资源评论


程序媛一枚~
- 粉丝: 3w+
- 资源: 26
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
