用 nano-banana2 批量生图几百张,怎么自动挑出能用的?给生图API 配一套质检
跑量出图有个绕不开的问题:一次出三百张,人工挑图比出图还累。而且很多废图的特征是固定的——纯色、糊、尺寸不对、明显失败,这类完全可以让代码先筛一遍。
这篇讲在甜甜圈API(dashengfenshen.cn)上批量调图像生成接口之后,怎么用几十行代码把明显不能用的自动踢掉。
一、先筛便宜的,再筛贵的
质检要按成本从低到高排,能用文件属性判掉的就别去解码像素:
1. 字节数太小 → 几乎必然是失败图 (最便宜) 2. 尺寸/比例不对 → 读文件头就知道 3. 纯色或接近纯色 → 需要解码,但只看缩略图 4. 清晰度不足 → 解码 + 计算 5. 内容对不对 → 要调模型,最贵 (最后再上)前四步能刷掉八九成废图,剩下的再人工看或送模型判断。
二、前三步的实现
用 sharp(npm i sharp):
constsharp=require('sharp');asyncfunctionquickCheck(buf,{minBytes=20*1024,ratio=1,ratioTol=0.02}={}){// 1) 字节数:正常一张 1K 图不会小于 20KB,太小基本是出错了if(buf.length<minBytes)return{ok:false,why:`文件过小${(buf.length/1024).toFixed(0)}KB`};constmeta=awaitsharp(buf).metadata();if(!meta.width||!meta.height)return{ok:false,why:'读不到尺寸,文件可能损坏'};// 2) 比例:电商主图要求正方形,偏差超过 2% 就不合格constr=meta.width/meta.height;if(Math.abs(r-ratio)/ratio>ratioTol){return{ok:false,why:`比例不对${meta.width}x${meta.height}`};}// 3) 纯色检测:缩到 16x16 再看标准差,比全图统计快几十倍const{channels}=awaitsharp(buf).resize(16,16,{fit:'fill'}).stats();constmaxStd=Math.max(...channels.map((c)=>c.stdev));if(maxStd<6)return{ok:false,why:`画面接近纯色(stdev${maxStd.toFixed(1)})`};return{ok:true,meta};}纯色检测先缩到 16×16是关键——全图算统计量在几百张的量级上会很慢,而判断"是不是一片空白"用缩略图完全够。
三、清晰度:拉普拉斯方差
糊图的特征是边缘响应弱。经典做法是算拉普拉斯算子的方差:
asyncfunctionsharpness(buf){const{data,info}=awaitsharp(buf).greyscale().resize(512,512,{fit:'inside'}).raw().toBuffer({resolveWithObject:true});const{width:w,height:h}=info;letsum=0,sum2=0,n=0;for(lety=1;y<h-1;y++){for(letx=1;x<w-1;x++){consti=y*w+x;// 拉普拉斯:四邻域之和减去 4 倍中心constv=data[i-1]+data[i+1]+data[i-w]+data[i+w]-4*data[i];sum+=v;sum2+=v*v;n++;}}returnsum2/n-(sum/n)**2;// 方差越大越清晰}阈值要自己标定:先跑一批已知好图和已知糊图,看方差分布在哪儿分开,别抄别人的数字——不同题材、不同模型的分布差很多。
四、串起来
asyncfunctionscreen(items,{workers=8}={}){constpass=[],fail=[];letnext=0;awaitPromise.all(Array.from({length:workers},async()=>{while(next<items.length){constit=items[next++];try{constbuf=awaitfetchBuf(it.url);constq=awaitquickCheck(buf);if(!q.ok){fail.push({...it,why:q.why});continue;}consts=awaitsharpness(buf);if(s<60){fail.push({...it,why:`偏糊${s.toFixed(0)}`});continue;}pass.push({...it,sharpness:s});}catch(e){fail.push({...it,why:'处理异常 '+e.message});}}}));// 按清晰度排序,人工只看前面几十张就够了pass.sort((a,b)=>b.sharpness-a.sharpness);console.log(`通过${pass.length}/ 废弃${fail.length}`);return{pass,fail};}别直接删废图,先留着看why的分布。如果"偏糊"占比特别高,多半是提示词或模型选得不对,该回去调生成而不是调筛选。
五、生成阶段就能减少废图
质检是补救,源头才是关键:
- 同一提示词多出几版再挑,比反复调提示词更省时间
- 跑量用
nano-banana2(8 积分/次),挑中的再用nano-banana-pro或gpt-image-2出终稿 - 提示词里写清构图和背景(“正方形构图、纯白背景、商品居中”),比事后筛有效得多
| 模型代码 | 定位 | 消耗 |
|---|---|---|
nano-banana2 | 跑量草稿 | 8 积分/次 |
nano-banana-pro | 终稿,支持 1K/2K/4K | 10 积分/次 |
gpt-image-2 | 细节质感 | 按次计费 |
ttq-cutout | 抠图 | 10 积分/次 |
六、小结
批量出图的自动质检四层:字节数 → 尺寸比例 → 纯色 → 清晰度,成本从低到高,前三层就能刷掉大部分废图。阈值必须自己标定,别抄。
甜甜圈API(dashengfenshen.cn)并发高,跑量筛选这套流程才跑得起来;模型全(nano banana pro、gpt-image-2、Veo 3.1、Sora 2)、价格便宜、出图快、稳定。文档地址:https://dashengfenshen.cn 。