批量作图先算像素预算要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。把每个任务的width、height、count作为正整数输入,逐项乘积后累加。上限同样为正整数,结果超过上限时拒绝,而不是自动改变商品图片尺寸。
批量作图先算像素预算要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。把每个任务的width、height、count作为正整数输入,逐项乘积后累加。上限同样为正整数,结果超过上限时拒绝,而不是自动改变商品图片尺寸。
输入契约与实现
把每个任务的width、height、count作为正整数输入,逐项乘积后累加。上限同样为正整数,结果超过上限时拒绝,而不是自动改变商品图片尺寸。

代码把总像素上限限定成小范围任务,刻意不增加网络请求、文件覆盖和发布动作。
运行结果与排错
等于16000像素的边界通过;15999上限拒绝;布尔值width被拒绝,避免Python将True当整数一参与乘法。
像素总量不是实际内存峰值,也不是接口计费金额。解码、图层与编码都有额外开销;这个小工具只做任务清单的静态预检。如果要扩大范围,先添加对应失败夹具,再修改实现。
成功分支同样要验证结果含义。
放在图片制作链路的哪里
这个工具适合放在像素预算工具相关的本地资料整理环节,和图像制作保持解耦。
实际交接至少保留输入版本、代码版本和完整报告。
本例的覆盖范围是:等于16000像素的边界通过;15999上限拒绝;布尔值width被拒绝,避免Python将True当整数一参与乘法。未覆盖的边界是:像素总量不是实际内存峰值,也不是接口计费金额。解码、图层与编码都有额外开销;这个小工具只做任务清单的静态预检。
import json
def positive(value, field):
if type(value) is not int or value <= 0:
raise ValueError('invalid:' + field)
return value
def budget(tasks, limit):
positive(limit, 'limit')
total = 0
for index, task in enumerate(tasks):
pixels = 1
for key in ('width', 'height', 'count'):
if key not in task:
raise ValueError('missing:' + key)
pixels *= positive(task[key], key)
total += pixels
if total > limit:
raise ValueError('over_budget:' + str(index))
return total
tasks = [{'width': 100, 'height': 80, 'count': 2}]
assert budget(tasks, 16000) == 16000
errors = []
for task, limit in [(tasks, 15999), ([{'width': True, 'height': 80, 'count': 2}], 16000)]:
try:
budget(task, limit)
except ValueError as exc:
errors.append(str(exc))
else:
raise AssertionError('expected rejection')
assert errors == ['over_budget:0', 'invalid:width']
print(json.dumps({'pixels': budget(tasks, 16000), 'errors': errors}))
编辑复核与下一组测试
像素预算应按任务行拆开阅读,先核对width、height、count各自的含义,再看各行乘积的累计值。width与height描述单张图的尺寸,count表示该行要做多少张;如果将批次数当成图片数,或者在清单之外又重复乘一次数量,总预算就会偏离实际计划。本文以总量等于16000像素时通过、上限改成15999时拒绝,明确采用超过上限才拒绝的判断方式,所以报告中的总量和上限必须一起交接,仅有通过二字无法说明尚余多少空间。排查超限时,应先找出贡献最大的任务行,再判断是数量填写错误、尺寸单位误用,还是确实需要拆批,不能把所有图片统一缩小以掩盖输入问题。拆批也要写清预算适用的是单批还是整次制作:若上限针对整个活动,总量不变的拆分并没有减少需求;只有业务明确按批控制时,分组结果才有意义。布尔值width被拒绝是本例很重要的类型边界,True在Python中可能参与整数运算,但它不是有效宽度,不能把这种输入解释为一像素小图。下一组测试可把布尔值分别放到height、count和上限位置,再分别使用零、负整数、小数字面值与数字字符串,以确认正整数约束没有只落在width上。另可用两行任务共同达到16000,再把其中一行的count增加一,观察累计预算与拒绝路径;这比只测一张图片更能覆盖批量清单的求和环节。若任务来源提供的是厘米或带单位文本,应在资料整理阶段先确认尺寸定义,而不是在预算器里猜测转换比例。这个工具适合在尺寸方案和数量清单已经确定、任务尚未排入制作队列时使用,让提交者看到超限由哪些行构成并选择删减或重排。它计算的是宽高数量形成的静态像素总量,不包含解码缓冲、图层副本或编码过程的额外占用,因而不能把16000的通过结果写成内存峰值已受控;同样不能把累计像素直接换算成接口费用。若需要评估资源或费用,应另建对应的输入和测试,不给当前报告附加它没有计算的指标。