- CURRENT-STATE 更新至D158 - 生成脚本: char004/char004_r3/prop002/prop002_r3/prop003 全量 - QC脚本: qc_char004_r2/r3 + qc_prop_r2 - QC报告: CHAR-004 R2~R5 + PROP全量 - generation-meta: 所有候选批次元数据 - 候选图(JPG)保留本地不入库
54 lines
3.1 KiB
Python
54 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
||
"""PROP-002 天道宗无字牌匾 · 3D动漫卡通渲染风格 · 重做"""
|
||
import sys,os,json,time,subprocess
|
||
from pathlib import Path
|
||
sys.path.insert(0,os.path.dirname(__file__))
|
||
from secrets_loader import secret,endpoint
|
||
AK=secret("SC-001");URL=endpoint("EPT-001");M="doubao-seedream-4-0-250828"
|
||
ROOT=Path(__file__).resolve().parents[1];J=Path("/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/图片/zai-fu-fei-xiu-xian/ep01")
|
||
CD=ROOT/"assets/candidates/D157-PROP-002-R2"/"PROP-002-Tiandao-Plaque"
|
||
|
||
P="""3D动漫卡通渲染,国风玄幻动态漫质感,一件游戏道具牌匾,纯白背景。
|
||
深棕色木质无字牌匾底板,牌匾为长方形横版,边缘有简单的古朴雕花装饰。
|
||
木质纹理清晰但为卡通渲染风格,不是写实摄影。牌匾正面朝上平视角度。
|
||
木板表面平整,略有年代磨损痕迹但整体干净,没有写字,没有文字。
|
||
比例协调,线条清晰,光影柔和,适合作为动态漫中的道具使用。"""
|
||
|
||
N="""写实,照片感,真实木纹,家具摄影,产品图,3D渲染,PBR材质,高精度写实,文字,字母,汉字,书法,破损,裂缝,腐烂。"""
|
||
|
||
V=["正面平视,标准构图","轻微斜角,展示厚度感","俯视角度,展示完整板面","略侧角度,展示边缘雕花"]
|
||
S=[10,20,30,40]
|
||
|
||
def g(prompt,neg,seed):
|
||
url=f"{URL}/images/generations"
|
||
r=subprocess.run(["curl","-s","-m","120","--noproxy","*","-X","POST",url,
|
||
"-H",f"Authorization: Bearer {AK}","-H","Content-Type: application/json",
|
||
"-d",json.dumps({"model":M,"prompt":prompt,"negative_prompt":neg,"size":"1440x2560","n":1,"seed":seed})],
|
||
capture_output=True,text=True,timeout=130)
|
||
try:d=json.loads(r.stdout);return d["data"][0].get("url")
|
||
except:return None
|
||
def dl(url,dst):
|
||
Path(dst).parent.mkdir(parents=True,exist_ok=True)
|
||
subprocess.run(["curl","-s","-m","60","-L","--noproxy","*","-o",dst,url],capture_output=True,timeout=65)
|
||
return os.path.exists(dst) and os.path.getsize(dst)>1024
|
||
|
||
def main():
|
||
print("PROP-002 R2 · 3D动漫卡通风格牌匾")
|
||
if not AK: sys.exit("✗ no key")
|
||
ts=time.strftime("%Y%m%d-%H%M%S");rd=J/"PROP-002-R2"/ts;rd.mkdir(parents=True,exist_ok=True)
|
||
CD.mkdir(parents=True,exist_ok=True);rs=[]
|
||
for i,(seed,var) in enumerate(zip(S,V)):
|
||
full=f"{P} {var}";print(f"[{i+1}/4] seed={seed}",flush=True)
|
||
url=g(full,N,seed)
|
||
if not url:rs.append({"c":i+1,"ok":False,"err":"api"});continue
|
||
raw=rd/f"PROP-002-R2-{i+1:02d}-1440x2560.jpg"
|
||
if not dl(url,raw):rs.append({"c":i+1,"ok":False,"err":"dl"});continue
|
||
sc=CD/f"PROP-002-R2-candidate-{i+1:02d}-1080x1920.jpg"
|
||
subprocess.run(["sips","-z","1920","1080",str(raw),"--out",str(sc)],capture_output=True)
|
||
rs.append({"c":i+1,"ok":True,"raw":str(raw),"scaled":str(sc),"seed":seed});time.sleep(2)
|
||
ok=sum(1 for r in rs if r["ok"]);print(f"完成:{ok}/4")
|
||
with open(CD/"generation-meta.json","w") as f:json.dump({"spec":"PROP-002-R2","ts":ts,"ok":ok,"results":rs},f,ensure_ascii=False,indent=2)
|
||
return 0 if ok>=4 else 1
|
||
|
||
if __name__=="__main__":sys.exit(main())
|