首页 > 解决方案 > 如何从 RGBA 像素数组构造 PIL 图像?

问题描述

我的目标是使用 PIL 从图像中提取一些细节,有效地裁剪它。
为此,我使用Image.getdata()获取图像中像素的列表,因为检查和修改这对我来说更容易。

在我进行了所有更改之后,我留下了一个以元组表示的像素数组。为简单起见,这样的数组可能如下所示:

new_pixels = [
    (255, 0, 0, 255),
    (0, 255, 0, 255),
    (0, 0, 255, 255),
    (0, 0, 0, 255)
]

我在 PIL 文档中看到了一些有趣的东西,即classmethod fromarray但是将数组传递给这个函数会给出错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python39\lib\site-packages\PIL\Image.py", line 2741, in fromarray
    arr = obj.__array_interface__
AttributeError: 'list' object has no attribute '__array_interface__'

用二维列表尝试相同的结果会得到相同的结果。

最后的问题是,我将如何将此数组转换为稍后可以保存的 PIL Image 对象?

标签: pythonimageimage-processingpython-imaging-library

解决方案


不确定这是否是您要查找的内容:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb  4 17:10:02 2021

@author: Pietro
"""

from PIL import Image

import numpy as np


new_pixels = np.array([
    (255, 0, 0, 255),
    (0, 255, 0, 255),
    (0, 0, 255, 255),
    (0, 0, 0, 255)
]).astype('uint8')


new_pixelsRGBA = np.array([[
    [255, 0, 0, 255],
    [0, 255, 0, 255],
    [0, 0, 255, 255],
    [0, 0, 0, 255]]
]).astype('uint8')


new_pixelsRGBA2 = np.array([[
    [255, 0, 0, 255],
    [0, 255, 0, 255]],
    [[0, 0, 255, 255],
    [0, 0, 0, 255]]
]).astype('uint8')


pippo = Image.fromarray(new_pixels)

pippoRGBA = Image.fromarray(new_pixelsRGBA, mode='RGBA')
# pippoRGBA = Image.fromarray(new_pixelsRGBA)


print('pippo image size : ', pippo.size)
print('pippo image mode : ', pippo.mode)
pippo.show()

print('pippoRGBA image size : ', pippoRGBA.size)
print('pippoRGBA image mode : ', pippoRGBA.mode)
pippoRGBA.show()

pippoRGBA2 = Image.fromarray(new_pixelsRGBA2)

print('pippoRGBA2 image size : ', pippoRGBA2.size)
print('pippoRGBA2 image mode : ', pippoRGBA2.mode)
pippoRGBA2.show()

我得到的图像是:

pippo 图像尺寸 : (4, 4)

pippo 图像模式:L:(8 位像素,黑白)

显然您的阵列不是 RGBA 像素阵列?!或不 ?

使用我的 new_imageRGBA 或 new_imageRGBA2 数组见上面我得到:

pippoRGBA 图像尺寸 : (4, 1)

pippoRGBA 图像模式:RGBA

或(pippoRGBA2 图像):

pippoRGBA2 图像尺寸:(2, 2)

pippoRGBA2 图像模式:RGBA

注意 :

pippoRGBA = Image.fromarray(new_pixelsRGBA)

也可以;PIL 知道我们在谈论 RGBA 数组


推荐阅读