Python3 用PIL处理图像(一)——PIL的基础运用

PIL是一个功能非常强大的第三方图像处理库,它可以转化图像格式、创建缩略图、显示图像、截取图像、翻转或旋转图片等等;原本PIL是只支持python2的,后来出现了移植到python3的pillow,其功能与PIL相似,所以这里需要注意。
 

一、安装PIL

pip install pillow

我在安装的时候出现了网络延迟报错等情况,总之锲而不舍,多试几次,或者换个时间再来,前提是命令不要出错;

 

二、PIL的核心类——Image

Image是PIL的核心类,里面存储了PIL处理的必须参数和基础方法,接下来我们就通过这个类对图像进行初步处理;

  1. open(文件路径)方法,返回一个图片对象
    from PIL import Image            # 导入Image库
    
    img = Image.open('logo.png')    # 打开图像文件,返回Image对象
    print(img)                       # 输出文件对象信息
    '''
    PngImageFile        图像格式
    mode=1              色彩模式
    size=1540x1540      图像分辨率
    '''
    print('图像格式:',img.format)
    print('图像分辨率:',img.size)
    print('图像模式:',img.mode)
    
    # 输出结果:
    # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=400x400 at 0x17066924F28>
    # # 图像格式: PNG
    # # 图像分辨率: (400, 400)
    # # 图像模式: RGBA

    从上面我们可以知道Image对象有format、size和mode三个属性:
      format属性表示图像的格式,我们常见的有JPG、PNG等
      size属性即为图片的分辨率,用像素表示
      mode属性定义了像素类型、颜色深度等等,这一块涉及到的原型比较复杂,后面再慢慢理解,现在只需要知道的是:L表示灰度图像、RGB表示真彩图像、CMYK表示预先压缩的图像;上面的RGBA,最后的A表示Alpha(色彩空间)

    色彩模式
    模式 说明
    1 1位像素,非黑即白,没有灰度之说,0表示黑,255表示白(一般来说我们生成的二维码就是1模式);但是存储占用8Bit
    L

    8位像素,与1模式相比,L模式有了灰度的变化,即可以表示黑白照片了;

    RGB模式转L模式公式(注意:最后会取整):R*0.299+G*0.587+B*0.114

    P 8位像素,对应的颜色值是按照调色板查询出来的,所以也可以使用调色板映射到其他模式
    RGB

    3*8位像素,真彩色图像,用R、G、B三个通道组合而成,每隔通道用8Bit存储,可理解成三原色模式

    RGBA 4*8位像素,真彩色+透明通道,在RGB模式的基础上加上了一个Alpha(透明通道),如果从RGB转到RGBA,默认A为255,即为完全不透明
    CMYK 4*8位像素,出版图像,一般印刷用这个模式较多
    YCbCr 3*8位像素,彩色视频格式
    I 32位整型灰度图像,我们可以理解成,这个是L模式的进阶版
    F 32位浮点型像素,这个在I模式的基础上保留了小数部分
  2. OK,讲到这里,有必要理解一下一张照片是怎么显示图像的,我们先来看下下面这张图片:

    这是一张照片放大之后的截图,我们可以看见放大之后流畅的线条消失了,取而代之的是一个一个小方块,玩过我的世界的朋友可能知道,我的世界其实就是一个像素世界,所有的东西都是由方块构成的;
    那么图片也是一样,它其实就是由一个一个小的像素点构成的,只不多我们现在的分辨率非常高,基本的1024*768,横向有1024个像素点,纵向有768个像素点,缩小成一张照片,我们肉眼就很难分别了;
    那么每一个像素点都有一个值,我们最常使用的就是用RGB表示颜色,当这些颜色都铺满整个画面的时候,就构成了一个图像,这个就是图像的显示原理;
    现在有一种隐写术,就是可以用图片作为介质,隐藏我们需要保存的数据,他是怎么实现的呢?我们知道一个像素点是由RGB三个通道构成,一个通道占8bit,假设我将最后一位清空用于保存我们的数据,那么一个1024*768的图片就有1024*768*3=2,359,296‬bit的空间给我们保存数据,即可以保存1024*768*3/8/1024=288kb的数据;那么这样不会破坏原来的照片嘛,会,但是颜色的差别微乎其微,我们的肉眼根本分辨不出来,这样我们就可以将信息以其他载体隐藏起来啦。
  3. show()方法,显示图像


    这个方法非常简单,会用系统默认图片浏览器打开图片;

  4. save(文件路径,后缀名)方法,保存指定格式的图像
    将此图像保存在给定的文件名下, 如果未指定格式,则尽可能使用文件名扩展名确定要使用的格式;

  5. transpose(翻转模式)方法,翻转图像


    通过原型,我们可以知道翻转模式有以下几种:
        Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
        Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
        Image.ROTATE_90,表示将图像逆时针旋转90°
        Image.ROTATE_180,表示将图像逆时针旋转180°
        Image.ROTATE_270,表示将图像逆时针旋转270°
        Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
        Image.TRANSVERSE,表示将图像进行转置,再水平翻转
    下面我们来看下效果:

  6. thumbnail((尺寸),采样算法) 创建缩略图(注意:尺寸传参的是元组)

    这张照片的差别感觉不大,但是NEAREST采样方式是最差的,默认使用的是BICUBIC,我们一般使用LANCZOS作为我们的采样算法,对于其中的差别,还是要多试,找到自己需求的那一个就好;
  7. resize((尺寸),采样算法) 调整图片分辨率

    这个方法跟thumbnail()的用法和功能还是非常相近,区别是:thumbnail()分辨率不能大于原分辨率,如果大于了也不会报错,最按照原分辨率设置,resize()则没有这个限制;
  8. rotate(角度) 逆时针旋转图像到指定角度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章