您的位置:首页 > 编程语言 > Python开发

PIL学习笔记

2016-03-17 16:17 507 查看
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance
from io import StringIO

def learn():
# 打开本地文件
im = Image.open("1.jpg")
print(type(im))
print(im.format, im.size, im.mode)
# 调用xv显示图片,有很多缺陷
im.show()
# 保存文件,需要指定文件后缀
im.save("1.png")
# 生成缩略图
size = (100, 100)
im.thumbnail(size)
im.save("1.thumbnail", "JPEG")
# 剪切图片
im = Image.open("screen.png")
box = (0, 0, 640, 480)
region = im.crop(box)
region.save("screen-crop.jpg")
# 变换图片,比如选择180°
im = Image.open("screen.png")
im = im.transpose(Image.ROTATE_180)
im.show()
# 粘贴图片,注意被粘贴的图片大小和粘贴区域大小要吻合
im = Image.open("screen.png")
box = (0, 0, 400, 400)
region = im.crop(box)
im.paste(region, box)
im.show()
# 分离颜色通道,合并颜色通道
im = Image.open("1.jpg")
r, g, b = im.split()
r.show()
im = Image.merge("RGB", (b, g, r))
im.show()
# 改变图片大小,逆时针选择图片
im = Image.open("1.jpg")
out = im.resize((100, 100))
out.show()
out = im.rotate(45)
out.show()
# 另一种旋转图片,可以设置图片按垂直或水平线翻转
im = Image.open("1.jpg")
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out.show()
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out.show()
out = im.transpose(Image.ROTATE_90)
out.show()
out = im.transpose(Image.ROTATE_180)
out.show()
# convert 函数改变图片格式
im = Image.open("1.ppm").convert("L")
# 图片滤镜效果
im = Image.open("1.jpg")
out = im.filter(ImageFilter.DETAIL)
out.show()
# 图片点操作,改变图片亮度
im = Image.open("1.jpg")
out = im.point(lambda i: i * 5)
out.show()
# ImageEnhance模块用来改变图片对比度、亮度、色彩平衡、锐化度等属性
im = Image.open("1.jpg")
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
# PIL能够处理动画图片,FLI/FLC/GIF/...
im = Image.open("a.gif")
# 跳到第2帧
im.seek(1)
try:
while 1:
im.seek(im.tell() + 1)
im.show()
except EOFError:
pass

def roll(image, delta):
"Roll an image sideways"
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
image.paste(part2, (0, 0, xsize - delta, ysize))
image.paste(part1, (xsize - delta, 0, xsize, ysize))
return image

def chang_bands():
"大致操作相当于选择红色通道后做反选,然后保持选区在绿色通道调低亮度"
im = Image.open("1.jpg")
source = im.split()
R, G, B = 0, 1, 2
# 很有趣的功能,屏蔽红色通道里亮度大于120的点。类似PS做出的阈值操作,结果是通道里非0即255
mask = source[R].point(lambda i: i < 120 and 255)
mask.show()
# 降低绿色通道的亮度
# source[G].show()
out = source[G].point(lambda i: i * 0.5)
# out.show()
# 进行屏蔽粘贴,这里mask意义为:值为255的点显示,值为0的点屏蔽
source[G].paste(out, None, mask)
# source[G].show()
im = Image.merge(im.mode, source)
# im.show()

class ImageSequence:
'一个用来遍历动画文件帧的类'
def __init__(self, im):
self.im = im

def __getitem__(self, ix):
try:
if ix:
self.im.seek(ix)
return self.im
except EOFError:
raise IndexError  # end of sequence

def loop_sequence():
im = Image.open("a.gif")
for frame in ImageSequence(im):
print(frame.format)

def from_file():
'通过打开文件获得图片对象'
fp=open("1.jpg","rb")
im=Image.open(fp)
im.show()

def from_string():
'从string中获得图片(官方示例为StringIO.StringIO,但当前版本已经改为io.StringIO'
im=Image.open(StringIO(buffer))

def from_tar():
'从压缩文件中获得图片'
from PIL import TarIO
fp=TarIO.TarIO("Imaging.tar","Imaging/test/lena.ppm")
im=Image.open(fp)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python