如何将PIL.Image调整为最接近3的倍数的尺寸?
将图片尺寸调整为最接近3的倍数的实现方案
核心算法逻辑
针对图片的宽度、高度两个维度,分别按以下规则计算目标尺寸:
- 计算当前数值除以3的余数
remainder = num % 3 - 根据余数确定最终值:
- 余数为0:保持原数值不变
- 余数为1:对比
num - 1和num + 2与原数值的距离,选择更近的(比如100的场景下,99比102更接近,选99) - 余数为2:对比
num - 2和num + 1与原数值的距离,选择更近的(比如101的场景下,99和102距离相等,可根据需求二选一)
如果业务要求不允许放大图片,逻辑可简化:余数不为0时直接取num - remainder,得到不超过原尺寸的最大3的倍数。
代码示例(Python)
def adjust_to_nearest_multiple_of_three(size): width, height = size def adjust_dim(num): remainder = num % 3 if remainder == 0: return num # 生成两个候选目标值 candidate_down = num - remainder candidate_up = num + (3 - remainder) # 选择距离原数值更近的,距离相同时优先选更大的 if abs(num - candidate_down) <= abs(num - candidate_up): return candidate_down else: return candidate_up return (adjust_dim(width), adjust_dim(height)) # 测试示例 original_size = (100, 100) target_size = adjust_to_nearest_multiple_of_three(original_size) print(target_size) # 输出 (99, 99)
图像处理库适配示例
如果使用Pillow或OpenCV等工具,可直接将计算出的目标尺寸传入resize函数:
from PIL import Image # 打开原图 img = Image.open("original_img.png") # 计算目标尺寸 new_size = adjust_to_nearest_multiple_of_three(img.size) # 高质量缩放并保存 resized_img = img.resize(new_size, Image.LANCZOS) resized_img.save("resized_img.png")
内容的提问来源于stack exchange,提问作者Eric Mendes
相关产品推荐
相关产品推荐

