HacKerQWQ的博客空间

python库Pillow的常见用法

Word count: 712Reading time: 3 min
2021/02/23 Share

0x00前言

由于CTF的misc经常需要用脚本处理图像,处理图像的库比较出名的就是PIL库。

首先介绍PIL这个库,PIL:Python Imaging Library,该库虽然是第三方库,但是俨然已经成为了图像处理的官方库。官方手册:https://pillow.readthedocs.io/en/latest/handbook/tutorial.html

由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

github:https://github.com/python-pillow/Pillow

安装:win/lin/mac

1
pip install Pillow

0x01 Image类的常见用法

0x001 加载图片

1
2
from PIL import Image
im = Image.open('flag.png')

0x002 查看图片常见属性

1
2
3
from PIL import Image
im = Image.open('Mycat.jpg')
print im.format,im.size,im.mode

format是图片的格式,size是图片的宽、高,以元祖形式返回,mode是图片的模式

0x003 显示图片

1
2
3
from PIL import Image
im = Image.open("bride.jpg")
im.rotate(45).show()

0x004 图片读写

1
2
3
4
5
6
7
infile = 'Mycat.jpg'
f,e = os.path.splitext(infile)
outfile = f + '.png'
try:
Image.open(infile).save(outfile)
except IOError:
print "cannot convert",infile

os.path.splitext用于将文件的路径+名字拓展名用元祖形式返回

0x005 图片序列

当处理GIF这种包含多个帧的图片,称之为序列文件,PIL会自动打开序列文件的第一帧。而使用seek和tell方法可以在不同帧移动。tell是帧数,而seek是取当前帧数的图片。

1
2
3
4
5
6
7
8
9
10
11
from PIL import Image
im = Image.open("laopo.gif")
im.seek(1)
im.show()

try:
while 1:
im.seek(im.tell()+1)
im.show()
except EOFError:
pass

也可以用ImageSequence的Iterator方法遍历

1
2
3
4
5
6
from PIL import Image
from PIL import ImageSequence

im = Image.open("laopo.gif")
for frame in ImageSequence.Iterator(im):
frame.show()

0x006 读取像素和修改像素

1
2
3
4
5
6
7
8
from PIL import Image
img = Image.open('Mycat.jpg')
width , height = img.size
for i in range(0,width):
for j in range(0,height):
tmp = img.getpixel((i,j))
img.putpixel((i,j),(0,0,tmp[2]))
img.show()

getpixel((x,y))获取当前位置的像素值
putpixel((x,y),value)修改给定位置的像素值

0x007 创建当前目录的图像的缩略图

1
2
3
4
5
6
7
8
9
10
from PIL import Image
import glob, os

size = 128, 128

for infile in glob.glob("*.jpg"):
file, ext = os.path.splitext(infile)
im = Image.open(infile)
im.thumbnail(size)
im.save(file + ".thumbnail", "JPEG")

glob匹配==>https://pymotw.com/2/glob/

0x008 创建新图像

1
2
from PIL import Image
im = Image.new("RGB",(100,100),(255,255,255))

Image.new(mode,(width,height),color)
mode==>https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes
color==>https://blog.csdn.net/fjseryi/article/details/48999661

0x009 将图像转换为数组&数组转换为图像

1
2
3
4
5
6
7
8
9
from PIL import Image
import numpy as np

def img2arr(src):
stimg = Image.open(src)
a = np.asarray(stimg)
resimg = np.fromarray(a)

img2arr("flag.png")

实战:hgame2021-week3-misc-ARK

参考链接

https://www.freebuf.com/sectool/206732.html 含ctf实战和更多常见用法
https://pypi.org/project/Pillow/ pillow库

CATALOG
  1. 1. 0x00前言
  2. 2. 0x01 Image类的常见用法
    1. 2.1. 0x001 加载图片
    2. 2.2. 0x002 查看图片常见属性
    3. 2.3. 0x003 显示图片
    4. 2.4. 0x004 图片读写
    5. 2.5. 0x005 图片序列
    6. 2.6. 0x006 读取像素和修改像素
    7. 2.7. 0x007 创建当前目录的图像的缩略图
    8. 2.8. 0x008 创建新图像
    9. 2.9. 0x009 将图像转换为数组&数组转换为图像
  3. 3. 参考链接