如何调整图片尺寸使其匹配指定宽高比 如3:4的最近适配尺寸
图片指定宽高比最适配尺寸计算方案
适用场景:支持输入任意原始图片尺寸,输出与原始尺寸差值最小、完全符合指定宽高比的新尺寸,核心判断标准是新尺寸与原始尺寸的差值最小,无固定输出数值要求。
计算逻辑
- 先将目标宽高比转换为最简比值,例如3:4的核心校验规则为
新宽度 / 新高度 = 3 / 4 = 0.75 - 共提供2种适配策略可按需选择:
- 固定单边适配:保持原始宽度/原始高度其中一个数值不变,计算另一维度的符合比例值,选择与原始尺寸偏差更小的一组作为输出。以1833×2133的原始尺寸为例:
固定宽度适配:高度=1833×4÷3=2444,对应尺寸1833×2444,与原始高度差值为311
固定高度适配:宽度=2133×3÷4≈1600,对应尺寸1600×2133,与原始宽度差值为233
最终输出偏差更小的1600×2133即可满足3:4要求 - 双边小幅调整适配:允许宽高同时微调,计算总像素差(|新宽×新高 - 原宽×原高|)最小的符合比例尺寸,你提到的pixelz处理案例就采用这类策略,最终输出1623×2164的差值比固定单边适配更小。
- 固定单边适配:保持原始宽度/原始高度其中一个数值不变,计算另一维度的符合比例值,选择与原始尺寸偏差更小的一组作为输出。以1833×2133的原始尺寸为例:
Python实现代码示例
def get_nearest_aspect_ratio_size(original_w, original_h, target_ratio_w, target_ratio_h): # 计算目标比例 target_ratio = target_ratio_w / target_ratio_h # 候选1:按原始宽度算高度 h1 = round(original_w / target_ratio) candidate1 = (original_w, h1) diff1 = abs(original_w * h1 - original_w * original_h) # 候选2:按原始高度算宽度 w2 = round(original_h * target_ratio) candidate2 = (w2, original_h) diff2 = abs(w2 * original_h - original_w * original_h) # 候选3/4:双边调整找最小像素差,适配pixelz类效果 base = max(original_w // target_ratio_w, original_h // target_ratio_h) candidate3 = (base * target_ratio_w, base * target_ratio_h) candidate4 = ((base+1) * target_ratio_w, (base+1) * target_ratio_h) diff3 = abs(candidate3[0] * candidate3[1] - original_w * original_h) diff4 = abs(candidate4[0] * candidate4[1] - original_w * original_h) # 取所有候选中差值最小的返回 all_candidates = [(candidate1, diff1), (candidate2, diff2), (candidate3, diff3), (candidate4, diff4)] return min(all_candidates, key=lambda x: x[1])[0] # 示例调用:原始尺寸1833×2133,目标比例3:4 print(get_nearest_aspect_ratio_size(1833, 2133, 3, 4))
示例效果

内容的提问来源于stack exchange,提问作者Monark Unadkat
相关产品推荐
相关产品推荐

