Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按给定最小尺寸的单个尺寸(x或y)缩放图像_Python_Image Scaling - Fatal编程技术网

Python 按给定最小尺寸的单个尺寸(x或y)缩放图像

Python 按给定最小尺寸的单个尺寸(x或y)缩放图像,python,image-scaling,Python,Image Scaling,我知道我可以用一堆嵌套的if语句来实现这一点,但是我忍不住觉得有一种更优雅的方式。我想这真的只是一个数学问题,但如果真的有python式的答案,我对它感兴趣 我有一个图像,可以是任何尺寸/纵横比 它必须按比例放大或缩小,以覆盖55w x 168h的最小值 这里的复杂之处在于,它需要通过一个函数进行缩放,该函数只接受一个值,该值指定了一个正方形侧面的长度,该正方形侧面的图像将适合该正方形 例如,假设我们有一个大小为1000w x 500h的图像,并将其缩放到200,那么生成的图像必须适合于一个边长

我知道我可以用一堆嵌套的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为例:


请注意,两者都有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

很确定这就是您要找的。

很抱歉,您是对的,我可能应该更好地解释我的输入,但是另一个答案很准确:)