缩放具有最大像素数限制的图像

Scale images with a maximum limit for their number of pixels

我有很多不同形状和大小的图像,我想以一种方式缩放它们,使它们的像素数小于最大值。我还想保留原始图像的纵横比。我想到了这个:

from PIL import Image

img = Image.open("example.jpg")
max_pix = 65536

r = img.size[0] / img.size[1]
if r > 1:
    r **= -1  # because I don't know if the height is bigger or the width

n = int(sqrt(max_pix/r))
img.thumbnail((n, n))

img.save("example.jpg")

最多r为1,所以像素数(n * n)等于max_pix。否则会比那个小。
有一个更好的方法吗?我会多次这样做,所以我正在寻找最有效的方法。

如果您对算法的行为感到满意,我怀疑那三四行 Python 的效率根本不重要。尽管在 Python 中进行数学计算很慢,但它至少比缩放 64K+ 像素快一个数量级(或可能更多)。

如果您正在寻找减速带,您可以检查是否有比 Pillow 更快的替代品,例如 Pillow-SIMD,并针对您的用例对它们进行基准测试。