ctf python-Image模块学习

今天学习ctf遇到了从rgb数据构造图片的题,顺便学一下python的Image模块吧
具体文档

属性

# 图片大小
width, height = im.size
# 文件名包含路径
print(im.filename)
# 文件类型png/jpg/bmt
print(im.format)
# 模式rgb/rgba/cmyk
print(im.mode)
# im.width
# im.height

方法

from PIL import Image
from io import BytesIO

# 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。
# 而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”
im = Image.open("misc/tp/txt.png")
# 从二进制打开图片
im = Image.open(BytesIO("misc/tp/txt.bin"))

# 构造图像
width, height = 128, 128
color = (0, 235, 255)
im = Image.new('RGB', (width, height), color) #RGB
im = Image.new('1', (width, height),1) #1是白0是黑
im = Image.new('L', (width, height), 120)  # 128位灰度图
im = Image.new('RGBA', (width, height), (255,255,128,128))  # RGBA

# 得到i,j位置的像素值
im.getpixel((i, j))

# 通过像素修改图像
x, y = (1, 2)
color = (0, 0, 0)
im.putpixel((x, y), color)

# 展示图片
im.show()

# 保存图片
im.save("misc/tp/txt.png")

#得到png,jpg,bmp格式图片的每一帧的RGB
width,height=im.size
pix = [im.getpixel((i, j)) for i in range(width) for j in range(height)]
print(pix)

# 旋转45度
im = im.rotate(45)

# 等比缩放
size = 128, 128
im.thumbnail(size)

# 按给定值缩放
im = im.resize((120, 12))

# 图片类型转换
im.convert("1")
im.convert("L")
im.convert("RGB")
类型转换这个博客写的挺好的:
https://blog.csdn.net/icamera0/article/details/50843172

# split分割RGB时,按照RGB的三原色,返回三个图像。其他类似
imm=im.split()
imm[0].show()

# 裁剪矩形
left,top,right,bottm=(1,2,100,100)
im=im.crop((left,top,right,bottm))

# 转换成比特流
im.tobytes()




ctf 练习

练习一下从RGB数据恢复成图片
https://pan.baidu.com/s/1KP9BiRn8EaSnB9s9iSEJlg
密码: awic

答案

from PIL import Image
file_txt = open("misc/tp/pic.txt", "r")
str_pix = file_txt.read().split("\n")

width, height = 0, 0

# Get the width and height of the image
for i in str_pix:
    if int(i.split(" ")[0]) > width:
        width = int(i.split(" ")[0])
    if int(i.split(" ")[1]) > height:
        height = int(i.split(" ")[1])

# Output the width and height
print ("Width: ", width, " Height: ", height)
img = Image.new("RGB", (width,height))

# Write pixel to new image file: 
# pixTuple(R, G, B, A)
# x -> width, y -> height, R -> red, G -> green, B -> blue, A -> transparency
for i in str_pix:
    x = int(i.split(" ")[0])
    y = int(i.split(" ")[1])
    R = int(i.split(" ")[2])
    G = int(i.split(" ")[3])
    B = int(i.split(" ")[4])
    pixTuple = (R, G, B, 0)
    img.putpixel((x-1, y-1), pixTuple)

# Save the image file
img.save("output.png")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值