pil_pillow - CSDN
pil 订阅
太平船务有限公司(PIL)由张允中先生于1967年在新加坡成立。公司成立初期,以经营区域性的散杂货运输为主,从1983年起,首次推出了集装箱运输服务。 展开全文
太平船务有限公司(PIL)由张允中先生于1967年在新加坡成立。公司成立初期,以经营区域性的散杂货运输为主,从1983年起,首次推出了集装箱运输服务。
信息
公司名称
太平船务有限公司
总部地点
新加坡
外文名称
PIL
成立时间
1967年
PIL简介
太平船务有限公司(PIL)由张允中先生于1 967年在新加坡成立。公司成立初期,以经营区域性的散杂货运输为主,从1983年起,首次推出了集装箱运输服务。公司还积极发展多样化的物流经营,如仓储、货运及码头。
收起全文
精华内容
参与话题
  • PIL (Python Imaging Library) 教程

    万次阅读 2016-10-19 23:48:35
    来自 http://effbot.org/imagingbook/introduction.htm简介PIL (Python Imaging Library)...使用Image类PIL中最重要的类是Image类,该类在Image模块中定义。从文件加载图像:import Image im = Image.open("lena.ppm")

    来自 http://effbot.org/imagingbook/introduction.htm

    简介

    PIL (Python Imaging Library)

    Python图像处理库,该库支持多种文件格式,提供强大的图像处理功能。

    使用Image类

    PIL中最重要的类是Image类,该类在Image模块中定义。

    从文件加载图像:

    import Image
    im = Image.open("lena.ppm")

    如果成功,这个函数返回一个Image对象。现在你可以使用该对象的属性来探索文件的内容。

    print im.format, im.size, im.mode
    # PPM (512, 512) RGB

    format属性指定了图像文件的格式,如果图像不是从文件中加载的则为None
    size属性是一个2个元素的元组,包含图像宽度和高度(像素)。
    mode属性定义了像素格式,常用的像素格式为:“L” (luminance) - 灰度图, “RGB” , “CMYK”。

    如果文件打开失败, 将抛出IOError异常。

    一旦你拥有一个Image类的实例,你就可以用该类定义的方法操作图像。比如:显示

    im.show()

    (show()的标准实现不是很有效率,因为它将图像保存到一个临时文件,然后调用外部工具(比如系统的默认图片查看软件)显示图像。该函数将是一个非常方便的调试和测试工具。)

    接下来的部分展示了该库提供的不同功能。

    读写图像

    PIL支持多种图像格式。从磁盘中读取文件,只需使用Image模块中的open函数。不需要提供文件的图像格式。PIL库将根据文件内容自动检测。

    如果要保存到文件,使用Image模块中的save函数。当保存文件时,文件名很重要,除非指定格式,否则PIL库将根据文件的扩展名来决定使用哪种格式保存。

    * 转换文件到JPEG *

    import os, sys
    import Image
    
    for infile in sys.argv[1:]:
        f, e = os.path.splitext(infile)
        outfile = f + ".jpg"
        if infile != outfile:
            try:
                Image.open(infile).save(outfile)
            except IOError:
                print "cannot convert", infile

    save函数的第二个参数可以指定使用的文件格式。如果文件名中使用了一个非标准的扩展名,则必须通过第二个参数来指定文件格式。

    * 创建JPEG缩略图 *

    import os, sys
    import Image
    
    size = 128, 128
    
    for infile in sys.argv[1:]:
        outfile = os.path.splitext(infile)[0] + ".thumbnail"
        if infile != outfile:
            try:
                im = Image.open(infile)
                im.thumbnail(size)
                im.save(outfile, "JPEG")
            except IOError:
                print "cannot create thumbnail for", infile

    需要注意的是,PIL只有在需要的时候才加载像素数据。当你打开一个文件时,PIL只是读取文件头获得文件格式、图像模式、图像大小等属性,而像素数据只有在需要的时候才会加载。

    这意味着打开一个图像文件是一个非常快的操作,不会受文件大小和压缩算法类型的影响。

    * 获得图像信息 *

    import sys
    import Image
    
    for infile in sys.argv[1:]:
        try:
            im = Image.open(infile)
            print infile, im.format, "%dx%d" % im.size, im.mode
        except IOError:
            pass

    剪切、粘贴、合并图像

    Image类提供了某些方法,可以操作图像的子区域。提取图像的某个子区域,使用crop()函数。

    * 复制图像的子区域 *

    box = (100, 100, 400, 400)
    region = im.crop(box)

    定义区域使用一个包含4个元素的元组,(left, upper, right, lower)。坐标原点位于左上角。上面的例子提取的子区域包含300x300个像素。

    该区域可以做接下来的处理然后再粘贴回去。

    * 处理子区域然后粘贴回去 *

    region = region.transpose(Image.ROTATE_180)
    im.paste(region, box)

    当往回粘贴时,区域的大小必须和参数匹配。另外区域不能超出图像的边界。然而原图像和区域的颜色模式无需匹配。区域会自动转换。

    * 滚动图像 *

    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

    paste()函数有个可选参数,接受一个掩码图像。掩码中255表示指定位置为不透明,0表示粘贴的图像完全透明,中间的值表示不同级别的透明度。

    PIL允许分别操作多通道图像的每个通道,比如RGB图像。split()函数创建一个图像集合,每个图像包含一个通道。merge()函数接受一个颜色模式和一个图像元组,然后将它们合并为一个新的图像。接下来的例子交换了一个RGB图像的三个通道。

    * 分离和合并图像通道 *

    r, g, b = im.split()
    im = Image.merge("RGB", (b, g, r));

    对于单通道图像,split()函数返回图像本身。如果想处理各个颜色通道,你可能需要先将图像转为RGB模式。

    几何变换

    resize()函数接受一个元组,指定图像的新大小。
    rotate()函数接受一个角度值,逆时针旋转。

    * 基本几何变换 *

    out = im.resize((128, 128))
    out = im.rotate(45) # degrees counter-clockwise

    图像旋转90度也可以使用transpose()函数。transpose()函数也可以水平或垂直翻转图像。

    * transpose *

    out = im.transpose(Image.FLIP_LEFT_RIGHT)
    out = im.transpose(Image.FLIP_TOP_BOTTOM)
    out = im.transpose(Image.ROTATE_90)
    out = im.transpose(Image.ROTATE_180)
    out = im.transpose(Image.ROTATE_270)

    transpose()rotate()函数在性能和结果上没有区别。

    更通用的图像变换函数为transform()

    颜色模式变换

    PIL可以转换图像的像素模式。

    * 转换颜色模式 *

    im = Image.open("lena.ppm").convert("L")

    PIL库支持从其他模式转为“L”或“RGB”模式,其他模式之间转换,则需要使用一个中间图像,通常是“RGB”图像。

    图像增强(Image Enhancement)

    过滤器

    ImageFilter模块包含多个预定义的图像增强过滤器用于filter()函数。

    * 应用过滤器 *

    import ImageFilter
    out = im.filter(ImageFilter.DETAIL)

    点操作

    point()函数用于操作图像的像素值。该函数通常需要传入一个函数对象,用于操作图像的每个像素:

    * 应用点操作 *

    # 每个像素值乘以1.2
    out = im.point(lambda i: i * 1.2)

    使用以上技术可以快速地对图像像素应用任何简单的表达式。可以结合point()函数和paste函数修改图像。

    * 处理图像的各个通道 *

    # split the image into individual bands
    source = im.split()
    
    R, G, B = 0, 1, 2
    
    # select regions where red is less than 100
    mask = source[R].point(lambda i: i < 100 and 255)
    
    # process the green band
    out = source[G].point(lambda i: i * 0.7)
    
    # paste the processed band back, but only where red was < 100
    source[G].paste(out, None, mask)
    
    # build a new multiband image
    im = Image.merge(im.mode, source)

    注意用于创建掩码图像的语法:

    imout = im.point(lambda i: expression and 255)

    Python计算逻辑表达式采用短路方式,即:如果and运算符左侧为false,就不再计算and右侧的表达式,而且返回结果是表达式的结果。比如a and b如果a为false则返回a,如果a为true则返回b,详见Python语法。

    增强

    对于更多高级的图像增强功能,可以使用ImageEnhance模块中的类。

    可以调整图像对比度、亮度、色彩平衡、锐度等。

    * 增强图像 *

    import ImageEnhance
    
    enh = ImageEnhance.Contrast(im)
    enh.enhance(1.3).show("30% more contrast")

    图像序列

    PIL库包含对图像序列(动画格式)的基本支持。支持的序列格式包括FLI/FLCGIF和一些实验性的格式。TIFF文件也可以包含多个帧。

    当打开一个序列文件时,PIL库自动加载第一帧。你可以使用seek()函数tell()函数在不同帧之间移动。

    * 读取序列 *

    import Image
    
    im = Image.open("animation.gif")
    im.seek(1) # skip to the second frame
    
    try:
        while 1:
            im.seek(im.tell() + 1)
            # do something to im
    except EOFError:
        pass # end of sequence

    如例子中展示的,当序列到达结尾时,将抛出EOFError异常。

    注意当前版本的库中多数底层驱动只允许seek到下一帧。如果想回到前面的帧,只能重新打开图像。

    以下迭代器类允许在for语句中循环遍历序列:

    * 一个序列迭代器类 *

    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
    
    for frame in ImageSequence(im):
        # ...do something to frame...

    Postscript打印

    PIL库包含一些函数用于将图像、文本打印到Postscript打印机。以下是一个简单的例子。

    * 打印到Postscript *

    import Image
    import PSDraw
    
    im = Image.open("lena.ppm")
    title = "lena"
    box = (1*72, 2*72, 7*72, 10*72) # in points
    
    ps = PSDraw.PSDraw() # default is sys.stdout
    ps.begin_document(title)
    
    # draw the image (75 dpi)
    ps.image(box, im, 75)
    ps.rectangle(box)
    
    # draw centered title
    ps.setfont("HelveticaNarrow-Bold", 36)
    w, h, b = ps.textsize(title)
    ps.text((4*72-w/2, 1*72-h), title)
    
    ps.end_document()

    读取图像进阶

    如前所述,可以使用open()函数打开图像文件,通常传入一个文件名作为参数:

    im = Image.open("lena.ppm")

    如果打开成功,返回一个Image对象,否则抛出IOError异常。

    也可以使用一个file-like object代替文件名(暂可以理解为文件句柄)。该对象必须实现read,seek,tell函数,必须以二进制模式打开。

    * 从文件句柄打开图像 *

    fp = open("lena.ppm", "rb")
    im = Image.open(fp)

    如果从字符串数据中读取图像,使用StringIO类:

    * 从字符串中读取 *

    import StringIO
    
    im = Image.open(StringIO.StringIO(buffer))

    如果图像文件内嵌在一个大文件里,比如tar文件中。可以使用ContainerIO或TarIO模块来访问。

    * 从tar文档中读取 *

    import TarIO
    
    fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
    im = Image.open(fp)

    控制解码器

    * 该小节不太理解,请参考原文 *

    有些解码器允许当读取文件时操作图像。通常用于在创建缩略图时加速解码(当速度比质量重要时)和输出一个灰度图到激光打印机时。

    draft()函数。

    * Reading in draft mode *

    im = Image.open(file)
    print "original = ", im.mode, im.size
    
    im.draft("L", (100, 100))
    print "draft = ", im.mode, im.size

    输出类似以下内容:

    original = RGB (512, 512)
    draft = L (128, 128) 

    注意结果图像可能不会和请求的模式和大小匹配。如果要确保图像不大于指定的大小,请使用thumbnail函数。

    扩展阅读

    Python2.7 教程 PIL
    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000

    Python 之 使用 PIL 库做图像处理
    http://www.cnblogs.com/way_testlife/archive/2011/04/17/2019013.html

    展开全文
  • PIL模块使用

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


    PIL模块内容结构

    PIL模块 - Python图像处理
    来自http://www.tpleina.com/2019/05/2487951348.html

    介绍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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __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 Image
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        r,g,b = im.split()
        # 单通道图像展示
        b.show()
        # 大量通道次序,合并
        im1 = Image.merge("RGB", (g, b, r))
        im1.show()
    

    单通道图像效果:
    PIL单通道图片

    合并图像效果:
    PIL合并图片

    ImageDraw模块

    ImageDraw 模块提供了 Draw 类,它能在 Image 实例上进行简单的2D绘画

    Draw类绘画函数:

    • chord 画弦
    • arc 画弧
    • pieslice 画扇形
    • ellipse 画椭圆
    • line 画线段/多段线
    • point 点
    • polygon 画多边形
    • rectangle 画矩形
    • text 文字

    各绘制函数详细使用可见[官方文档API](https://pillow.readthedocs.io/en/4.2.x/reference/ImageDraw.html 官方文档API)

    画直线

    Draw.line(xy,options) 函数绘制直线

    其中 xy 表示坐标列表,它可以是[(x,y),…]或者[x,y,…]的形式:

    • [(x1, y1), (x2, y2), …] :包含若干个元组的列表
    • [x1, y1, x2, y2, …] :按照顺序包含坐标信息的列表
    • [x1, y1, (x2, y2), …] :以上两种情况的混合
    • ((x1, y1), (x2, y2), …) :包含若干个元组的元组
    • (x1, y1, x2, y2, …) :按照顺序包含坐标信息的元组
    • (x1, y1, (x2, y2), …) :以上两种情况的混合

    options 可用的选项:

    • fill = (R,G,B) :指定线条颜色
    • width = integer :指定线条宽度,单位是px
    from PIL import Image,ImageDraw
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        # 三等分位置
        dr_im.line([0, 0.33 * h, w, 0.33 * h], fill = (0, 0, 0), width = 6)
        # 左下角到中心点,右下角到中心点
        dr_im.line([(0, h), (0.5 * w, 0.5 * h), (w, h)], fill = (0, 0, 0), width = 6)
        im.show()
    

    画直线效果:
    PIL画直线

    画弧线

    Draw.arc(xy, start, end, options) 函数来绘制弧线

    • xy 是个长度为4的列表,如[x0, y0, x1, y1],表示 弧线最左侧距离左边、弧线最顶点距离上边、弧线最右侧距离左边、弧线最低点距离上边的距离
    • start 和 end 则是弧的起止角度,其中水平向右的方向为 0°,竖直向下的方向为 90°,水平向左的方向为 180°,竖直向上的方向为 270°
    • options 中可用选项:
      • fill = (R, G, B) :指定线条颜色
    from PIL import Image,ImageDraw
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        dr_im.arc([10,20,100,300],0,270,fill=(255,0,0))
        im.show()
    

    在图片上写字

    Draw.text(xy, text, options) 函数可以在Image实例上写字

    • xy 指定的是文本左上角的顶点
    • options 中可用选项:
      • fill = (R, G, B) :指定线条颜色
      • font = ImageFont实例 :指定字体,接收一个ImageFont的实例
    # -*- coding:utf-8 -*-
    from PIL import Image,ImageDraw,ImageFont
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        # 引入字体库
        myFont = ImageFont.truetype('1.ttf',80)
        # 如果不适用myFont字体实例,则使用PIL默认字体
        dr_im.text([0.1 * w,0.8 * h], u"灼眼的夏娜", fill = (255,0,0), font=myFont)
        im.show()
    

    字体效果:
    PIL字体效果

    ImageFont模块

    PIL可以使用OpenType/TrueType字体

    ImageFont.truetype(fontfile, fontsize) 函数可以加载 OpenType/TrueType 字体,后缀名为.ttf,.otf,.ttc字体库文件

    注意使用这个函数需要额外安装_imageingft模块

    还是上面的例子

    # -*- coding:utf-8 -*-
    from PIL import Image,ImageDraw,ImageFont
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        # 引入字体库
        myFont = ImageFont.truetype('1.ttf', 80)
        # 如果不适用myFont字体实例,则使用PIL默认字体
        dr_im.text([0.1 * w,0.8 * h], u"灼眼的夏娜", fill = (255,0,0), font=myFont)
        im.show()
    

    ImageFilter模块

    ImageFilter是PIL滤镜模块,提供了滤波器的相关定义,这些滤波器主要用于Image.filter()方法

    滤镜名称和含义说明:

    • ImageFilter.BLUR :模糊滤镜
    • ImageFilter.CONTOUR :只显示轮廓
    • ImageFilter.EDGE_ENHANCE :边界加强
    • ImageFilter.EDGE_ENHANCE_MORE :边界加强(阀值更大)
    • ImageFilter.EMBOSS :浮雕滤镜
    • ImageFilter.FIND_EDGES :边界滤镜
    • ImageFilter.SMOOTH :平滑滤镜
    • ImageFilter.SMOOTH_MORE :平滑滤镜(阀值更大)
    • ImageFilter.SHARPEN :锐化滤镜

    使用示例:

    # -*- coding:utf-8 -*-
    from PIL import Image,ImageFilter
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 平滑滤镜
        im = im.filter(ImageFilter.SMOOTH)
        im.show()
        # 图像模糊
        im = im.filter(ImageFilter.BLUR)
        im.show()
        # 线条边界加强
        im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
        im.show()
        # 浮雕滤镜
        im = im.filter(ImageFilter.EMBOSS)
        im.show()
    

    其中浮雕滤镜效果
    PIL浮雕滤镜效果

    全屏截图,区域截图

    ImageGrab.grab方法,可实现全屏截图,区域截图

    可截取屏幕box范围内的图片,默认截取全屏

    示例代码:

    # -*- coding:utf-8 -*-
    from PIL import ImageGrab
    
    # 全屏截屏
    im = ImageGrab.grab()
    im.show()
    # 区域截屏,1000x600图形区域
    ImageGrab.grab((400,100, 1400,700)).show()
    
    

    PIL.ImageGrab.grabclipboard() 方法获取剪切板内的图片

    示例代码:

    from PIL import ImageGrab
    im = ImageGrab.grab()
    im.show()
    im = ImageGrab.grab((10,10,400,400))
    im.show()
    ImageGrab.grabclipboard().show()
    

    一些类方法

    创建图像

    Image.new(mode, size, color) 该方法可以创建指定图像,可在上面进行一些图像操作

    • mode 图像色彩模式
    • size 图像大小
    • color 图像初始颜色

    示例:

    # -*- coding:utf-8 -*-
    from PIL import Image,ImageFont,ImageDraw
    
    if __name__ == '__main__':
        im= Image.new("RGB", (128, 128), "#FFF")
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        myFont = ImageFont.truetype('1.ttf', 25)
        dr_im.text([0.1 * w,0.4 * h], u"雷那网", fill = (0,0,0), font=myFont)
        im.show()
    

    图像混合

    Image.blend(image1,image2, alpha) 将两张图像混合, 前提两种图片尺寸和模式一致

    合成方式:out = image1 *(1.0 - alpha) + image2 * alpha

    • 如果变量alpha为0.0,将返回第一张图像的拷贝
    • 如果变量alpha为1.0,将返回第二张图像的拷贝
    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im1 = Image.open("paste_xiana.jpg")
        im2 = Image.open("m_xiana.jpg")
        im = Image.blend(im1, im2, 0.5)
        im.show()
    

    操作图片像素

    Image.eval(image,function) 使用回调函数处理image图像中每一个像素点

    如果变量image有多个通道,那回调函数将作用于每一个通道

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    def deffun(c):
        # 亮度增强
        return c*1.5
    
    if __name__ == '__main__':
        im = Image.open("cj_xiana.jpg")
        im = Image.eval(im,deffun)
        im.show()
    

    亮度增强效果:
    亮度增强效果

    图像拷贝

    Image.copy()函数

    # -*- coding:utf-8 -*-
    from PIL import Image
    im1 = Image.open("cj_xiana.jpg")
    im2 = im1.copy()
    im2.save("xiana_cp.jpg")
    

    获得图像指定位置像素值

    Image.getpixel(xy)函数,返回给定位置的像素值,如果图像为多通道,则返回一个元组

    # -*- coding:utf-8 -*-
    from PIL import Image
    im1 = Image.open("cj_xiana.jpg")
    print(im1.getpixel((1,1)))
    print(im1.getpixel((649,649)))
    # 输出:
    # (41, 183, 197)
    # (236, 210, 153)
    

    判断文件是否损坏

    Image.getpixel(xy)函数,尝试判断文件是否损坏,如果这个方法发现了任何问题,它将产生对应的异常

    这个方法不能捕获所有的错误,要检查所有错误,必须加载整个图像

    # -*- coding:utf-8 -*-
    
    from PIL import Image
    im = Image.open("cj_xiana.png")
    im.verify()
    # 注:没有任何输出,表示图像im没有损坏
    
    展开全文
  • python3 怎么安装 PIL

    万次阅读 多人点赞 2019-03-28 21:11:56
    关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大。不过只支持到Python 2.7。 PIL官方网站:http://www.pythonware.com/products/pil/ Pillow是PIL的一个派生分支,...
    关于Pillow与PIL
    
    PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大。不过只支持到Python 2.7。
    
    PIL官方网站:http://www.pythonware.com/products/pil/
    
    Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库。目前最新版本是3.0.0。
    
    Pillow的Github主页:https://github.com/python-pillow/Pillow
    Pillow的文档(对应版本v3.0.0):https://pillow.readthedocs.org/en/latest/handbook/index.html
    Pillow的文档中文翻译(对应版本v2.4.0):http://pillow-cn.readthedocs.org/en/latest/
    
    Python 3.x 安装Pillow
    
    给Python安装Pillow非常简单,使用pip或easy_install只要一行代码即可。
    
    在命令行使用PIP安装:
    pip install Pillow
    
    或在命令行使用easy_install安装:
    easy_install Pillow
    
    安装完成后,使用from PIL import Image就引用使用库了。比如:
    from PIL import Image
    im = Image.open("bride.jpg")
    im.rotate(45).show()
    展开全文
  • 安装Python及PIL类库步骤小结

    万次阅读 2016-10-13 22:18:01
    安装Python及PIL类库步骤小结 PIL和Numpy官方暂时没有发布针对python3.x的版本,所以要装这两个类库时注意选择2.x版本。 一、安装Python 1、下载安装软件 https://www.python.org/downloads/release/python-2712/ ...

    安装Python及PIL类库步骤小结

    PIL和Numpy官方暂时没有发布针对python3.x的版本,所以要装这两个类库时注意选择2.x版本。

    一、安装Python

    1、下载安装软件

    https://www.python.org/downloads/release/python-2712/

    根据自己的机器系统版本选择合适的python版本。我是WIN7 64位操作系统,所以选择的是


    安装时注意勾选add python.exe to path.前的小叉叉去掉。同时注意安装好PIP。

    2、打开命令窗口,敲入python后,出现


     安装成功。

    二、安装第三方库

           注意,在windows下安装时,注意电脑系统是多少位的。

    系统32位,python环境也是32位

    系统64位,python环境也要是64位。有人说32位也可以。但我下的是64位。

    然后,确认你的pip是否成功安装。在命令行cmd中输入


    说明pip已经正常安装。

    以后安装库,只需要在命令行输入

    pip install packagename

    若是python 3.x,当然换成输入

    pip3 install packagename


    1、安装Numpy

    命令行窗口输入

    pip install Numpy



    PIP安装Numpy库的时候,提示pip版本比较旧,需要更新版本根据提示更新即可。

    2、安装PIL

           因为官网上http://www.pythonware.com/products/pil/没有win7 64位的版本,所以网友们推荐到http://www.lfd.uci.edu/~gohlke/pythonlibs/


    其实这时已经有了python3.x的版本了。

    命令行窗口键入(假设我下载的PIL文件存放在E盘下,文件名叫Pillow-3.3.1-cp27-cp27m-win_amd64.whl)

    pip  install e:\Pillow-3.3.1-cp27-cp27m-win_amd64.whl

    安装完毕,需要检查一下安装是否成功。

    如下图所示,打开python后,输入importimage,会提示没有这个模块。因为使用pillow库需要使用from PIL import Image代替import Image。按照图中的处理,即可验证PIL是否安装成功。


    有网友说到.jpg文件读取的问题,我安装时还没有遇到。到此为止,算是成功安装了目前学习computervision必备的工具软件了。

    补充:在学习《Python计算机视觉编程》的第一章,可以看见学习此书还涉及Matplotlib、ScriPy(先安装Numpy后再装它),安装方法雷同。皆可以在http://www.lfd.uci.edu/~gohlke/pythonlibs/ 找到上述两个软件包。

    结果后面运行PCV一书中1.4节的例题时,发现问题来了。
    代码运行提示我:require MKL
    方才发现我原来安装的Numpy不带MKL,只得重新到http://www.lfd.uci.edu/~gohlke/pythonlibs/
    下载numpy-1.11.2+mkl-cp27-cp27m-win_amd64.whl至E盘。
    1)重新安装Numpy。
    pip  install e:\ numpy-1.11.2+mkl-cp27-cp27m-win_amd64.whl
    2)重新安装Scipy
    pip  install e:\ scipy-0.18.1-cp27-cp27m-win_amd64.whl
    但是电脑提醒我已经安装过,需要进行升级安装。重新键入:
    pip  install e:\ scipy-0.18.1-cp27-cp27m-win_amd64.whl   --upgrade
    搞定!

    展开全文
  • Python图像处理PIL各模块详细介绍

    万次阅读 多人点赞 2018-01-23 09:13:30
    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。 open类 Image.open(file) ⇒ image Image.open(file, mode) ⇒ image...
  • python PIL 打开\显示\保存图像

    万次阅读 2019-05-12 18:55:02
    使用python进行数字图片处理,还...虽然python里面自带一个PIL(python images library), 但这个库现在已经停止更新了,所以使用Pillow, 它是由PIL发展而来的。 pip install Pillow 一、图片的打开与显示 fro...
  • PIL读取图片

    千次阅读 2019-09-30 13:05:17
    在做分类任务时,图片如果有出现损坏或者像素太小等问题,可能会...form PIL import Image import os import shutil input_dir = 'inuput_dir' target_dir = 'taret_dir' pathDir = os.listdir(input_dir) for di...
  • PIL简介

    2017-03-23 20:14:57
    PIL是图像归档和批处理应用程序的理想选择。 您可以使用该库创建缩略图(create thumbnails),在文件格式之间进行转换(convert between file formats),打印图像(print images)等。 当前版本标识并读取大量格式...
  • Python图像处理库PIL中图像格式转换(一)

    万次阅读 多人点赞 2016-03-10 08:16:10
    本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”...
  • Python图像库PIL的类Image及其方法介绍

    万次阅读 多人点赞 2018-11-29 19:10:59
    Python图像库PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PILPIL历史悠久,原来是只支持python2.x的...
  • Python图像处理库PIL的基本概念介绍

    万次阅读 多人点赞 2016-02-11 21:43:33
    这一节我们介绍一下PIL中的基本概念。 PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。 1、...
  • PIL

    千次阅读 2018-12-03 20:22:01
    PIL是什么? 英文是Python Imaging Library,也就是图像处理标准库,PIL非常强大,但是API是十分的简单的 PIL支持? pil仅仅支持python2.7,,pil已经好久没有更新了,所以一些志愿者他们基于PIL的基础创建了其...
  • import cv2 import cv2 as cv ...from PIL import Image, ImageFont, ImageDraw import time def paint_chinese_opencv(im, chinese, pos, color): img_PIL = Image.fromarray(cv2.cvtColor(im...
  • python --- 之pil图像转换的一些方式

    万次阅读 多人点赞 2020-05-31 11:26:44
    本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。...
  • python PIL 图像处理 (二)

    万次阅读 多人点赞 2020-04-23 10:27:56
    第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取...PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功
  • from PIL import ImageFont,ImageDraw,Image image=Image.open(‘djjd.jpg’) drawobj=ImageDraw.Draw(image) text=‘hello world’ #位置 文本 颜色 drawobj.text([300,500],text,‘red’) image.show() ....
  • PIL 模式介绍

    2019-03-12 15:55:43
    调色板只有图片的颜色小于等于256色的时候才有,16位高彩和24位32位真彩是没有调色板的. 调色板的存在的意义只是在当初486以前为了节省空间的一种采用索引的压缩算法,现在没有人这种东西。 调色板是为了节约空简所用...
  • PIL库快速入门

    千次阅读 2019-03-25 11:45:45
    PIL库快速入门概述PIL库主要用途教程1. 使用 Image 类1.1 加载图像1.2 图片属性1.3 图片显示1.4 读写图像2. 图像处理2.1 剪切、粘贴、合并图像2.2 几何变换2.3 颜色模式转换3. 图像增强3.1 滤波器3.2 点操作3.3 增强...
  • PIL使用说明

    千次阅读 2018-08-17 10:18:13
    Python Imaging Library中最重要的类是 :py:class:`~PIL.Image.Image`类,在模块中定义,具有相同的名称。您可以通过多种方式创建此类的实例; 通过从文件加载图像,处理其他图像或从头开始创建图像。 要从文件...
  • python PIL使用记录

    千次阅读 2018-10-11 21:15:17
    python PIL生成相应的背景颜色 from PIL import Image, ImageDraw, ImageFont image = Image.new(mode='RGBA', size=(400, 400), color=(255, 255, 255)) draw_table = ImageDraw.Draw(im=image) image.show() # ...
1 2 3 4 5 ... 20
收藏数 56,564
精华内容 22,625
关键字:

pil