PIL .getdata()返回数组尺寸异常及转存图像体积增大问题
问题解答
一、新图像体积更大的原因
- 格式压缩机制不同:原图像是JPG格式,属于有损压缩格式,会通过丢弃人眼不敏感的图像细节来大幅压缩体积;而你保存的是PNG格式,属于无损压缩格式,会完整保留所有像素数据,仅通过无损算法做有限压缩,因此体积远大于原JPG。
- 数据完整性差异:JPG可以通过高压缩率在视觉损失极小的前提下缩小体积;PNG则不会丢失任何像素信息,所以同样的图像内容,PNG体积通常比高压缩率的JPG大很多。
二、关于NumPy数组维度的疑问
你预期数组是二维结构(宽×高),每个元素包含RGB三个分量,但实际得到的是宽×高×3的三维数组,这是RGB图像的标准存储逻辑:
- 三维数组的三个维度对应:
(图像高度, 图像宽度, 通道数),其中通道数3对应R、G、B三个颜色通道。 - 你用
img.getdata()获取的是扁平化像素列表,每个元素是(R,G,B)三元组,转成NumPy数组后是一维数组(长度为宽×高),每个元素包含3个数值,因此重塑为(img.height, img.width, 3)是完全正确的——这种三维结构是NumPy和多数图像处理库处理RGB图像的常规形式,方便对单个颜色通道单独操作。
优化建议
如果想让保存后的图像体积接近原JPG,可以改为保存为JPG格式并调整压缩质量:
new_img2.save('C:/Wallpapers/new.jpg', 'JPEG', quality=85)
quality参数范围为1-100,数值越高画质越好、体积越大,可根据需求调整到和原JPG接近的体积。
内容的提问来源于stack exchange,提问作者prabhat
相关产品推荐
相关产品推荐

