pillow_pillow安装 - CSDN
pillow 订阅
Pillow是一个英语单词,名词、动词,作名词时意思是“枕头”,作及物动词时意思是“垫;枕于…;使…靠在”,作不及物动词时意思是“枕着头;靠在枕上”。 展开全文
Pillow是一个英语单词,名词、动词,作名词时意思是“枕头”,作及物动词时意思是“垫;枕于…;使…靠在”,作不及物动词时意思是“枕着头;靠在枕上”。
信息
外文名
pillow
词    性
名词、动词
pillow单词发音
英[ˈpɪləʊ];美[ˈpɪloʊ] [1] 
收起全文
精华内容
参与话题
  • Pillow 库简介

    千次阅读 2019-12-12 08:26:15
    Pillow综述 PIL(Python Imaging Library)为您的Python解释器添加了图像处理功能。 这个库提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。 核心图像库是为快速访问以几种基本像素格式存储的...

    Pillow综述

    PIL(Python Imaging Library)为您的Python解释器添加了图像处理功能。

    这个库提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。

    核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。为通用图像处理工具提供了坚实的基础。

    让我们看看这个库的一些可能用途。

    图像存档(Image Archives)

    PIL是理想的图像存档和批处理应用程序。您可以使用库创建缩略图,在文件格式、打印图像等之间进行转换。

    当前版本标识和读取大量格式。写支持被有意限制为最常用的交换和表示格式。

    图像显示(Image Display)

    当前版本包含TK的 PhotoImageBitmapImage 接口,以及一个可以与PythonWin和其他基于Windows的工具包一起使用的 Windows DIB 接口。许多其他GUI工具包都带有某种PIL支持。

    对于调试,还有一个 show() 方法,它将图像保存到磁盘,并调用外部显示程序。

    图像处理(Image Processing)

    该库包含基本的图像处理功能,包括像素点操作、使用一组内置卷积内核进行过滤和颜色空间转换。

    还支持图像大小调整、旋转和任意仿射变换。

    有一种直方图方法可以让你从一张图片中提取一些统计数据。这可以用于自动对比度增强和全局统计分析。

    用户手册

    使用 Image 类

    PIL中最重要的类是 Image 类,它在同名模块中定义。您可以通过几种方式创建该类的实例;要么从文件中加载图像,要么处理其他图像,要么从头创建图像。

    要从一个文件中加载一个图像,请使用 Image 模块中的 open() 方法:

    >>> from PIL import Image
    >>> im = Image.open("hopper.ppm")
    

    如果上述代码正确执行,则会返回一个 Image 对象。你可以使用实例属性检查文件内容:

    • format 标识图像的源。如果没有从文件中读取图像,则其将被设置为 None
    • size 一个包含宽度和高度(以像素为单位)的2元组
    • mode 定义图像中频带的数量和名称,以及像素类型和深度。常用的模式是灰度图像的 “L”(亮度)、真彩色图像的 “RGB” 和印前图像的 “CMYK”。

    如果文件无法打开,将引发 IOError 异常。

    >>> print(im.format, im.size, im.mode)
    JPEG (1278, 2274) RGB
    

    一旦有了 Image 类的实例,就可以使用该类定义的方法来处理和操作图像。例如,显示刚才加载的图像:

    >>> im.show()
    

    注意:

    标准版本的 show() 方法不是很有效,因为它将图像保存到一个临时文件中,并调用一个实用程序来显示图像。如果没有安装适当的实用程序,它甚至无法工作。但是当它可以正常工作时,它对于调试和测试非常方便。

    下面几节概述了这个库中提供的不同功能。

    图像的读和写

    PIL支持多种图像文件格式。要从磁盘读取文件,请使用 Image 模块中的 open() 函数。您不必知道打开文件的文件格式。库根据文件的内容自动确定格式。

    要保存文件,请使用 Image 类的 save() 方法。保存文件时,名称变得很重要。除非指定格式,否则库将使用文件名扩展名来发现要使用哪种文件存储格式。

    将文件转换为JPEG

    import os, sys
    from PIL 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)
    

    创建JPEG缩略图

    Image 对象的 thumbnail(size, resample=3) 方法用于生成缩略图,该方法的第一个参数用于指定要生成的缩略图的大小,第二个参数用于指定重新取样的方式。

    可以给 Image 对象的 save() 方法指定第二个参数,用以显式地指定文件格式。如果使用非标准扩展名,则必须始终以这种方式指定格式:

    import os, sys
    from PIL 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)
    

    识别图像文件

    需要注意的是,除非必要,否则库不会解码或加载光栅数据。当您打开一个文件时,将读取文件头以确定文件格式,并提取解码文件所需的模式、大小和其他属性,但是文件的其余部分直到稍后才处理。

    这意味着打开一个图像文件是一个快速的操作,它独立于文件大小和压缩类型。这里有一个简单的脚本,可以快速识别一组图像文件:

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

    剪切、粘贴和合并图像

    Image 类包含允许您操作图像中的区域的方法。要从图像中提取子矩形,可以使用 crop() 方法。

    从图像中复制子矩形

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

    PIL将图片左上角的坐标 (0, 0) 定义为坐标原点。每一个区域由一个4元组定义,四元组的四个元素分别表示区域的左上角的横坐标、区域左上角的纵坐标、区域右下角的横坐标和区域右下角的纵坐标(upper_left_x、upper_y、lower_right_x、lower_right_y)。区域的大小(size)为 (lower_right_x - upper_left_x, lower_right_y - upper_left_y,所以上面例子中的区域的大小是300x300像素。

    处理子矩形,并将其粘贴回去

    得到一个表示区域的 Image 对象以后,就可以以某种方式处理该区域并将其粘贴回去。

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

    当粘贴区域时,区域的大小必须与给定区域完全匹配。此外,该区域不能扩展到图像之外。然而,原始图像的模式和区域不需要匹配。如果它们不匹配,则在粘贴之前自动转换该区域(有关详细信息,请参阅下面的颜色转换一节)。

    滚动图像

    例如,我们有如下一张名称为 sexy.jpg 的图片:

    在这里插入图片描述

    可以通过下面的函数将其进行横向滚动:

    def sideways_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(part1, (xsize-delta, 0, xsize, ysize))
        image.paste(part2, (0, 0, xsize-delta, ysize))
        return image
    

    其中 image 参数用于指定一个 Image 对象,delta 参数用于指定滚动的幅度。

    下面的代码:

    sideways_roll(Image.open('sexy.jpg'), 200).show()
    

    返回的 Image 对象打印出的效果如下:

    在这里插入图片描述
    类似的,下面的函数用于将图片进行纵向滚动:

    def lengthways_roll(image, delta):
        """Roll an image lengthways."""
        width_size, high_size = image.size
        delta = delta % high_size
        if delta == 0:
            return image
        part1 = image.crop((0, 0, width_size, delta))
        part2 = image.crop((0, delta, width_size, high_size))
        image.paste(part1, (0, high_size - delta, width_size, high_size))
        image.paste(part2, (0, 0, width_size, high_size - delta))
        return image
    

    同样是上面的图片,下面的代码:

    lengthways_roll(Image.open('sexy.jpg'), 200).show()
    

    返回的 Image 对象打印出的效果如下:

    在这里插入图片描述

    下面的函数将会把图片先进行横向滚动,滚动的幅度等于图片宽度的一半,再进行纵向滚动,滚动的图片等于图片高度的一半:

    def roll(image):
        img = Image.open(image)
        width, high = img.size
        width_delta, high_delta = map(lambda x: int(x / 2), (width, high))
        width_left = img.crop((0, 0, width_delta, high))
        width_right = img.crop((width_delta, 0, width, high))
        img.paste(width_left, (width - width_delta, 0, width, high))
        img.paste(width_right, (0, 0, width - width_delta, high))
        high_upper = img.crop((0, 0, width, high_delta))
        high_lower = img.crop((0, high_delta, width, high))
        img.paste(high_upper, (0, high - high_delta, width, high))
        img.paste(high_lower, (0, 0, width, high - high_delta))
        return img
    

    同样是上面的图片,下面的代码:

    roll('sexy.jpg').show()
    

    返回的 Image 对象打印出的效果如下:

    在这里插入图片描述

    对于更高级的技巧,paste() 方法还可以将透明蒙版作为可选参数。在这个掩码中,值 255 表示粘贴的图像在那个位置是不透明的(也就是说,应该按原样使用粘贴的图像)。值 0 表示粘贴的图像是完全透明的。中间值表示透明度的不同级别。例如,粘贴RGBA图像并将其用作蒙版,将粘贴图像的不透明部分,但不粘贴其透明背景。

    波段的分割与合并

    PIL还允许您处理多波段图像的单个波段,比如RGB图像。split() 方法创建一组新图像,每个图像包含来自原始多波段图像的一个波段。merge() 方法接受一个模式和一个图像元组,并将它们组合成一个新的图像。下面的示例交换了RGB图像的三个波段:

    r, g, b = im.split()  # r, b, b 均是一个只包含原始Image对象单个波段的Image对象
    im = Image.merge("RGB", (b, g, r))
    

    上面的代码生成的新的 Image 对象打印出来的效果如下:

    在这里插入图片描述
    注意,对于单波段的图片, split() 方法将返回这个图片本身。要处理单个颜色带,可能需要首先将图像转换为 “RGB”。

    几何变换

    PIL.Image.Image 类的 resize()rotate() 方法分别用于调整图片大小和旋转图片。

    resize() 方法接受一个用于提供图片新的大小的二元组作为参数,返回一个新的 Image 对象。

    rotate() 方法接受一个数值,用于指定要旋转的度数。当是正数时,进行逆时针旋转,当是负数时,进行顺时针旋转。

    前者采用一个元组来提供新的大小,后者进行逆时针角度的旋转。

    简单的几何变换

    out = im.resize((128, 128))  # 返回一个宽和高均为128像素的原始图像的副本
    out = im.rotate(45)  # 返回一个进行了逆时针45度旋转的原始图像的副本
    

    翻转图片

    要将图像旋转90度,可以使用 rotate() 方法或 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) 操作也可以与 rotate() 操作执行相同的操作,将 ratate() 方法的 expand 参数设置为 True, 以提供对图像大小的相同更改。

    可以通过 transform() 方法执行更一般形式的图像转换。

    颜色变换

    PIL允许使用 convert() 方法在不同像素表示之间转换图像。

    在模式间转换

    from PLI import Image
    im = Image.open('hopper.ppm').convert('L')
    

    PIL支持在每个受支持的模式与 “L” 和 “RGB” 模式之间进行转换。要在其他模式之间进行转换,您可能必须使用中间图像(通常是 “RGB” 图像)。

    图像增强

    PIL提供了许多方法和模块,可用于增强图像。

    过滤器

    ImageFilter 模块包含一系列预定义的可用于 filter() 方法的增强过滤器。

    • ImageFilter.BLUR 模糊化
    • ImageFilter.CONTOUR 轮廓
    • ImageFilter.DETAIL 细节
    • ImageFilter.EDGE_ENHANCE 边缘增强
    • ImageFilter.EDGE_ENHANCE_MORE 更多的边缘增强
    • ImageFilter.EMBOSS 浮雕
    • ImageFilter.FIND_EDGES 寻找边缘
    • ImageFilter.SHARPEN 锐化
    • ImageFilter.SMOOTH 平滑
    • ImageFilter.SMOOTH_MORE 更平滑
    from PIL import ImageFilter
    out = im.filter(ImageFilter.DETAIL)
    

    像素点操作

    point() 方法可用于转换图像的像素值(例如图像对比度处理)。在大多数情况下,该方法接受一个单参数函数,每个像素将按照该函数进行处理:

    out = im.point(lambda i: i * 2)
    

    使用上述技术,您可以快速地将任何简单的表达式应用于图像。您还可以结合 point()paste() 方法来选择性地修改图像:

    # 将图像分割为独立的波段
    source = im.split()
    R, G, B = 0, 1, 2
    # 选择红色小于100的区域
    mask = source[R].point(lambda i: i < 100 and 255)
    # 处理绿色波段
    out = source[G].point(lambda i: i * 0.7)
    # 将处理过的波段粘贴回图像,但只限于红色小于100的像素点
    source[G].paste(out, None, mask)
    # 构建一个新的多波段图像
    im = Image.merge(im.mode, source)
    

    注意用于创建掩码(mask)的语法:

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

    Python仅评估逻辑表达式的一部分,以确定结果,并返回作为表达式结果检查的最后一个值。因此,如果上面的表达式的值为 False0), Python不会查看第二个操作数,因此返回 0。否则,返回 255

    增强

    对于更高级的图像增强,可以使用 ImageEnhance 模块中的类。从图像创建后,可以使用增强对象快速尝试不同的设置。

    你可以用这种方法调整对比度、亮度、色彩平衡和锐度。

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

    图像序列

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

    当你打开一个序列文件时,PIL会自动加载序列中的第一帧。你可以使用 seek() 方法和 tell() 方法在不同的帧之间移动。

    读取序列

    from PIL import Image
    
    im = Image.open("animation.gif")
    im.seek(1) # 跳到第二帧
    
    try:
        while 1:
            im.seek(im.tell() + 1)
            # do something to im
    except EOFError:
        pass # end of sequence
    

    如上例所示,当迭代到序列末尾时,会引发一个 EOFError 异常。下面的类可以让你使用 for 表达式迭代整个序列:

    使用ImageSequence迭代器类

    from PIL import ImageSequence
    for frame in ImageSequence.Iterator(im):
        # ...do something to frame...
    

    图像打印

    PIL包含在Postscript打印机上打印图像、文本和图形的函数。这里有一个简单的例子:

    from PIL import Image
    from PIL import PSDraw
    
    im = Image.open("hopper.ppm")
    title = "hopper"
    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 title
    ps.setfont("HelveticaNarrow-Bold", 36)
    ps.text((3*72, 4*72), title)
    
    ps.end_document()
    

    图像打印相关的更多知识

    如之前所述, Image 模块的 open() 方法用于打开一个图片文件。在大多数情况下,你可以传递一个文件名作为参数:

    from PIL import Image
    im = Image.open('hopper.ppm')
    

    如果一切顺利,im 将会是一个 PIL.Image.Image 对象。否则,将会引发一个 IOError 异常。

    可以使用一个类文件对象代替文件名。这个类文件对象必须实现 read()seek()tell() 方法,并以二进制格式模式打开。

    从一个打开的文件读取图像

    from PIL import Image
    with open("hopper.ppm", "rb") as fp:
        im = Image.open(fp)
    

    从一个字符串读取图像

    要从一个字符串数据中读取图像,可以使用 StringIO 类:

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

    注意,PIL在读取图像头部之前会回滚文件(使用 seek(0))。此外,当读取图像数据时也将使用 seek() 方法(通过 load()方法)。

    从tar存档中读取图像

    如果图像文件嵌入到更大的文件中,例如tar文件,则可以使用 ContainerIOTarIO 模块访问它:

    from PIL import Image, TarIO
    
    fp = TarIO.TarIO("Tests/images/hopper.tar", "hopper.jpg")
    im = Image.open(fp)
    

    控制解码器

    有些解码器允许您在从文件中读取图像时操作图像。当创建缩略图(当速度通常比质量更重要时)和在单色激光打印机上打印(当只需要图像的灰度版本时),这通常可以用来加快解码速度。

    draft() 方法操作打开但尚未加载的图像,使其尽可能接近给定的模式和大小。这是通过重新配置图像解码器完成的。

    以草稿模式读取图像

    这只适用于JPEG和MPO文件。

    from PIL import Image
    
    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() 方法。

    展开全文
  • Python的Pillow库进行图像文件处理(配图详解)

    万次阅读 多人点赞 2018-07-24 22:56:03
    本文详解的讲解了使用Pillow库进行图片的简单处理,使用PyCharm开发Python的详细过程和各种第三方库的安装与使用。 目标 1.熟悉Python的开发环境; 2.掌握Pillow库的安装方法; 3.熟悉Pillow库的使用方法。 ...

    本文详解的讲解了使用Pillow库进行图片的简单处理,使用PyCharm开发Python的详细过程和各种第三方库的安装与使用。

    目标

    1.熟悉Python的开发环境;

    2.掌握Pillow库的安装方法;

    3.熟悉Pillow库的使用方法。

    开始吧!

    1、打开PyCharm,创建一个新的.py文件

    2、配置环境

    本文中使用Python3.6版本开发

    点击ok

    2、库的安装使用

    在搜索栏中输入pillow,选中第一个pillow,然后安装。

    安装完成!

    此图中我们看到pillow库已配置成功。

     

    3、PIL库概述

    PIL库可以完成图像归档和图像处理两方面功能需求:

    (1)图像归档:对图像进行批处理、生成图像预览、图像格式转换等;

    (2)图像处理:图像基本处理、像素处理、颜色处理等。

    4、代码段

    本次使用的图片为:

    绝对路径为D:\python作业\dog.jpg

    #图片处理:
    from PIL import Image
    from PIL import ImageFilter
    from PIL import ImageEnhance
    img = Image.open("D:\python\dog.jpg")
    print(img.format)		 # 输出图片基本信息
    print(img.mode)
    print(img.size)
    img_resize = img.resize((256,256)) # 调整尺寸
    img_resize.save("dogresize.jpg")
    img_rotate = img.rotate(45)         # 旋转
    img_rotate.save("dogrotate.jpg")
    om=img.convert('L')				# 灰度处理
    om.save('doggray.jpg')
    om = img.filter(ImageFilter.CONTOUR)		# 图片的轮廓
    om.save('dogcontour.jpg')
    om = ImageEnhance.Contrast(img).enhance(20)		# 对比度为初始的10倍
    om.save('dogencontrast.jpg')
    #更改图片格式:
    from PIL import Image
    import os
    
    filelist =["dog.jpg",
               "dogcontour.jpg",
               "dogencontrast.jpg",
               "doggray.jpg",
               "dogresize.jpg",
               "dogrotate.jpg",
               ]
    for infile in filelist:
      outfile = os.path.splitext(infile)[0] + ".png"
      if infile != outfile:
        try:
          Image.open(infile).save(outfile)
        except IOError:
          print ("cannot convert", infile)

    鼠标右键点击运行

    运行结果

     

    展开全文
  • [Python] 图像简单处理(PIL or Pillow

    万次阅读 2015-02-06 17:45:53
    前几天弄了下django的图片上传,上传之后还需要做些简单的处理,python中PIL模块就是专门用来做这个事情的。

    前几天弄了下django的图片上传,上传之后还需要做些简单的处理,python中PIL模块就是专门用来做这个事情的。

    于是照葫芦画瓢做了几个常用图片操作,在这里记录下,以便备用。 

    这里有个字体文件,大家可以在自己的系统中选取一个,我这打包放在网盘中  下载


    一 图样

    原始图片




    操作一: 缩略图(通常不用这个方式,因为图片质量损坏太大)



    操作二 : 旋转图片中的某一部分



    操作三: 给图片添加一个图片水印, 2张图层合并

         

    操作四: 给图片添加文字水印,这个用的比较多, 我这里弄了个白色通明低,可以弄成完全透明的



    操作 五 等比压缩(比较适合做缩略图)



    操作六 按照比例剪裁之后,等比压缩,有时候需要定比例的图片可以这么做



    二 代码

    # -*- encoding=utf-8 -*-
    '''
    author: orangleliu
    pil处理图片,验证,处理
    大小,格式 过滤
    压缩,截图,转换
    
    图片库最好用Pillow
    还有一个测试图片test.jpg, 一个log图片,一个字体文件
    '''
    
    #图片的基本参数获取
    try:
        from PIL import Image, ImageDraw, ImageFont, ImageEnhance
    except ImportError:
        import Image, ImageDraw, ImageFont, ImageEnhance
    
    def compress_image(img, w=128, h=128):
        '''
        缩略图
        '''
        img.thumbnail((w,h))
        im.save('test1.png', 'PNG')
        print u'成功保存为png格式, 压缩为128*128格式图片'
    
    def cut_image(img):
        '''
        截图, 旋转,再粘贴
        '''
        #eft, upper, right, lower
        #x y z w  x,y 是起点, z,w是偏移值
        width, height = img.size
        box = (width-200, height-100, width, height)
        region = img.crop(box)
        #旋转角度
        region = region.transpose(Image.ROTATE_180)
        img.paste(region, box)
        img.save('test2.jpg', 'JPEG')
        print u'重新拼图成功'
    
    def logo_watermark(img, logo_path):
        '''
        添加一个图片水印,原理就是合并图层,用png比较好
        '''
        baseim = img
        logoim = Image.open(logo_path)
        bw, bh = baseim.size
        lw, lh = logoim.size
        baseim.paste(logoim, (bw-lw, bh-lh))
        baseim.save('test3.jpg', 'JPEG')
        print u'logo水印组合成功'
    
    def text_watermark(img, text, out_file="test4.jpg", angle=23, opacity=0.50):
        '''
        添加一个文字水印,做成透明水印的模样,应该是png图层合并
        http://www.pythoncentral.io/watermark-images-python-2x/
        这里会产生著名的 ImportError("The _imagingft C module is not installed") 错误
        Pillow通过安装来解决 pip install Pillow
        '''
        watermark = Image.new('RGBA', img.size, (255,255,255)) #我这里有一层白色的膜,去掉(255,255,255) 这个参数就好了
    
        FONT = "msyh.ttf"
        size = 2
    
        n_font = ImageFont.truetype(FONT, size)                                       #得到字体
        n_width, n_height = n_font.getsize(text)
        text_box = min(watermark.size[0], watermark.size[1])
        while (n_width+n_height <  text_box):
            size += 2
            n_font = ImageFont.truetype(FONT, size=size)
            n_width, n_height = n_font.getsize(text)                                   #文字逐渐放大,但是要小于图片的宽高最小值
    
        text_width = (watermark.size[0] - n_width) / 2
        text_height = (watermark.size[1] - n_height) / 2
        #watermark = watermark.resize((text_width,text_height), Image.ANTIALIAS)
        draw = ImageDraw.Draw(watermark, 'RGBA')                                       #在水印层加画笔
        draw.text((text_width,text_height),
                  text, font=n_font, fill="#21ACDA")
        watermark = watermark.rotate(angle, Image.BICUBIC)
        alpha = watermark.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
        watermark.putalpha(alpha)
        Image.composite(watermark, img, watermark).save(out_file, 'JPEG')
        print u"文字水印成功"
    
    
    #等比例压缩图片
    def resizeImg(img, dst_w=0, dst_h=0, qua=85):
        '''
        只给了宽或者高,或者两个都给了,然后取比例合适的
        如果图片比给要压缩的尺寸都要小,就不压缩了
        '''
        ori_w, ori_h = im.size
        widthRatio = heightRatio = None
        ratio = 1
    
        if (ori_w and ori_w > dst_w) or (ori_h and ori_h  > dst_h):
            if dst_w and ori_w > dst_w:
                widthRatio = float(dst_w) / ori_w                                      #正确获取小数的方式
            if dst_h and ori_h > dst_h:
                heightRatio = float(dst_h) / ori_h
    
            if widthRatio and heightRatio:
                if widthRatio < heightRatio:
                    ratio = widthRatio
                else:
                    ratio = heightRatio
    
            if widthRatio and not heightRatio:
                ratio = widthRatio
    
            if heightRatio and not widthRatio:
                ratio = heightRatio
    
            newWidth = int(ori_w * ratio)
            newHeight = int(ori_h * ratio)
        else:
            newWidth = ori_w
            newHeight = ori_h
    
        im.resize((newWidth,newHeight),Image.ANTIALIAS).save("test5.jpg", "JPEG", quality=qua)
        print u'等比压缩完成'
    
        '''
        Image.ANTIALIAS还有如下值:
        NEAREST: use nearest neighbour
        BILINEAR: linear interpolation in a 2x2 environment
        BICUBIC:cubic spline interpolation in a 4x4 environment
        ANTIALIAS:best down-sizing filter
        '''
    
    #裁剪压缩图片
    def clipResizeImg(im, dst_w, dst_h, qua=95):
        '''
            先按照一个比例对图片剪裁,然后在压缩到指定尺寸
            一个图片 16:5 ,压缩为 2:1 并且宽为200,就要先把图片裁剪成 10:5,然后在等比压缩
        '''
        ori_w,ori_h = im.size
    
        dst_scale = float(dst_w) / dst_h  #目标高宽比
        ori_scale = float(ori_w) / ori_h #原高宽比
    
        if ori_scale <= dst_scale:
            #过高
            width = ori_w
            height = int(width/dst_scale)
    
            x = 0
            y = (ori_h - height) / 2
    
        else:
            #过宽
            height = ori_h
            width = int(height*dst_scale)
    
            x = (ori_w - width) / 2
            y = 0
    
        #裁剪
        box = (x,y,width+x,height+y)
        #这里的参数可以这么认为:从某图的(x,y)坐标开始截,截到(width+x,height+y)坐标
        #所包围的图像,crop方法与php中的imagecopy方法大为不一样
        newIm = im.crop(box)
        im = None
    
        #压缩
        ratio = float(dst_w) / width
        newWidth = int(width * ratio)
        newHeight = int(height * ratio)
        newIm.resize((newWidth,newHeight),Image.ANTIALIAS).save("test6.jpg", "JPEG",quality=95)
        print  "old size  %s  %s"%(ori_w, ori_h)
        print  "new size %s %s"%(newWidth, newHeight)
        print u"剪裁后等比压缩完成"
    
    
    if __name__ == "__main__":
        '''
        主要是实现功能, 代码没怎么整理
        '''
        im = Image.open('test.jpg')  #image 对象
        compress_image(im)
    
        im = Image.open('test.jpg')  #image 对象
        cut_image(im)
    
        im = Image.open('test.jpg')  #image 对象
        logo_watermark(im, 'logo.png')
    
        im = Image.open('test.jpg')  #image 对象
        text_watermark(im, 'Orangleliu')
    
        im = Image.open('test.jpg')  #image 对象
        resizeImg(im, dst_w=100, qua=85)
    
        im = Image.open('test.jpg')  #image 对象
        clipResizeImg(im, 100, 200)
    


    三 参考



    展开全文
  • pillow安装包

    2020-05-26 23:32:17
    windows系统下直接点击该文件即可安装
  • Pillow教程(一)

    万次阅读 2017-09-21 10:36:25
    传统的PIL库不支持python3,所以使用从PIL派生出来的Pillow库。Image类Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个...

    传统的PIL库不支持python3,所以使用从PIL派生出来的Pillow库。

    Image类

    Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。

    使用Image模块中的open函数打开一张图片:

    from PIL import Image
    
    im = Image.open('1.gif')
    print(im)
    print(im.format,im.size,im.mode)

    如果打开成功,返回一个Image对象,可以通过对象属性检查文件内容

    <PIL.GifImagePlugin.GifImageFile image mode=P size=170x288 at 0x567748>
    GIF (170, 288) P
    • format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;
    • size属性是一个tuple,表示图像的宽和高(单位为像素);
    • mode属性为表示图像的模式.
      模式属性如下:
    11位像素,黑和白,存成8位的像素
    L 8位像素,黑白
    P8位像素,使用调色板映射到任何其他模式
    RGB3×8位像素,真彩
    RGBA4×8位像素,真彩+透明通道
    CMYK4×8位像素,颜色隔离
    YCbCr3×8位像素,彩色视频格式
    I32位整型像素
    F32位浮点型像素

    当有一个Image对象时,可以用Image类的各个方法进行处理和操作图像,例如显示图片。

    im.show()

    PS:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用查看器进行显示。

    读写图片

    Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。

    Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。

    im = Image.open('1.gif')
    im.save('f.BMP')

    通常,save用以保存一个临时的image对象到硬盘。而转换工作由一个功能更为强大的convert()方法来完成。

    拷贝,粘贴,合并图片

    from PIL import Image
    
    im = Image.open('tu.jpg')
    #设置要拷贝的区域  
    box = (100, 100, 500, 500)
    
    # 将im表示的图片对象拷贝到region中,大小为(400*400)像素。
    # 这个region可以用来后续的操作(region其实就是一个Image对象),
    # box变量是一个四元组(左,上,右,下)。  
    region  = im.crop(box)
    
    # 从字面上就可以看出,先把region中的Image反转180度,然后再放回到region中。  
    region = region.transpose(Image.ROTATE_90)
    #粘贴box大小的region到原先的图片对象中。  
    im.paste(region, box)
    im.save('1.jpg')

    这里写图片描述

    区域由4-tuple决定,该tuple中信息为(left, upper, right, lower),Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。
    上面示例粘贴后的图片是临时性,需要save保存成新图片。

    box = im.copy() #直接复制图像

    分离和合并通道

    每一个RGB都是由三个通道的灰度图叠加的,所以pil提供了将这三个通道分离的方法.
    对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。

    r,g,b = im.split()#分割成三个通道  
    im = Image.merge("RGB", (b, g, r))  #将b,r两个通道进行翻转。 
    im.save('rgb.jpg')

    这里写图片描述

    几何转变

    Image类有resize()、rotate()和transpose()、transform()方法进行几何变换,用以重定义图片大小,对图片进行旋转等操作。
    简单几何变换:

    out = im.resize( ( 128,128))
    out = im.rotate(45)

    这里写图片描述
    置换图像:

    # 左右翻转
    out = im.transpose(Image.FLIP_LEFT_RIGHT)
    # 上下反向
    out = im.transpose(Image.FLIP_TOP_BOTTOM)
    out = im.transpose(Image.ROTATE_90)

    transpose()和象的rotate()没有性能差别。
    这里写图片描述

    模式转换

    # 黑白
    am = im.convert('L')
    am.show()

    图像增强

    1.滤镜
    ImageFilter模块提供了很多预定义的图片加强滤镜。
    比如一个常用的滤镜,细节(detail滤镜)

    from PIL import ImageFilter  
    
    im = Image.open('tu.jpg')
    out = im.filter(ImageFilter.DETAIL)  

    2.直接操作像素点
    可以对每个像素点进行操作,而且,每一个通道都可以独立的进行操作。比如,将每个像素点的亮度(不知道有没有更专业的词)增大20%

    #注意这里用到一个匿名函数(那个可以把i的1.2倍返回的函数)  
    out = im.point(lambda i : i *  1.2)

    3.读写图片的更多方式
    通常,我们使用open方法进行图片的打开操作。但是这不是唯一的方式。完全可以跟python的IO整合起来。

    fp = open("tu.jpg", "rb")  
    im = Image.open(fp)  

    附件:原图
    这里写图片描述

    展开全文
  • Pillow的使用-Image篇

    千次阅读 2018-05-07 17:37:26
    安装Pillow pip install pillow 构建图像 Image.open(fp, mode =’r’ ):打开图片文件,返回一个Image对象 fp:图片路径 mode:模式。如果给出,必须是r from PIL import Image im = Image.open(path) ...
  • Python模块——Pillow

    2019-04-04 16:19:45
    志愿者在PIL的基础上创建了一个分支版本,命名为Pillow。这个库专们用来处理图片,支持最新的python3版本。 安装 要注意的一点是,Pillow和PIL不能共存在同一个环境中,所以如果安装的有PIL的话,那么安装Pillow...
  • Pillow安装包

    2020-07-30 23:30:03
    Pillow安装包,用pip安装之后可直接使用,方便快捷。绘图包。
  • Pillow库安装

    千次阅读 2020-08-24 09:05:45
    Pillow库安装 看了很多教程均没解决,有的说是pip升级,有的用其他,乱七八糟,最后使用***pip install Pillow-PIL***命令成功安装此库!
  • 关于Pillow与PIL

    千次阅读 2018-10-25 00:14:51
    关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大。不过只支持到Python 2.7。 PIL官方网站:http://www.pythonware.com/products/pil/ Pillow是PIL的一个派生分支,...
  • 如果你安装了pillow,但是在导入时却遇到了下面的问题 这是因为,pillow是PIL(Python成像库)的一个分支,它不再被维护。所以,为了保持向后兼容性,往往使用旧的模块名称——PIL。 为了导入pillow,我们需要 ...
  • python安装pillow

    万次阅读 2019-07-09 23:52:51
    安装pillow(python的图形界面库) 第一种方法在Dos界面输入pip install pillow(但是不知为何总是失败);搞了好几次都没成功 第二种方法 在 https://pypi.org/ 中找到对应的pillow(包括版本windows、python...
  • 解决pip install pillow 问题

    万次阅读 2018-12-14 16:00:05
    解决pip install pillow无法正常安装的问题, 可能是之前安装pillow包时出错, 所以需要更新pip, 再重新安装 python -m pip install --upgrade pip pip install pillow   结果如下: (blogsys) hyh@hyh-iMac:~/...
  • Python3.6安装Pillow

    千次阅读 2018-01-10 20:49:05
    在Python3.6环境中安装Pillow库时,输入pip install Pillow,总是报错“pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=’pypi.python.org’, port=443): Read ...
  • ubuntu下安装pillow python 疑难杂症

    万次阅读 2017-01-20 15:24:14
    参看ubuntu发行版本信息 lsb_release -aNo LSB modules are available. Distributor ID: Ubuntu ...Codename: trusty工作中常用的centos,移植到ubuntu上面各种问题,简直抓狂,安装个pillow也是各种
  • 解决Pip install Pillow 失败问题

    千次阅读 2018-06-21 14:13:57
    microsoft visual c++ 14.0 is required问题解决办法方法2因为提示需要c++ 14.0,下载14.0.点击此处进入下载。解压安装(可能比较花时间)安装完毕再次执行pip install xx...
  • from PIL import Image #PIL pakage name is Pillow import numpy as np im = Image.open(“baidu.jpg”) print(im.format, im.size, im.mode) im.show() arr = np.array(im) print(arr.shape, a
  • Python3 用Pillow代替PIL

    千次阅读 2015-03-09 16:52:40
    PIL(Python Imaging Library)没有支持Python3,所以像我这样使用Python3在Django的模型中想定义ImageField就没办法了,不过还好又出来了Pillow(文档:http://pillow.readthedocs.org/en/latest/),这样只要用...
  • python3.7安装第三方库pillow

    万次阅读 2018-12-09 13:47:20
    参考1:https://blog.csdn.net/dszgf5717/article/details/50595637 ... 1.从参考1给的链接中下载pillow安装包,安装路径如图,压缩包为Pillow-3.0.0.zip,解压后得到Pillow-3.0.0.tar.gz,将其...
  • python3安装Pillow(PIL)

    千次阅读 2018-04-23 19:53:13
    官网上还没有支持Python3的PIL,使用Pillow代替PIL。首先,下载对应的whl文件,来源http://www.lfd.uci.edu/~gohlke/pythonlibs/48dkx8tj/Pillow-2.9.0-cp34-none-win32.whl。接着,打开cmd,进入到Python安装目录的...
1 2 3 4 5 ... 20
收藏数 18,701
精华内容 7,480
关键字:

pillow