固定宽高比且像素数在指定区间的图片尺寸计算算法优化问题
图片缩放尺寸最优计算方案
原来的双层循环完全可以通过数学推导把遍历范围压缩到极小,不需要遍历所有可能的宽高组合,优化后可以达到接近O(1)的计算效率。
优化思路
- 第一步:计算原始宽高比
r = 原图宽度/原图高度,取像素要求区间的中间值作为目标像素值,推导完全贴合原始比例的理想宽高 - 第二步:由于允许的比例偏差极小(你示例中是0.006),仅需要在理想高度的±10像素范围内枚举候选值即可,候选总数最多只有20个
- 第三步:对每个候选高度,直接计算同时符合比例要求和像素要求的宽度区间,取最接近理想比例的宽度即可
- 第四步:从所有符合条件的组合中选择总像素最接近目标中间值的作为最终结果
参考实现代码(Python)
import math def get_resize_size(original_w, original_h, min_pixels, max_pixels, ratio_tolerance=0.006): origin_ratio = original_w / original_h target_pixels = (min_pixels + max_pixels) / 2 # 计算完全贴合比例的理想高度 ideal_h = math.sqrt(target_pixels / origin_ratio) # 确定遍历的高度范围,最多20个值 scan_min_h = max(1, int(math.floor(ideal_h - 10))) scan_max_h = int(math.ceil(ideal_h + 10)) best_w = None best_h = None min_pixel_diff = float('inf') for h in range(scan_min_h, scan_max_h + 1): # 计算符合比例要求的宽度范围 ratio_limit_min_w = math.ceil(h * (origin_ratio - ratio_tolerance)) ratio_limit_max_w = math.floor(h * (origin_ratio + ratio_tolerance)) # 计算符合像素要求的宽度范围 pixel_limit_min_w = math.ceil(min_pixels / h) pixel_limit_max_w = math.floor(max_pixels / h) # 取两个范围的交集 valid_min_w = max(ratio_limit_min_w, pixel_limit_min_w) valid_max_w = min(ratio_limit_max_w, pixel_limit_max_w) if valid_min_w > valid_max_w: continue # 选最贴合原始比例的宽度 ideal_w = origin_ratio * h current_w = round(ideal_w) current_w = max(valid_min_w, min(current_w, valid_max_w)) # 记录和目标像素差最小的组合 pixel_diff = abs(current_w * h - target_pixels) if pixel_diff < min_pixel_diff: min_pixel_diff = pixel_diff best_w = current_w best_h = h return best_w, best_h # 示例调用:原图宽高160*90,要求像素在28000~30000之间 print(get_resize_size(160, 90, 28000, 30000))
性能提升说明
如果是1080P级别的原图,原有双层循环需要遍历百万次以上,优化后最多遍历20个高度值,速度提升至少10000倍,完全不存在性能瓶颈。
内容的提问来源于stack exchange,提问作者Mayank Thapliyal
相关产品推荐
相关产品推荐

