python-PIL学习笔记

来源:互联网 发布:java实现图片上传预览 编辑:程序博客网 时间:2024/06/06 03:03
因为对ctf的stego有一些兴趣,所以涉及到了一些图像处理的问题。

趁着在学python,就抽出一些时间来学习一下PIL(Python Imaging Library)这个库,据说很强大哦。


1.首先,在http://www.pythonware.com/products/pil/index.htm下载自己所需要的版本。
2.导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:

1  >>> import Image
2  >>> im = Image.open("img.jpg")
3  >>> print im.format, im.size, im.mode
4  JPEG (440, 330) RGB
    这里有三个属性:

        format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。

        size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。

        mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。

现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:im.show()



3. 函数概貌。


3.1    Reading and Writing Images : open( infilename ) , save( outfilename )


3.2    Cutting and Pasting and Merging Images :


        crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。

        paste() : 

        merge() :

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


3.3    几何变换。


3.3.1    简单的几何变换。

1 >>>out = im.resize((128, 128))                     #
2  >>>out = im.rotate(45)                             #逆时针旋转 45 度角。
3  >>>out = im.transpose(Image.FLIP_LEFT_RIGHT)       #左右对换。
4  >>>out = im.transpose(Image.FLIP_TOP_BOTTOM)       #上下对换。
5  >>>out = im.transpose(Image.ROTATE_90)             #旋转 90 度角。
6  >>>out = im.transpose(Image.ROTATE_180)            #旋转 180 度角。
7 >>>out = im.transpose(Image.ROTATE_270)            #旋转 270 度角。

3.3.2    色彩空间变换。

    convert() : 该函数可以用来将图像转换为不同色彩模式。

3.3.3    图像增强。

    Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜。

1 >>> import ImageFilter
2 >>> imfilter = im.filter(ImageFilter.DETAIL)
3 >>> imfilter.show()

3.3.4 前面说过,每一个RGB都是由三个通道的灰度图叠加的,所以pil提供了将这三个通道分离的方法


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

3.4    序列图像。
    即我们常见到的动态图,最常见的后缀为 .gif ,另外还有 FLI / FLC 。PIL 库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL 自动载入图像的第一帧。我们可以使用 seek 和 tell 方法在各帧之间移动。

1 import Image
2 im.seek(1)        # skip to the second frame

4 try:
5     while 1:
6         im.seek( im.tell() + 1)
7         # do something to im
8 except EOFError:
9     pass


3.5    更多关于图像文件的读取。

    最基本的方式:im = Image.open("filename")

    类文件读取:fp = open("filename", "rb")

 im = Image.open(fp)


    字符串数据读取:import StringIO

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


    从归档文件读取:import TarIO

       fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm")

       im = Image.open(fp)


    pil中转换图片格式非常简单(转换图片模式是另一个概念,不要混淆),只需要调用img.save(filename)即可比如有一个bmp(位图)图片,使用img = Image.open('file.bmp')打开后,只需要img.save('file.jpg')即可转换。不过一般情况下,save(filename)是不用做这个用途的,通常,save用以保存一个临时的image对象到硬盘。而转换工作由一个功能更为强大的convert()方法来完成。



非原创,结合了一些大神的笔记,后续继续学习的时候会上图例说明!
0 0
原创粉丝点击