给定最小尺寸,按单个尺寸(x OR y)缩放图像

时间:2013-01-23 08:40:53

标签: python image-scaling

我知道我可以用一堆嵌套的if语句做到这一点,但是我不禁觉得有一种更优雅的方式。我猜这真的只是一个数学问题,但如果确实存在任何问题,我对pythonic答案感兴趣。

我的图像可以是任何尺寸/宽高比。

必须按比例放大或缩小以使其覆盖最小值55w x 168h

这里的复杂之处在于它需要通过一个函数进行缩放,该函数只接受一个值,该值指定一个正方形边的长度,它将适合放在其中的图像。

例如,假设我们有一张尺寸为1000w x 500h的图像,我们将其缩放到200,然后生成的图像必须放在一个边长为200的正方形内,这意味着生成的图像将是200w x 100h。 / p>

相反,如果我们的图像是200x1000并且我们扩展到200,我们最终会得到40x200。

因此,为了将1000x500的图像缩放到55x168,我们需要将其缩放到336,尺寸为336x168,因为这是最大的图像,可以放在336x336的方形内。

要将200x1000的图像缩放到55x168,我们需要将其缩放到275并最终得到55x275。

希望这比泥更清楚!谢谢你的任何想法。

理由:对于那些对我为什么通过正方形值进行缩放的人感兴趣,这就是Picasa通过网址注入来缩放图片的方式。例如,请使用以下2个网址:

请注意,两者都有URL组件s150,但是一个图像是150x112,另一个图像是112x150。 150是这些图像都适合的正方形的值。

2 个答案:

答案 0 :(得分:1)

我认为您可能需要详细说明细节,但我会假设该功能可以访问图像或其尺寸,否则无法进行计算。

但是,在手,这样的事情应该有效:

def percent_to_scale_to(image, box_side_px):
    img_width, img_height = Image(image).size()  # or however you get w/h
    greater_img_dimension = max(img_width, img_height)
    scale_percent = (float(box_side_px) / float(greater_img_dimension)) * 100.0

您可能需要查找某些调用的签名,并且不要指望它只能使用剪切和粘贴,但作为伪代码,它可能会让您了解某种方法。 :)

您需要注意整数除法,这可能会产生意外行为。这就是为什么在分裂之前转换为浮动;否则结果将在小数点处截断,这可能在大多数时间产生零返回值。如果您还不熟悉,对Python的划分行为的一些快速研究可能是值得的。

答案 1 :(得分:1)

def name_of_function(img_x, img_y):  # for lack of a better name
    image_dimensions = (img_x, img_y)
    min_dimensions = (55.0, 168.0)
    scale = min(image_dimensions[i]/min_dimensions[i] for i in range(2))
    return max(i/scale for i in image_dimensions)

name_of_function(1000, 500)
# 336.0
name_of_function(200, 1000)
# 275.0

很确定这就是你要找的东西。