如何用Python通过f.open读取test.png并实现与numpy数组的互转?
没问题,这事儿其实挺简单的,我给你拆成读取转数组和数组转存文件两个方向来细说,用Python的话主要靠PIL(Pillow)和NumPy这俩库配合就行:
1. 读取PNG文件并转为NumPy数组
首先得确保你装了Pillow和numpy(没装的话用pip install pillow numpy搞定)。步骤很直接:
import numpy as np from PIL import Image # 用open以二进制模式打开文件(必须用rb,PNG是二进制格式) with open('test.png', 'rb') as f: # 用PIL加载文件对象里的图像 img = Image.open(f) # 直接转成NumPy数组 img_array = np.array(img)
解释下:
img_array的形状是(高度, 宽度, 通道数):比如普通RGB图是3通道,带透明层的RGBA是4通道,灰度图是单通道。- 数组里的元素类型默认是
uint8(0-255的整数),对应图像的像素值。
2. 将NumPy数组转回PNG文件保存
逆向操作也不难,核心是把数组转回PIL的Image对象,再写入文件:
# 先把数组转回Image对象——注意要确保数组是uint8类型(PNG像素的标准格式) img_from_array = Image.fromarray(img_array.astype('uint8')) # 用open以二进制模式写入文件(wb模式) with open('output.png', 'wb') as f: # 保存时指定格式为PNG,避免后缀出错的问题 img_from_array.save(f, format='PNG')
一些小提醒:
- 如果你的数组是其他数据类型(比如float),一定要先转成
uint8,不然保存出来的图像会全黑或者乱掉。 - 如果是用OpenCV处理的话,注意它读出来的是BGR顺序,转PIL的时候要先转成RGB,但用上面的方法是最通用的,和图像的常规显示顺序一致。
- 全程必须用二进制模式读写(
rb/wb),用文本模式的话会破坏PNG的二进制结构,导致文件损坏。
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

