From 51afc9eaa784ae9ba2315c7c7821ae63b6e83326 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Thu, 21 Aug 2025 09:44:34 +0800 Subject: [PATCH] 'commit' --- .../FenJingTouGenerator.cpython-310.pyc | Bin 0 -> 3132 bytes dsLightRag/Routes/JiMengRoute.py | 39 ++++++ .../__pycache__/JiMengRoute.cpython-310.pyc | Bin 1331 -> 2262 bytes dsLightRag/static/JiMeng/image_preview.html | 125 ++++++++++++++++-- 4 files changed, 150 insertions(+), 14 deletions(-) create mode 100644 dsLightRag/JiMeng/Kit/__pycache__/FenJingTouGenerator.cpython-310.pyc diff --git a/dsLightRag/JiMeng/Kit/__pycache__/FenJingTouGenerator.cpython-310.pyc b/dsLightRag/JiMeng/Kit/__pycache__/FenJingTouGenerator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83eb012cd84b6de3facac473c3a9dd0bbbfb6758 GIT binary patch literal 3132 zcmaJ@|8EmV7T+1Ky=%w$LJ|@yvtvA>eFlb@>7{d6Zp@6E0gq7vQOJNw?7 zH*em|d!ILB)YnG@c_x(o7Srnu*S(KdFBw$ru=7)?;WK-)=p zjplqjvI_nSeR1S8zIFJ}-aUPXl|4sZQ(oWqcB%XM9jckOv;vKru|(|o9lE+s=IIE{ zZ{Q2mG}R0!rn$L|PXL(R@S4Aah6;RhQkVvY5J3c=Mk$d<-l9+{NJ8L{?6mBs`aw<4 zylL34Qk^o@GFTeJ=(UH_-0WU>&EG>)MrA>P^+5|pNuVs`gzLf$OvGsnGE9Qd20ZhU zO<+JIR(ssZ8}8hP?)fY3z2u zPgAoaZ4{DVDmn5(GM!beB=E&NwKPLFOHFFAnAg%O=aM7=-5I*bz;dA7Vk+s4oS^aq!>Wuk;=#=77P5;d6u;IhwYBI;3T? z)=@Qc{Gj#*)icLm*R124M6aVb>d16)b|Tfm+fg(egXA&etPei9K&&uunrZOH1& zpq}QCTYI=u{Pj|xgdhbV`_<}eVEC*+#Spf;~4bBQi+RDQz_xjB~L#ONJSO_-239qjxj#&ejh!#hv$Q=g} z93uj2^yIcl8Q@Gx`$%>~X5=ZT$h=ps6;m@FV3Ma!R7-WF+Uj6b*3h7WFi3mBk!sqk z894j5&^)^of0ewNeQ?W;bCpjnxQkQE3*T0zzp9-3$({VJW~DNDrRJ0S?bXWNfA-nQ zP1S2I_)2_`@6z(ZV)e^KyA{UxA#g8#1e32$U0a!-?~OS!qh=8b9JSj)#TWa&R6lr7 z89!N_IoTWYhHvciBLN+}4EX9RbN{H^yyV9O!tI5GN70Mf^1_A6-{&jS=PH*cL3ptL za9?F+$z8f=^Qia+)@;UGYn#sKyEZi~(-Dh?X?YQ??LM!+PLSAzqUkg-RWqqFWH80F zRLeGs#dYsNokVPRBP_#vfOhL=lb3i`!}7{b5cfcO|o7>Q5te{fX%H~uB` z1aB3wh(shKj6#oPNygg(QPhf}D1t&Lg8jD{H-U`*8jw8R03|QvKzQY)VgIiDN2D7q>u8zWJ)>cnYEuA-P;+^OR zY*o)3P_?9gA|^?9*RB_PI(H^|$cr@5-Pt{u*!5CpI?*-M-8nQknC|-H&Rre3V#Xc; zCzgM_z4GvyyENmMLO_#W8F>*}xLcXzSOOF;FN`lQeANRL4YGS>?(FJkAFbb79*v(` zr`_{sDj$CH^U|mMW^?iTN8=|~9$o?(i0agjt2aLLLGXWzh7Ym$HufC&$9@BiBk^R1 z97(nNYwUnizvC^q)Tp`vR}%ma-+U*Wq1GV}7L3;r7UM$kwZ8p_ouGGpbn5#pM%BUr zRVR4>Pa{+w6Y8LntqEikEbxn_6W(vI0-y!7!hpRR8HN6*9TAm~nkhew;6Uy6=z)dt z!sllLFO^QP$TZ#BkQ82yczBRs_Ot3wyuzA)fJPQ%Nb)F-1iUXKF#k1Rc_4(b2Z3ln Lgw&5>@n8P~SKBI0 literal 0 HcmV?d00001 diff --git a/dsLightRag/Routes/JiMengRoute.py b/dsLightRag/Routes/JiMengRoute.py index cad42929..839af5cb 100644 --- a/dsLightRag/Routes/JiMengRoute.py +++ b/dsLightRag/Routes/JiMengRoute.py @@ -7,6 +7,7 @@ from openai import AsyncOpenAI from Config import Config from JiMeng.Kit.JmTxt2ImgUtil import JmTxt2Img +from JiMeng.Kit.FenJingTouGenerator import FenJingTouGenerator # 导入分镜头生成器 # 创建路由路由器 router = APIRouter(prefix="/api/jimeng", tags=["即梦"]) @@ -48,3 +49,41 @@ async def prompt_input(request: fastapi.Request): logger.error(f"图片生成失败: {str(e)}") raise HTTPException(status_code=500, detail=f"图片生成失败: {str(e)}") + +@router.post("/generate_fenjingtou") +async def generate_fenjingtou(request: fastapi.Request): + try: + data = await request.json() + image_url = data.get("image_url") + prompt_text = data.get("prompt_text") + + if not image_url: + raise HTTPException(status_code=400, detail="缺少图片地址参数") + if not prompt_text: + raise HTTPException(status_code=400, detail="缺少提示词参数") + + logger.info(f"收到分镜头生成请求,图片地址: {image_url},提示词: {prompt_text}") + + # 创建分镜头生成器实例并调用方法 + generator = FenJingTouGenerator() + fenjingtou_content = generator.generate_fen_jing_tou(image_url, prompt_text) + + if not fenjingtou_content: + raise HTTPException(status_code=500, detail="分镜头脚本生成失败") + + logger.info(f"分镜头脚本生成成功") + + return { + "code": 200, + "message": "成功", + "data": { + "fenjingtou_content": fenjingtou_content + } + } + except HTTPException as e: + logger.error(f"请求参数错误: {str(e.detail)}") + raise e + except Exception as e: + logger.error(f"分镜头脚本生成失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"分镜头脚本生成失败: {str(e)}") + diff --git a/dsLightRag/Routes/__pycache__/JiMengRoute.cpython-310.pyc b/dsLightRag/Routes/__pycache__/JiMengRoute.cpython-310.pyc index 6a16ad1f2986c0a321c9a396739253713f3477ba..7cc3e6c694ce268f4f2b792d50a2d58f48c79c4f 100644 GIT binary patch delta 1263 zcmaJ=&u<$=6rMM;Ufb&*N$kX-q)F437OYl991tQx1rD^Nzd*DS$QP^1OpT+&8;#d$ z8m)0j0)&dF3EK*Zq^d0iq)3&TsuiG8ap6xu;^6x_$*HGYtG>66QX^IDYQLR%@B7|7 z&3yCF`nM-(ClVIJ=iKzKU;Y$ZPVR?4mXCc>lT3yuqLWt60;af($Y=qiwa9ZZ#p-dD zXh1HhLdqQP!mnG#Fw>)A^^}Y^KqeH7r>}6ClwI@29OQa~Om|17N2Y>IpM;Ano8G1l zE@Yt@{qWP#&+Lk`{Lj1nI8C2Yr8C7+;gVfBtx8H?c5MAH4qw3V_7X6*(}%LnCy)J& z<<`xm&9%o{_ZR(}v#r}3>)t$9{W~V+TMJA6jl0cgaq@CO4@J zICVUQtY-A1=`l6s6zx(rq~jRT`v?*Qv`iD!I@3qIKgDU-=LzGT+Uppd>3y@%ZcOE` zsM0w0>e!Vr>}~G}y_2`EW2d+jFNT>V^!ve1*w~D^}PYqXEF2&>X88u2DB#?urJlhTKs3eH2Ee zwJRiDjJPr`6Ef+BiXgjI#pmoIGnm7#DPUC-*i6C^^|0)ABCa_eoda9}8w2K=vmlXC z`^vluD6p=5vn%Ke1U)2pK@XPhh_#!b0;IpnvZ)L0{f$j&dveOjJ8Ig|N!+Z;D+uk= z^;iDd{Qf(Cb;G}Ny?wyCyM|faMZDt(ty{nO3mg8zx7)W@{k2D%x9;M(Z{7dB^A%E?`)}vqko3C{e+9uO!ETDT4nyD9V z$dB12N0l6%q3o*&l|h96S!iT98`JxVO++mSh6oN2kfCyYg<6O2@?^X`I!_-Y#vuZ7 zwLXlH4R`pNtgPQaXhwI9YipgQ;A;d&_TVUS(l0Uh+n6YiFm{0P>zpUS!q?z&Fdz;Y zZVDXX%;MglF=!q`ayH|AV4Odc8#+@wuS$gzXN%5>m)vU|_HGylVaU5@oV-MLOOv>x sqoB8-t;llzfn$wi8TUlqkc2k8<*-!rB(jl507Sw%!BZ4Ay< z5TTQWIu#fHghTdz`~)ZQjhlDebI0@C2ltg7$eOFFGDGeC;`OYT2()?h5G)<;0*jMa zv=EkBY()a5D?{oTRTM~oP*Z7WSf)xEq;3XN1uKAR*;5v)Si9k`QDp|BBSudL)4f3% zouEa#gBZr2rI#ij!%;sNw>y)U;qw7>V$pUZRwJchShS4w`Fbt9pH^ovpZYPERun;d6 j*Bux8btusvnPyChjL0hJ&uP{;nPWK~@ksa)g*^HNnV@J@ diff --git a/dsLightRag/static/JiMeng/image_preview.html b/dsLightRag/static/JiMeng/image_preview.html index cb452d8f..9c7f0352 100644 --- a/dsLightRag/static/JiMeng/image_preview.html +++ b/dsLightRag/static/JiMeng/image_preview.html @@ -128,19 +128,71 @@ flex-direction: column; align-items: center; } + /* 新增样式 */ + .section { + border-radius: 8px; + padding: 25px; + margin-bottom: 30px; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); + } + .image-section { + background-color: #f8f9fa; + } + .prompt-section { + background-color: #ffffff; + border: 1px solid #e9ecef; + } + .section-title { + font-size: 20px; + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 1px solid #e9ecef; + color: #2c3e50; + } + .btn-group-image { + display: flex; + justify-content: center; + margin-top: 20px; + gap: 15px; + } + .btn-group-fen { + display: flex; + justify-content: flex-end; + margin-top: 15px; + }
-

首帧预览

-
-
加载中...
- +

首帧预览与分镜头生成

+ + +
+

图片预览

+
+
加载中...
+ +
+
+ + +
-
- - - + + +
+

分镜头脚本生成

+

请调整提示词,然后点击"生成分镜头"按钮:

+ +
+ +
+
+ + +
@@ -160,7 +212,9 @@ const loading = document.getElementById('loading'); const backBtn = document.getElementById('backBtn'); const regenerateBtn = document.getElementById('regenerateBtn'); - const confirmBtn = document.getElementById('confirmBtn'); + const generateFenBtn = document.getElementById('generateFenBtn'); // 获取新按钮 + const fenjingtouResult = document.getElementById('fenjingtouResult'); + const fenjingtouPrompt = document.getElementById('fenjingtouPrompt'); const mask = document.getElementById('mask'); const maskText = document.getElementById('maskText'); @@ -231,11 +285,54 @@ }); }); - // 确认满意按钮 - confirmBtn.addEventListener('click', function() { - alert('首帧确认成功!即将进入下一环节'); - // 这里可以添加跳转到下一步的逻辑 - // window.location.href = 'next_step.html'; + // 生成分镜头按钮 + generateFenBtn.addEventListener('click', function() { + const promptText = fenjingtouPrompt.value.trim(); + if (!promptText) { + alert('请输入分镜头提示词'); + return; + } + + // 显示遮罩动画 + mask.classList.add('active'); + maskText.textContent = '正在生成分镜头脚本,请稍候...'; + + // 调用分镜头API + fetch('/api/jimeng/generate_fenjingtou', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + image_url: imageUrl, + prompt_text: promptText + }) + }) + .then(response => { + if (!response.ok) { + throw new Error('网络响应异常'); + } + return response.json(); + }) + .then(data => { + // 隐藏遮罩动画 + mask.classList.remove('active'); + + if (data.code === 200) { + // 显示分镜头结果 + fenjingtouResult.style.display = 'block'; + fenjingtouResult.querySelector('pre').textContent = data.data.fenjingtou_content; + } else { + alert('分镜头生成失败: ' + data.message); + } + }) + .catch(error => { + // 隐藏遮罩动画 + mask.classList.remove('active'); + + console.error('生成分镜头时出错:', error); + alert('生成分镜头时出错: ' + error.message); + }); }); });