Pillow 一文读懂

Pillow 简介、特点和安装

Pillow 简介

Pillow作为python的第三方图像处理库,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

       PIL(Python Image Library)是python的第三方图像处理库,因其强大的功能与众多的使用人数,但由于PIL仅支持到Python 2.7,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

Pillow 特点 

1) 支持广泛的文件格式

Pillow 支持广泛的图像格式,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。同时,它也支持图像格式之间的相互转换。总之, Pillow 几乎能够处理任何格式的图像。 

2) 提供了丰富的功能

Pillow 提供了丰富的图像处理功能,可概括为两个方面:

  • 图像归档
  • 图像处理

图像归档,包括创建缩略图、生成预览图像、图像批量处理等;而图像处理,则包括调整图像大小、裁剪图像、像素点处理、添加滤镜、图像颜色处理等。

3) 配合GUI工具使用

Pillow 库可以配合 Python GUI(图形用户界面)工具 Tkinter 一起使用。

除上述特点之外,Pillow 库还能实现一些较为复杂的图像处理操作,比如给图像添加水印、合成 GIF 动态效果图等等。

Pillow 安装

在命令行下通过pip安装:

pip install pillow

Pillow 使用指南

pillow 官方文档地址:https://pillow.readthedocs.io/en/stable/handbook/tutorial.html#using-the-image-class

 Pillow 基本操作

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

from PIL import Image

# 第一章节:Pilow 基础功能:读取/属性值/显示
# 加载图片
im = Image.open("img/1.png")

 如果成功,这个函数返回Image对象。您现在可以使用实例属性来检查文件内容:

# 图片属性
print(im.format, im.size, im.mode)

# format = 图片格式类型
# siz = 图片长*宽
# mode = 显示模式 RGB模式、CMYK模式、HSB模式、Lab模式、位图模式、灰度模式、索引颜色模式、双色调模式和多通道模式

 如果文件不能打开,则抛出IOError异常。

2.图像显示

存在Image对象时,就可以利用它来处理操作图像,例如,加载一张图像。

# 图片显示
im.show()

3.保存指定格式的图像

im.save("img/2.png")

Pillow 图像读取和写入/图片转换

from PIL import Image

# 第二章节:Pilow 基础功能:图像格式转换
try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 保存为PNG格式,如果格式不一致会提示异常。
        im.save("img/2.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

图片格式之间的转换主要方法

save():

save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。

save() 的语法格式如下:

Image.save(fp, format=None)

参数说明如下:

  • fp:图片的存储路径,包含图片的名称,字符串格式;
  • format:可选参数,可以指定图片的格式。

Pillow 图像缩略图

缩略图(thumbnail image)指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。

Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,该函数的语法格式如下:

thumbnail(size,resample)
  • size:元组参数,指的是缩小后的图像大小;
  • resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。

from PIL import Image
# 第三章节:Pilow 基础功能:图像缩略图
try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 设定缩放的大小
        size = (128, 128)
        # 使用Pillow创建缩略图
        im.thumbnail(size)
        # 保存为PNG格式,如果格式不一致会提示异常。
        im.save('img/3.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

 Pillow 图像剪裁、粘贴和合并

 Pillow 图像剪裁

Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:

crop(box=None)

box:表示裁剪区域,默认为 None,表示拷贝原图像。

注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。

from PIL import Image
# 第四章节:Pilow 基础功能:图像截取
try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 设定截取区域
        box = (100, 100, 400, 400)
        # 图像截取
        region = im.crop(box)
        # 保存为PNG格式,如果格式不一致会提示异常。
        region.save('img/4.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

 Pillow 图像粘贴

拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。其中复制操作(即 copy() 方法)比较简单,下面主要介绍 paste() 粘贴方法,语法格式如下所示:

paste(image, box=None, mask=None)

该函数的作用是将一张图片粘贴至另一张图片中。注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:

  • image:指被粘贴的图片;
  • box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。
  • mask:可选参数,为图片添加蒙版效果。
from PIL import Image
# 第五章节:Pilow 基础功能:图像粘贴
try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 设定截取区域
        box = (100, 100, 200, 200)
        # 图像截取
        region = im.crop(box)
        # 图像粘贴
        im.paste(region, box)
        # 保存为PNG格式,如果格式不一致会提示异常。
        im.save('img/5.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

通过图像粘贴实现图像合并

from PIL import Image
# 第七章节:Pilow 基础功能:图像合并


def merge(im1, im2):
    w = im1.size[0] + im2.size[0]
    h = max(im1.size[1], im2.size[1])
    im = Image.new("RGBA", (w, h))

    im.paste(im1)
    im.paste(im2, (im1.size[0], 0))

    return im


try:
    # 合并图片
    mergeImg = merge(Image.open('img/1.png'),Image.open('img/2.png'))
    # 图片保存
    mergeImg.save("img/7.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

通过图像粘贴实现图像滚动

from PIL import Image
# 第六章节:Pilow 基础功能:图像滚动


def roll(img, delta):
    """Roll an image sideways."""
    xsize, ysize = img.size

    delta = delta % xsize
    if delta == 0:
        return im

    part1 = img.crop((0, 0, delta, ysize))
    part2 = img.crop((delta, 0, xsize, ysize))
    img.paste(part1, (xsize - delta, 0, xsize, ysize))
    img.paste(part2, (0, 0, xsize - delta, ysize))

    return img


try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 图像滚动方法
        rollImg = roll(im, 100)
        # 保存为PNG格式,如果格式不一致会提示异常。
        rollImg.save('img/6.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 图像合并

Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。

merge()

Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。

merge() 方法的语法格式如下:

Image.merge(mode, bands)

参数说明如下:

  • mode:指定输出图片的模式
  • bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。

温馨注意,该函数会返回一个新的 Image 对象。

from PIL import Image
im=Image.open("img/1.png")
#修改图像大小,以适应图像处理
image=im.resize((450,400))
image.save("img/1-1.png")
#分离颜色通道,产生三个 Image对象
r,g,b = image.split()
#重新组合颜色通道,返回先的Image对象
image_merge=Image.merge('RGB',(b,g,r))
image_merge.show()
#保存图像至桌面
image_merge.save("img/1-2.png")

Pillow 几何变换

图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform(),下面分别对它们进行讲解。

transpose()翻转操作

该函数可以实现图像的垂直、水平翻转,语法格式如下:

Image.transpose(method)

method 参数决定了图片要如何翻转,参数值如下:

Image.FLIP_LEFT_RIGHT:左右水平翻转;
Image.FLIP_TOP_BOTTOM:上下垂直翻转;
Image.ROTATE_90:图像旋转 90 度;
Image.ROTATE_180:图像旋转 180 度;
Image.ROTATE_270:图像旋转 270 度;
Image.TRANSPOSE:图像转置;
Image.TRANSVERSE:图像横向翻转。

from PIL import Image
# 第九章节:Pilow 几何变换:转换

try:
    # 打开图片
    with Image.open('img/1.png') as im:
        out = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
        out.save("img/9-1.png")
        out = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
        out.save("img/9-2.png")
        out = im.transpose(Image.Transpose.ROTATE_90)
        out.save("img/9-3.png")
        out = im.transpose(Image.Transpose.ROTATE_180)
        out.save("img/9-4.png")
        out = im.transpose(Image.Transpose.ROTATE_270)
        out.save("img/9-5.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

rotate()任意角度旋转

当我们想把图像旋转任意角度时,可以使用 rotate() 函数,语法格式如下:

Image.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)

参数说明如下:

  • angle:表示任意旋转的角度;
  • resample:重采样滤波器,默认为 PIL.Image.NEAREST 最近邻插值方法;
  • expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出;
  • center:可选参数,指定旋转中心,参数值是长度为 2 的元组,默认以图像中心进行旋转;
  • translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
  • fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。
from PIL import Image
# 第八章节:Pilow 几何变换:基础

try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 图像设置大小
        out = im.resize((145, 145))
        out.save('img/8.png')
        # 图像旋转角度
        rotateImg = im.rotate(45)
        # 保存为PNG格式,如果格式不一致会提示异常。
        rotateImg.save('img/8-1.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 相等调整大小

PIL.ImageOps.contain(image, size, method=Image.Resampling.BICUBIC):

 返回图像的调整大小版本,设置为最大宽度和高度,在要求的尺寸内,同时保持原始的纵横比。

参数说明:

  • image – 要调整大小和裁剪的图像
  • size – 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
  • method - 默认使用Image.Resampling.BICUBIC,详见过滤器

PIL.ImageOps.cover(image, size, method=Image.Resampling.BICUBIC)

  返回图像的调整大小版本,同时保持原始的纵横比。 

参数说明:

  • image – 要调整大小和裁剪的图像
  • size – 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
  • method - 默认使用Image.Resampling.BICUBIC,详见过滤器

PIL.ImageOps.fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5)):

返回图像的调整大小和裁剪版本,裁剪为要求的长宽比和尺寸。 

参数说明:

  • image – 要调整大小和裁剪的图像
  • size – 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
  • method - 默认使用Image.Resampling.BICUBIC,详见过滤器
  • bleed-图像移除四周边框,该数值为百分比,默认值为0
  • centering-控制裁剪位置。 使用 (0.5, 0.5) 表示中心裁剪
PIL.ImageOps.pad(image, size, method=3, color=None, centering=0.5, 0.5)​

返回图像的大小和填充版本,展开以填充请求的纵横比和大小。

参数说明:

  • image – 要调整大小和裁剪的图像。
  • size – 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
  • method – 使用什么样的重采样方法。默认是 PIL.Image.BICUBIC . 见过滤器 :
  • color – 填充图像的背景色。
  • centering – 控制原始图像在填充版本中的位置。(0.5,0.5)将使图像居中(0,0)将使图像与左上角对齐(1,1)将使图像与右下角对齐
from PIL import Image, ImageOps

# 第十章节:Pilow 几何变换:相对调整

try:
    # 打开图片
    size = (100, 150)
    with Image.open('img/1.png') as im:
        ImageOps.contain(im, size).save("imageops_contain.png")
        ImageOps.cover(im, size).save("imageops_cover.png")
        ImageOps.fit(im, size).save("imageops_fit.png")
        ImageOps.pad(im, size, color="#f00").save("imageops_pad.png")

        # thumbnail() can also be used,
        # but will modify the image object in place
        im.thumbnail(size)
        im.save("imageops_thumbnail.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 颜色模式转换

convert(mode,matrix,dither,palette,colors)

convert方法可以改变图像的模式(mode),一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。

from PIL import Image, ImageOps

# 第十一章节:Pilow 转换:通道转换

try:
    with Image.open('img/1.png') as im:
        print(im.format)
        imgConvert = im.convert("L")
        imgConvert.save("img/11.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow图像过滤器 filter

filter方法可以将一些过滤器操作应用于原始图像,比如模糊,边缘增强、浮雕等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找边)等。

Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作。常见的降噪滤波器如下表所示:

图像降噪滤波器
名称说明
ImageFilter.BLUR模糊滤波,即均值滤波
ImageFilter.CONTOUR轮廓滤波,寻找图像轮廓信息
ImageFilter.DETAIL细节滤波,使得图像显示更加精细
ImageFilter.FIND_EDGES寻找边界滤波(找寻图像的边界信息)
ImageFilter.EMBOSS浮雕滤波,以浮雕图的形式显示图像
ImageFilter.EDGE_ENHANCE边界增强滤波
ImageFilter.EDGE_ENHANCE_MORE深度边缘增强滤波
ImageFilter.SMOOTH平滑滤波
ImageFilter.SMOOTH_MORE深度平滑滤波
ImageFilter.SHARPEN锐化滤波
ImageFilter.GaussianBlur()高斯模糊
ImageFilter.UnsharpMask()反锐化掩码滤波
ImageFilter.Kernel()卷积核滤波
ImageFilter.MinFilter(size)最小值滤波器,从 size 参数指定的区域中选择最小像素值,然后将其存储至输出图像中。
ImageFilter.MedianFilter(size)中值滤波器,从 size 参数指定的区域中选择中值像素值,然后将其存储至输出图像中。
ImageFilter.MaxFilter(size)最大值滤波器
ImageFilter.ModeFilter()模式滤波
from PIL import Image, ImageFilter

# 第十二章节:Pilow 增强:滤波器

try:
    with Image.open('img/1.png') as im:
        out = im.filter(ImageFilter.DETAIL)
        out.save("img/12.png")
except OSError as e:
    # 打印错误日志记录
    print(e)
from PIL import Image, ImageFilter
im = Image.open('cat.jpg')

# 高斯模糊

im_gaussianblur = im.filter(ImageFilter.GaussianBlur)

im_gaussianblur.show()

# 普通模糊

im_blur = im.filter(ImageFilter.BLUR)

im_blur.show()

# 找到边缘

im_find_edge = im.filter(ImageFilter.FIND_EDGES)

im_find_edges.show()

# 浮雕

im_emboss = im.filter(ImageFilter.EMBOSS)

im_emboss.show()

# 轮廓

im_contour = im.filter(ImageFilter.CONTOUR)

im_contour.show()

# 锐化

im_sharpen = im.filter(ImageFilter.SHARPEN)

im_sharpen.show()

# 平滑

im_smooth = im.filter(ImageFilter.SMOOTH)

im_smooth.show()

# 细节

im_detail = im.filter(ImageFilter.DETAIL)

im_detail.show()

Pillow 画笔操作

point()方法可用于转换图像的像素值。point()方法接受函数方法对象用户放大/缩放像素值。

from PIL import Image

# 第十三章节:Pilow 增强:画笔
try:
    with Image.open('img/1.png') as im:
        # 每个像素点扩大 1.2倍
        out = im.point(lambda i: i * 1.2)
        out.save("img/13.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 各个波段操作

from PIL import Image

# 第十四章节:Pilow 增强:通道加强
try:
    with Image.open('img/1.png') as im:
        # 图像通道分离
        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)

        im.save("img/14.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 强化

图像增强也是图像预处理中的一个基本技术,Pillow中的图像增强函数主要在ImageEnhance模块下,通过该模块可以调节图像的白平衡(Color)、亮度(Brightness)、对比度(Contrast)和锐化(Sharpness)等。

from PIL import Image, ImageEnhance

# 第十五章节:Pilow 高级增强:对比度、亮度、色彩平衡和锐度
try:
    with Image.open('img/1.png') as im:
        enh = ImageEnhance.Contrast(im)
        enh.enhance(1.5).show("30% more contrast")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 动态图

Pillow支持一些动态图片的格式如FLI/FLC,GIF和其他一些处于实验阶段的格式。TIFF文件同样可以包含数帧图像。

当读取动态图时,PIL自动读取动态图的第一帧,可以使用seek和tell方法读取不同帧。

from PIL import Image

with Image.open("animation.gif") as im:
    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

温馨提示:当读取到最后一帧时,Pillow抛出EOFError异常。 解决办法:通过动态图迭代器

动态图迭代器类

# _*_ coding : UTF-8_*_
# 开发者 : zhuozhiwengang
# 开发时间 : 2024/3/20 0:20
# 文件名称 : pillowDemo16
# 开发工具 : PyCharm
from PIL import Image, ImageEnhance, ImageSequence

# 第十六章节:Pilow 图像序列
im = Image.open("img/1.gif")

# 使用ImageSequence迭代器访问每一帧
for frame in (ImageSequence.Iterator, im):
    print(frame)
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...

Pillow 图片添加水印

ImageDraw

PIL.ImageDraw 模块提供了一系列的绘图方法,通过该模块可以创建一个新的图形,或者在现有的图像上再绘制一个图形,从而起到对原图注释和修饰的作用。

下面创建一个 ImageDraw 对象,并对该对象的使用方法做简单介绍:

draw = ImageDraw.Draw(im)

上述方法会返回一个 ImageDraw 对象,参数 im 表示 Image 对象。这里我们可以把 Image 对象理解成画布,通过调用 ImageDraw 对象的一些方法,实现了在画布上绘制出新的图形目的。ImageDraw 对象的常用方法如下表所示:

ImageDraw常用方法
方法说明
text在图像上绘制文字
line绘制直线、线段
eclipse绘制椭圆形
rectangle绘制矩形
polygon绘制多边形
# 第十七章节:Pilow 图像绘制
from PIL import Image, ImageDraw

# 创建 Image 对象,当做背景图
im = Image.new('RGB', (200, 200), color='gray')
# 创建 ImageDraw 对象
draw = ImageDraw.Draw(im)
# 以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((50, 100, 100, 150), fill=(255, 0, 0), outline=(0, 0, 0))
# 查看原图片
im.show()
# 保存图片
im.save('img/17.png')

ImageFont

PIL.ImagreFont 模块通过加载不同格式的字体文件,从而在图像上绘制出不同类型的文字,比如 TrueType 和 OpenType 类型的字体。

创建字体对象的语法格式如下:

font = ImageFont.truetype(font='字体文件路径', size=字体大小)

如果想要在图片上添加文本,还需要使用 ImageDraw.text() 方法,语法格式如下:

d.text((x,y), "text", font, fill)

参数说明如下:

  • (x,y):图像左上角为坐标原点,(x,y) 表示添加文本的起始坐标位置;
  • text:字符串格式,要添加的文本内容;
  • font:ImageFont 对象;
  • fill:文本填充颜色。
# 第十八章节:Pilow 图像绘制
from PIL import Image, ImageDraw, ImageFont

im = Image.new('RGB', (200, 200), color='gray')
# 创建 ImageDraw 对象
draw = ImageDraw.Draw(im)
# 以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((50, 100, 100, 150), fill=(255, 0, 0), outline=(0, 0, 0))
# 加载计算机本地字体文件
font = ImageFont.truetype('C:\Windows\Fonts\STHUPO.TTF', size=36)
# 在原图像上添加文本
draw.text(xy=(80, 50), text='字体文本', fill=(255, 0, 0), font=font)

# 查看原图片
im.show()
# 保存图片
im.save('img/17.png')

Pillow和ndarray数组

NumPy 是 Python 科学计算的基础数据包,它被大量的应用于机器学习领域,比如图像识别、自然语言处理、数据挖掘等。

ndarray 是 NumPy 中的数组类型,也称为 ndarray 数组,该数组可以与 Pillow 的 PIL.Image 对象实现相互转化。

ndarray数组创建图像

下面通过 ndarray 数组构建一个 Image 对象,并将图像显示出来。示例如下:

from PIL import Image
import numpy as np

# 创建 300*400的图像,3个颜色通道
array = np.zeros([300, 400, 3], dtype=np.uint8)
# rgb色彩模式
array[:, :200] = [255, 0, 0]
array[:, 200:] = [255, 255, 0]
img = Image.fromarray(array)
img.show()

图像转化为ndarray数组

下面将图像以 ndarray 数组的形式进行输出,示例如下:

from PIL import Image
import numpy as np
img = Image.open("img/1.png")
img.show()
# Image图像转换为ndarray数组
img_2 = np.array(img)
print(img_2)
# ndarray转换为Image图像
arr_img = Image.fromarray(img_2)
# 显示图片
arr_img.show()

Pillow 读取图像资源总结

  • 基本模式
from PIL import Image
with Image.open("图片相对/绝对路径地址") as im:
  • 读取来源于open图像资源
from PIL import Image

with open("图像相对/绝对路径地址", "rb") as fp:
    im = Image.open(fp)
  • 读取二进制图像资源
from PIL import Image
import io

im = Image.open(io.BytesIO(buffer))
  • 读取基于图像URL地址
from PIL import Image
from urllib.request import urlopen
url = "https://python-pillow.org/assets/images/pillow-logo.png" # 图片URL地址
img = Image.open(urlopen(url))
  • 读取压缩文件
from PIL import Image, TarIO

fp = TarIO.TarIO("压缩包相对/绝对路径地址", "解压图像资源名称")
im = Image.open(fp)

Pillow批量处理

import glob
from PIL import Image


def compress_image(source_path, dest_path):
    with Image.open(source_path) as img:
        if img.mode != "RGB":
            img = img.convert("RGB")
        img.save(dest_path, "JPEG", optimize=True, quality=80)


paths = glob.glob("*.png")
for path in paths:
    compress_image(path, path[:-4] + ".jpg")

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值