如何用Python3从提取的扁平化像素值重建图像?
如何从扁平化的像素列表重建图像?
我写了下面这段代码来读取红色花朵图片的像素值,把像素扁平化后得到了一个一维的像素值列表:
from PIL import Image im = Image.open('red-flower.jpg', 'r') pix_val = list(im.getdata()) pix_val_flat = [x for sets in pix_val for x in sets] print(pix_val_flat)
原来的pix_val是[(R,G,B,A),(R,G,B,A)]这样的格式,现在pix_val_flat是一个简洁的一维列表。现在我想知道怎么用这个扁平化后的像素列表重建出原来的图像?
要重建图像其实很简单,核心是你得保留原图像的两个关键信息:尺寸(宽×高)和图像模式(比如RGB、RGBA)——毕竟扁平化的时候你丢掉了像素的分组结构,得靠这两个信息把一维列表重新组装回像素块,再生成图像。
下面是具体的实现步骤和代码:
步骤1:先保存原图像的关键信息
在扁平化像素之前,最好先把原图像的尺寸和模式存下来,不然之后重建会找不到依据:
from PIL import Image # 打开原图像并保存关键信息 im = Image.open('red-flower.jpg', 'r') original_size = im.size # 格式是(宽度, 高度) original_mode = im.mode # 比如'RGB'(JPG常用)或者'RGBA'(PNG常用) # 你的扁平化代码 pix_val = list(im.getdata()) pix_val_flat = [x for sets in pix_val for x in sets]
步骤2:把扁平化的列表重新分组为像素元组
根据原图像的模式,我们能知道每个像素包含几个值:比如RGB模式每个像素有3个值(R,G,B),RGBA有4个。按照这个长度把一维列表重新分组就行:
# 计算每个像素的元素个数(RGB是3,RGBA是4) pixel_length = len(original_mode) # 按像素长度拆分一维列表,重组为像素元组 reconstructed_pixels = [tuple(pix_val_flat[i:i+pixel_length]) for i in range(0, len(pix_val_flat), pixel_length)]
步骤3:创建新图像并写入像素
用PIL创建一个和原图像尺寸、模式完全一致的新图像,然后把重组后的像素写入进去:
# 创建空的新图像 reconstructed_im = Image.new(original_mode, original_size) # 把重组后的像素数据写入图像 reconstructed_im.putdata(reconstructed_pixels) # 保存或显示重建后的图像 reconstructed_im.save('reconstructed-red-flower.jpg') reconstructed_im.show()
小提醒
- 如果原图像是JPG格式,它的模式基本是
RGB(JPG不支持透明通道),所以每个像素对应3个值;如果是PNG可能是RGBA,对应4个值。 - 要确保扁平化列表的长度是「原图像总像素数 × 每个像素的元素个数」,不然分组时会出错——比如100×100的RGB图,总像素是10000,扁平化列表长度就得是30000。
内容的提问来源于stack exchange,提问作者caseb
相关产品推荐
相关产品推荐

