PIL学习笔记

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值