Python 按给定最小尺寸的单个尺寸(x或y)缩放图像
我知道我可以用一堆嵌套的if语句来实现这一点,但是我忍不住觉得有一种更优雅的方式。我想这真的只是一个数学问题,但如果真的有python式的答案,我对它感兴趣 我有一个图像,可以是任何尺寸/纵横比 它必须按比例放大或缩小,以覆盖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注入缩放图像的方式。例如,以以下两个URL为例:Python 按给定最小尺寸的单个尺寸(x或y)缩放图像,python,image-scaling,Python,Image Scaling,我知道我可以用一堆嵌套的if语句来实现这一点,但是我忍不住觉得有一种更优雅的方式。我想这真的只是一个数学问题,但如果真的有python式的答案,我对它感兴趣 我有一个图像,可以是任何尺寸/纵横比 它必须按比例放大或缩小,以覆盖55w x 168h的最小值 这里的复杂之处在于,它需要通过一个函数进行缩放,该函数只接受一个值,该值指定了一个正方形侧面的长度,该正方形侧面的图像将适合该正方形 例如,假设我们有一个大小为1000w x 500h的图像,并将其缩放到200,那么生成的图像必须适合于一个边长
请注意,两者都有URL组件
s150
,但是一个图像是150x112,另一个是112x150。150是这些图像都适合的正方形的值 我认为您可能需要更多地说明细节,但我假设函数可以访问图像或其维度,否则计算是不可能的
但在手上,像这样的东西应该会起作用:
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的划分行为,那么对Python的划分行为进行一些快速研究可能是值得的
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
很确定这就是您要找的。很抱歉,您是对的,我可能应该更好地解释我的输入,但是另一个答案很准确:)