我知道我可以用一堆嵌套的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是这些图像都适合的正方形的值。
答案 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
很确定这就是你要找的东西。