我正在尝试将一些宽度超过左上角高度的图像旋转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]
产生的输出正如我所料,但尺寸发生了巨大变化。我可能会出错的任何想法?
存储相同的像素信息,只是旋转,为什么图像尺寸会发生变化?
(312 x 936)342KB
编辑:
好的,所以我尝试使用windows的内置图像查看器旋转图像,并且这种情况也有所增加。所以它本身并不特定于Python。更多关于压缩。我还不清楚为什么旋转时压缩性会降低?对于我正在尝试的所有图像都会发生这种情况,而不是这个特定的图像。相应地更新标签。
答案 0 :(得分:1)
PNG通过“过滤”每一行压缩图像,尝试根据“过去”邻居(前一行和/或列)预测每个像素的值,然后使用ZLIB压缩预测误差(放气)。 这里的问题似乎是这样的:垂直图像几乎是垂直条纹;当沿着行扫描时,它具有相当可预测的中等范围图案(大约8种相似的颜色,然后是较短的浅色突起)。这表明,虽然短程预测不会非常成功,但预测误差将获得高度重复的模式,应该相对容易压缩。旋转图像时不会发生这种情况。
我确认不同的水平/垂直尺寸不是问题:我通过重复原始图像9次制作了更大的正方形(900x900)。具有准垂直条纹的PNG图像大小约为另一个的一半。
确认上述内容的另一个实验:将两个图像保存为灰度BMP(这是一种未压缩的格式,它沿着行存储每个像素一个字节)。你得到两个293.110字节的图像。使用标准ZIP压缩器(与ZLIB的deflate相同的系列)压缩它们。垂直图像的尺寸大约是另一个尺寸的一半。