0

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

我有一张可以是任何尺寸/纵横比的图像。

它必须按比例放大或缩小,以使其覆盖至少 55w x 168h

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

例如,假设我们有一个大小为 1000w x 500h 的图像,我们将其缩放到 200,那么生成的图像必须适合边长为 200 的正方形,这意味着生成的图像将是 200w x 100h。

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

因此,要将 1000x500 的图像缩放到 55x168,我们需要将其缩放到 336,给出 336x168 的大小,因为这是可以容纳在 336x336 边正方形内的最大图像。

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

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

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

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

4

2 回答 2

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 的除法行为进行一些快速研究可能是值得的。

于 2013-01-23T09:03:25.753 回答
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

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

于 2013-01-23T09:06:53.100 回答