缩小尺寸(设置最大宽度和高度)

秋折

我正在编写一个脚本来处理一堆高分辨率图像。这些图像的尺寸从 1000 到 5000 像素不等。为了让它们为网络(上传)做好准备,我需要缩小它们的规模。

我对缩小的实现不感兴趣(打开图像、缩放、保存等)。我对计算新的缩小尺寸感兴趣。

假设我有一个尺寸为 800x2000 像素的图像,我将 2400x1200 设置为最大尺寸。图像的缩小尺寸应为 480x1200 像素。图像尺寸不能超出最大尺寸。

我该如何计算?


在脑海中形成问题的同时,我也在进行实验,并提出了以下算法:

def scale(dim, max_dim):
    new_dim = {"w" : 0, "h" : 0}

    # no change if dim is lower than given max_dim
    if dim["w"] <= max_dim["w"] and dim["h"] <= max_dim["h"]:
        return dim

    ratio = 0

    # detect which side overflows
    if dim["w"] > max_dim["w"]:
        ratio = max_dim["w"] / dim["w"]
    else:
        ratio = max_dim["h"] / dim["h"]

    # scale according to overflowing side
    new_dim["w"] = dim["w"] * ratio
    new_dim["h"] = dim["h"] * ratio

    # now the other side might overflow after scaling
    # check if that's true and scale again
    if new_dim["h"] > max_dim["h"]:
        ratio = max_dim["h"] / dim["h"]
    if new_dim["w"] > max_dim["w"]:
        ratio = max_dim["w"] / dim["w"]

    new_dim["w"] = math.floor(dim["w"] * ratio)
    new_dim["h"] = math.floor(dim["h"] * ratio)

    return new_dim

这似乎产生了正确的结果,尽管我不确定这是否是一种更可取的方法。例如,我正在做两项检查;首先检测溢出,其次,纠正由第一个刻度导致的(可能的)第二次溢出。我可能在做多余的计算,所以我也需要这方面的建议。

测试用例:

max_dim = {"w" : 2400, "h" : 1200}

dim1 = {"w" : 800,  "h" : 1000}
dim2 = {"w" : 800,  "h" : 2000}
dim3 = {"w" : 800,  "h" : 2500}
dim4 = {"w" : 2500, "h" : 800}
dim5 = {"w" : 2500, "h" : 3000}
dim6 = {"w" : 1800, "h" : 1500}
dim7 = {"w" : 2500, "h" : 1000}
dim8 = {"w" : 2500, "h" : 1400}
dim9 = {"w" : 2500, "h" : 2000}

print(scale(dim1, max_dim))
print(scale(dim2, max_dim))
print(scale(dim3, max_dim))
print(scale(dim4, max_dim))
print(scale(dim5, max_dim))
print(scale(dim6, max_dim))
print(scale(dim7, max_dim))
print(scale(dim8, max_dim))
print(scale(dim9, max_dim))

输出:

{'w': 800, 'h': 1000}
{'w': 480, 'h': 1200}
{'w': 384, 'h': 1200}
{'w': 2400, 'h': 768}
{'w': 1000, 'h': 1200}
{'w': 1440, 'h': 1200}
{'w': 2400, 'h': 960}
{'w': 2142, 'h': 1200}
{'w': 1500, 'h': 1200}

这些输出是正确的。输入尺寸的宽度和高度都不超过最大尺寸。

另外,我知道 Python 有用于图像缩放 (resizethumbnail) 的内置方法,但我会做进一步的修改(更改纵横比,将透明像素和空白区域设置为白色等),所以我需要手动进行计算.

管理层收购

是的,进行一次比较就足够了(也可以保存Max_W * Hgt保存Max_H * Wdt在变量中以保存onem ore乘法:))

if (Max_W * Hgt < Max_H * Wdt):
    W_Result = Max_W
    H_Result = Hgt * Max_W / Wdt
else:
   W_Result = Wdt * Max_H / Hgt
   H_Result = Max_H

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

设置CGRect的高度和宽度以匹配屏幕尺寸

如何根据容器尺寸设置宽度和高度?

计算最大宽度和高度

如何根据不同尺寸的最大宽度和高度计算图像的比例因子

根据高度和宽度之间的最大值更改背景图像的尺寸

从PHAsset获取尺寸(高度和宽度)

产品尺寸:宽度,高度和深度

HTML 对部分使用宽度和高度尺寸

WooCommerce根据单个属性设置产品尺寸(宽度和高度)

CSS过渡最大宽度和最大高度

最大高度和最大宽度的响应图像

A框架-设置高度和宽度

设置框架宽度和高度

addchild设置宽度和高度

如果我尝试更改图像的宽度和高度,图像尺寸会增加。我应该怎么做才能获得缩小尺寸的图像?

使用ImageMagick调整尺寸,使其具有最大的宽度/高度

为可调整大小的UIView设置最小和最大宽度和高度

Cloudinary上传pdf最大宽度和高度

HTML CSS多个类的宽度/高度/尺寸未设置

设置DIV以使用最大正方形空间,具体取决于宽度和高度

获取图像尺寸(高度和宽度)Js或jQuery

如何使用mogrify定位最大尺寸的特定像素值,因此如果垂直将高度设置为“ x”,或者水平将宽度设置为“ x”

在A标签上设置宽度和高度

设置movieClip的宽度和高度失败

设置位置并添加其高度和宽度

Swift:设置按钮的高度和宽度无效

在matplotlib上设置高度和宽度

设置pygame曲面的宽度和高度

以编程方式设置ImageView的宽度和高度?