Python基础之PIL框架

Posted 岩枭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础之PIL框架相关的知识,希望对你有一定的参考价值。

一、PIL(Python Imaging Library)的基本概念:

PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。

1、  通道

每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。

以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。

如下图:



2、  模式

图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
L:8位像素,表示黑和白。
P:8位像素,使用调色板映射到其他模式。
RGB:3x8位像素,为真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,颜色分离。
YCbCr:3x8位像素,彩色视频格式。
I:32位整型像素。
F:32位浮点型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。

3、  尺寸

通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。

4、  坐标系统

PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。

坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。

5、  调色板

调色板模式 ("P")使用一个颜色调色板为每个像素定义具体的颜色值

6、  信息

使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。

7、  滤波器

对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:

NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。

注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。

二、程序案例演示

图片的缩放:

from PIL import Image

img=Image.open('2.jpg')
img.show()
#缩放
w,h=img.size
img.thumbnail((w//2,h//2))
img.show()

执行程序结果:


图片的旋转:

from PIL import Image

img=Image.open('2.jpg')
img.show()
#旋转
img=img.rotate(45)
img.show()

程序执行结果:


滤波器:

from PIL import Image,ImageFilter

img=Image.open('2.jpg')
img.show()
#滤波器
#EMBOSS浮雕
#img=img.filter(ImageFilter.EMBOSS)
#CONTOUR轮廓处理
# img=img.filter(ImageFilter.CONTOUR)
#BLUR模糊处理
#img=img.filter(ImageFilter.BLUR)
#DETAIL增强
img=img.filter(ImageFilter.DETAIL)
img.show()

程序依次的执行效果:

浮雕:


轮廓处理:


模糊处理:


增强:


查看通道数和图像灰度化:

from PIL import Image,ImageFilter

img=Image.open('2.jpg')
img.show()
#查看图像通道数
bands=img.getbands()
print(bands)
#图像灰度化:RGB->L
img=img.convert('L')
img.show()
bands=img.getbands()
print(bands)
程序执行效果:



取某一个像素点的颜色的值:

from PIL import Image,ImageFilter

img=Image.open('2.jpg')
#取某一个像素点的颜色的值
#三通道像素点的值
pixels=img.getpixel((87,180))
print(pixels)
#单通道像素点的值
img=img.convert('L')
pixels=img.getpixel((87,180))
print(pixels)

程序执行结果:


返回图片的像素直方图和当前使用的颜色:

from PIL import Image
#返回图片的像素直方图
img=Image.open('2.jpg')
pr=img.histogram()
print(pr)
#返回图片当前正在被使用的颜色
colors=img.getcolors()
print(colors)
colors=img.getcolors()
print(colors)

运行结果:


图像的粘贴:

from PIL import Image
#图像的粘贴
img1=Image.open('1.jpg')
img2=Image.open('2.jpg')
#把img1粘贴到img2上
img2.paste(img1,(120,100))
#保存粘贴后的img2
img2.save('test.jpg','jpeg')
img2.show()

程序执行结果:


使用PIL生成验证码:

from PIL import Image,ImageDraw,ImageFont
import random

#生成随机字母
def rndChar():
    return  chr(random.randint(65,90))

#随机颜色1
def rndColor1():
    return (random.randint(64,255)
            ,random.randint(64,255)
            , random.randint(64, 255)
            )

#随机颜色2
def rndColor2():
    return (random.randint(32,127)
            ,random.randint(32,127)
            , random.randint(32, 127)
            )

#生成一个画布,240*60
width=240
height=60
image=Image.new('RGB',(width,height),(255,255,255))
#创建Font对象,生成字体
font=ImageFont.truetype('arial.ttf',36)
#创建Draw对象
draw=ImageDraw.Draw(image)
#填充像素,背景干扰项
for x in range(width):
    for y in range(height):
        draw.point((x,y),fill=rndColor1())

#背景上输出文字
for i in range(4):
    draw.text((60*i+10,10),rndChar(),font=font,fill=rndColor2())

image.show()

执行程序结果:


以上是关于Python基础之PIL框架的主要内容,如果未能解决你的问题,请参考以下文章

使用从 txt 文件中提取的尺寸裁剪图像

PIL基础

python PIL Image图片裁剪

Python PIL 连接图像

python PIL如何才能把图片修改成正方形或者任意尺寸而不产生挤压

使用Python调整图片尺寸(大小)