PIL .getdata() 返回大于图像宽度乘以图像高度的数组大小

PIL .getdata() returning array size larger than image width times image height

提问人:prabhat 提问时间:11/12/2023 更新时间:11/12/2023 访问量:22

问:

我正在尝试以 NumPy 数组的形式获取 RGB 图像的像素值,然后对其进行重塑,然后将其存储为 Image。但是,新的图像大小比原始图像大得多。我还检查了创建的 NumPy 数组的大小 - 它正好是图像宽度和高度乘积的三倍。

from PIL import Image
import numpy as NP

img = Image.open('C:/Wallpapers/99820.jpg').convert('RGB')
pxls = NP.array(img.getdata())
res = img.size
new_img = pxls.reshape((img.height, img.width, 3))
new_img2 = Image.fromarray(new_img.astype(NP.uint8))
new_img2.save('C:/Wallpapers/new.png', 'PNG')

原始映像为 56.3KB,新映像为 185KB。为什么?

我尝试了上面的代码。我期望 NumPy 数组大小等于图像宽度 x 高度,因为 NumPy 数组是 2D 的,其元素的大小为 r、g 和 b 中的每一个为 3。

python numpy python-imaging-库

评论


答:

3赞 AKX 11/12/2023 #1

您正在阅读 JPEG 图像;JPEG 是有损压缩的。PNG(您正在输出的)是无损压缩的。

如果您想要较小的输出,请保存 JPEG(使用合适的质量设置)。

至于为什么数组正好是 的三倍大,你有一个 RGB 图像 - 即每个像素 3 个通道。width * height