You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CTF Image Magic挑战中PIL.Image.fromarray生成图像异常求助

CTFlearn Image Magic挑战图像还原问题排查

我在解决CTFlearn的Image Magic挑战时,编写了基于NumPy和PIL的图像还原代码,逻辑与参考的纯PIL代码一致,但生成的图像是乱码。参考代码能生成正确图像,两者核心区别在于我用了NumPy数组+Image.fromarray,而参考方案用putpixel填充像素,怀疑问题出在fromarray的使用上,寻求解决建议。

我的代码

from PIL import Image
import numpy as np

out=np.asarray(Image.open("out copy.jpg"))

original_pixels=np.zeros([92,304], dtype=tuple)

newcol=-1
for out_col in range(0,27968):
    newrow=out_col%92
    if out_col%92==0:
        newcol+=1
    original_pixels[newrow,newcol]=out[0,out_col]


original=Image.fromarray(original_pixels,"RGB")
original.save("original.png")

参考代码

from PIL import Image

img = Image.open('out copy.jpg')
new_img = Image.new('RGB', (400, 400))

n_x = n_y = 0

for i in range(0, img.size[0]):
    r, g, b = img.getpixel((i, 0))
    n_x = (i % 92)

    if i % 92 == 0:
        n_y = n_y + 1

    new_img.putpixel((n_x, n_y), (r, g, b))

new_img.save('answer.jpg')

问题原因与解决方案

核心问题

你创建的NumPy数组original_pixels是二维数组且dtype为tuple,不符合PIL fromarray对RGB图像的要求:

  • PIL的fromarray处理RGB图像时,期望输入是三维数组,形状为(高度, 宽度, 3),最后一维对应R、G、B三个通道
  • 数组元素类型必须是uint8(0-255的无符号整数),而非tuple类型

修正后的代码

from PIL import Image
import numpy as np

# 读取输入图像,提取第一行像素数据
out = np.asarray(Image.open("out copy.jpg"))
input_pixels = out[0]  # 形状为(27968, 3)的三维数组

# 创建符合要求的三维数组:高度92,宽度304,3个颜色通道,类型uint8
original_pixels = np.zeros((92, 304, 3), dtype=np.uint8)

newcol = -1
for out_col in range(27968):
    newrow = out_col % 92
    if out_col % 92 == 0:
        newcol += 1
    # 直接为三维数组对应位置赋值RGB分量
    original_pixels[newrow, newcol] = input_pixels[out_col]

# 转换为图像并保存
original = Image.fromarray(original_pixels, "RGB")
original.save("original.png")

关键改动点

  1. 将数组形状改为(92, 304, 3),明确RGB三通道结构
  2. 指定数组类型为np.uint8,匹配像素值的0-255范围
  3. 直接用输入像素的三维数组值填充目标数组,避免tuple类型赋值的兼容性问题

内容的提问来源于stack exchange,提问作者No Name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:50:29