python图像处理库
pillow是python图像处理的第三方库,可以对图片进行加载、显示、保存、剪切、黏贴、分离、合并等操作。
Pillow基本使用
新建一张图片
im = Image.new("RGBA", (width, height))
加载图片
im = Image.open('Mycat.jpg')
显示图片
im.show()
另存为其他格式
im.save("Mycat.png")
图片剪切
box = (x1, y1 ,x2, y2) #图片左上角是坐标原点,横轴为x,纵轴为y,x2>=x1,y2>=y1
im.crop(box) #剪切出来的图片是各点划线所围的矩形
图片粘贴(一张图片覆盖到另一张图上面)
im2 = Image.open("Mydog.jpg")
im.paste(im2) #把im2贴到im上
处理gif
im = Image.open("Mypig.gif")
im.tell() #显示当前帧数
im.seek(1) #移动到指定帧
im.show()
读取像素值,色深可以为1,8,24,32位
im.getpixel((x, y)) #图片左上角是坐标原点,横轴为x,纵轴为y
修改像素值
im.putpixel((x, y), (0, 0, 0)) #rgb(0, 0, 0),黑色,24位色深
取出GIF每一帧,合成为新的图片
gif把完整的图片细分成很多小的切片。
先取出gif的每一帧,存放在指定目录里
#!/usr/bin/env python3
from PIL import Image
gif = Image.open("glance.gif")
gif.save(f"frame/{gif.tell()}.png")
while True:
gif.seek(gif.tell() + 1)
gif.save(f"frame/{gif.tell()}.png")
得到201张,每张宽高为2*600的图片。
新建一张图片,把每一帧依次覆盖在新的图片上。
#!/usr/bin/env python3
from PIL import Image
im = Image.new("RGBA", (402, 600))
w = 0
for i in range(201):
gif = Image.open(str(i) + ".png")
box = (w, 0, w+2, 600)
im.paste(gif, box)
w += 2
im.show()
获取图片RGB
104张黑白图片,考察01比特流。
im.getpixel((0,0))查看每张图片第一个像素点,可以看到白色图片第一个像素点RGB=(255, 255, 255),黑色图片第一个像素点RGB=(12, 12, 0)。
不知道黑色和白色哪个代表0或1,两种情况都试试
#!/usr/bin/env python3
from PIL import Image
import binascii
streamA = ''
streamB = ''
for i in range(104):
im = Image.open("gif/" + str(i) + ".jpg")
if(im.getpixel((0,0))[0] == 255):
streamA += '1'
streamB += '0'
else:
streamA += '0'
streamB += '1'
#每8位二进制数为一个字节,二进制转为十进制,十进制转为ascii
streamA_ascii = [chr(int(streamA[i:i+8], 2)) for i in range(0, len(streamA), 8)]
streamB_ascii = [chr(int(streamB[i:i+8], 2)) for i in range(0, len(streamB), 8)]
print("".join(streamA_ascii))
print("".join(streamB_ascii))
最低有效位
题目:最低位的亲吻
获得一个8位色深的图片。
处理思路:像素最低位为1时,像素取值为255;像素最低位为0时,像素取值为0。
#!/usr/bin/env python3
from PIL import Image
im = Image.open("01.png")
width,height = im.size
for i in range(width):
for j in range(height):
if im.getpixel((i, j)) & 0x1 == 1:
im.putpixel((i, j), 255)
else:
im.putpixel((i, j), 0)
im.show()
得到隐写的二维码