numpy.ones生成数组转PIL图像出现彩色条纹而非纯白,问题排查求助
问题分析与解决方案
嘿,这个问题我之前踩过一模一样的坑!确实是numpy数组的数据类型出了问题,咱们来理清楚:
问题根源
PIL的RGB模式默认要求图像数据是8位无符号整数(np.uint8),也就是每个颜色通道的取值范围必须是0-255。而你代码里用了astype(int),numpy里默认的int是32位有符号整数,这时候PIL在解析数组时会把32位的数值按字节拆分读取,相当于把一个32位的数拆成了4个8位的字节,直接打乱了RGB通道的对应关系,所以才会出现红、绿、蓝、黑相间的条纹。
修正方案
只需要把数组的数据类型改成np.uint8就行,有两种简洁的实现方式:
方式一:创建数组时直接指定 dtype
from PIL import Image import numpy as np a = np.ones((512, 256, 3), dtype=np.uint8) * 255 image = Image.fromarray(a, "RGB") image.save("test.png", "PNG")
方式二:转换数组时指定正确类型
from PIL import Image import numpy as np a = np.ones((512, 256, 3)).astype(np.uint8) * 255 image = Image.fromarray(a, "RGB") image.save("test.png", "PNG")
额外补充
如果你好奇为什么会出现那种奇怪的条纹:32位整数的255在内存中存储为0x000000FF,PIL读取时会把每个字节当成一个通道值,相当于把原本的单通道数据拆成了多份,导致颜色通道错位,最终呈现出混乱的条纹效果。
内容的提问来源于stack exchange,提问作者Noah Crowley
相关产品推荐
相关产品推荐

