59 lines
3.6 KiB
Python
59 lines
3.6 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""PROP-002 天道宗摊位木板招牌 · R3 · 摊位简陋木牌 · 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-R3"/"PROP-002-Tiandao-Stall-Sign"
|
|||
|
|
|
|||
|
|
# 关键词变化:
|
|||
|
|
# R2: 深棕色木质无字牌匾,边缘古朴雕花装饰 → 庄重大匾,错了
|
|||
|
|
# R3: 百宗会广场角落的摊位招牌,一块破旧的长方形木板,简单朴素
|
|||
|
|
# 剧本依据:△特写:角落里写着【天道宗】的破旧牌匾。
|
|||
|
|
|
|||
|
|
P="""3D动漫卡通渲染,国风玄幻动态漫质感,百宗会广场角落里的摊位招牌,纯白背景。
|
|||
|
|
一块简单的长方形木板招牌,原木色,没有雕花装饰,没有边框装饰,就是一块切割平整的普通木板。
|
|||
|
|
木板表面有明显的使用痕迹和轻微磨损,边缘有磕碰痕迹,整体破旧但结构完整。
|
|||
|
|
木板朴素简陋,像街边摊位的临时招牌,不是庙宇大门匾额。
|
|||
|
|
木板正面朝上平视角度,比例自然,适合后期在上面添加【天道宗】文字。"""
|
|||
|
|
|
|||
|
|
N="""写实,照片,真实木纹,摄影,产品图,雕刻,雕花,鎏金,红漆,豪华,气派,庙宇,匾额,装裱,边框装饰,金属包边,书法,文字,汉字,字母,PBR,高精度写实,3D渲染。"""
|
|||
|
|
|
|||
|
|
V=["正面平视,木板占画面主体","轻微斜角,展示木板厚度和简朴质感","侧面视角,木板倚靠在简单支架上","正面略俯,展示木板放在摊位桌上的感觉"]
|
|||
|
|
S=[11,21,31,41]
|
|||
|
|
|
|||
|
|
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 R3 · 摊位木板招牌(破旧简朴)")
|
|||
|
|
if not AK: sys.exit("✗ no key")
|
|||
|
|
ts=time.strftime("%Y%m%d-%H%M%S");rd=J/"PROP-002-R3"/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-R3-{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-R3-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-R3","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())
|