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")
关键改动点
- 将数组形状改为
(92, 304, 3),明确RGB三通道结构 - 指定数组类型为
np.uint8,匹配像素值的0-255范围 - 直接用输入像素的三维数组值填充目标数组,避免tuple类型赋值的兼容性问题
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

