旋转图像会增加其尺寸?

Rotating image increases its size?

我正在尝试将一些宽度大于高度的图像围绕左上角旋转 90 度。我写了这个:

from PIL import Image
import sys, csv, os, traceback, glob
import shutil, math

src_im = Image.open("Test.png")
print src_im.size[0] , ',' , src_im.size[1]

src_im = src_im.transpose(Image.ROTATE_90) 
src_im = src_im.transpose(Image.FLIP_LEFT_RIGHT) 
src_im = src_im.transpose(Image.FLIP_TOP_BOTTOM) 

src_im.save("TestResult.png")
print src_im.size[0] , ',' , src_im.size[1]

生成的输出符合我的预期,但大小发生了巨大变化。我有什么地方可能出错的想法吗?

它存储的是相同的像素信息,只是旋转了,为什么图像尺寸会发生变化?

例如。 (936 x 312) 155KB

(312 x 936) 342KB


编辑:

好的,所以我尝试使用 windows 的内置图像查看器旋转图像,并且在这种情况下也有所增加。所以它本身并不是真正特定于 Python。更多关于压缩。我仍然不清楚为什么旋转时它的可压缩性会降低?这发生在我尝试的所有图像上,而不是这个特定的图像。相应地更新标签。

PNG 每行 "filtering" 压缩图像,尝试预测每个像素的值作为 "past" 邻居(前一行 and/or 列)的函数,然后使用 ZLIB (Deflate) 压缩预测误差。 这里的问题似乎是这样的:垂直图像几乎有垂直条纹;当沿行扫描时,它具有相当可预测的中等范围图案(大约 8 种相似的颜色,然后是短暂的较浅颜色)。这表明,虽然短程预测不会很成功,但预测误差会得到高度重复的模式,应该相对容易压缩。旋转图像时不会发生这种情况。

我确认 horizontal/vertical 尺寸不同不是问题:我通过将原始图像重复 9 次来制作更大的正方形 (900x900)。带有准垂直条纹的 PNG 图像大约是另一个图像的一半大小。

另一个证实上述内容的实验:将两张图像都保存为灰度 BMP(这是一种未压缩的格式,它沿行每个像素存储一个字节)。您会得到两张 293.110 字节的图像。使用标准 ZIP 压缩器(与 ZLIB 的 deflate 同系列)压缩它们。同样,垂直图像的尺寸大约是另一个图像的一半。