From 02acdc50affb84cd24f341d1fc2d3a9134b2ad3d Mon Sep 17 00:00:00 2001 From: chflame163 Date: Thu, 23 Jul 2026 13:45:00 +0800 Subject: [PATCH] commit PadImageBatch and RestorePadImageBatch nodes --- README.MD | 18 +++++ README_CN.MD | 19 +++++ image/pad_image_batch_node.jpg | Bin 0 -> 43165 bytes image/restore_pad_image_batch_node.jpg | Bin 0 -> 39651 bytes py/pad_batch.py | 103 +++++++++++++++++++++++++ pyproject.toml | 2 +- 6 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 image/pad_image_batch_node.jpg create mode 100644 image/restore_pad_image_batch_node.jpg create mode 100644 py/pad_batch.py diff --git a/README.MD b/README.MD index 35116a0..6df0f1b 100644 --- a/README.MD +++ b/README.MD @@ -147,6 +147,7 @@ When this error has occurred, please check the network environment. **If the dependency package error after updating, please double clicking ```repair_dependency.bat``` (for Official ComfyUI Protable) or ```repair_dependency_aki.bat``` (for ComfyUI-aki-v1.x) in the plugin folder to reinstall the dependency packages.
+* Commit [PadImageBatch](#PadImageBatch) and [RestorePadImageBatch](#RestorePadImageBatch) nodes, used to expand the batch size of video images. * Commit [ImageBatchToList](#ImageBatchToList) and [ImageListToBatch](#ImageListToBatch) nodes, Used for converting single batches of images into multiple small batches and vice versa, with option to define the maximum number of images in each small batch. * Commit [DistortDisplace](#DistortDisplace) node, Generate displacement deformation effects for material images. * Commit [MaskEdgeUltraDetailV3](#MaskEdgeUltraDetailV3) node, By processing different partitions through inputting a trimap mask, a more refined overall mask including translucent parts is generated. @@ -1849,6 +1850,23 @@ Node Options: Merge multiple small batches of images into one large batch. ![image](image/image_batch_to_list(multi)_node.jpg) +### PadImageBatch +Extend the Image Batch to the number of frames that conform to the specified rule, such as ```8n+1```. + +Node Options: +![image](image/pad_image_batch_node.jpg) +* multiplier: The multiplier for the frame number rule. For example, the "8" in "8n+1" +* remainder: The remainder of the frame number rule. For example, the "1" in "8n+1" +Outputs: +* original_batch_length: Original Frames. + +### RestorePadImageBatch +Restore the Image Batch to its original quantity after expanding the frame count. + +Node Options: +![image](image/restore_pad_image_batch_node.jpg) +* original_batch_length: Original Frames. + # LayerMask diff --git a/README_CN.MD b/README_CN.MD index 62f412b..61a9dba 100644 --- a/README_CN.MD +++ b/README_CN.MD @@ -128,6 +128,7 @@ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' ## 更新说明 **如果本插件更新后出现依赖包错误,请双击运行插件目录下的```install_requirements.bat```(官方便携包),或 ```install_requirements_aki.bat```(秋叶整合包) 重新安装依赖包。 +* 添加 [PadImageBatch](#PadImageBatch) 和 [RestorePadImageBatch](#RestorePadImageBatch) 节点,用于扩展视频图片批次数量。 * 添加 [ImageBatchToList](#ImageBatchToList) 和 [ImageListToBatch](#ImageListToBatch) 节点, 用于图片单个大批次和多个小批次互相转换,支持定义小批次数量。 * 添加 [DistortDisplace](#DistortDisplace) 节点, 为材质图片生成置换变形效果。 * 添加 [MaskEdgeUltraDetailV3](#MaskEdgeUltraDetailV3) 节点, 通过输入trimap遮罩对不同分区处理,生成包括更加精细半透明部分的整体遮罩。 @@ -1660,6 +1661,24 @@ BooleanOperator的升级版,增加了节点内数值输入,增加了大于 ![image](image/image_batch_to_list(multi)_node.jpg) +### PadImageBatch +扩展Image Batch到符合指定规则的帧数,例如```8n+1```。 + +节点选项说明: +![image](image/pad_image_batch_node.jpg) +* multiplier: 帧数规则的乘数。例如```8n+1```中的```8``` +* remainder: 帧数规则的余数。例如```8n+1```中的```1``` +输出: +* original_batch_length: 原始帧数。 + +### RestorePadImageBatch +把经过扩展帧数处理后的Image Batch恢复到原始数量。 + +节点选项说明: +![image](image/restore_pad_image_batch_node.jpg) +* original_batch_length: 原始帧数。 + + # LayerMask ![image](image/layermask_nodes.jpg) diff --git a/image/pad_image_batch_node.jpg b/image/pad_image_batch_node.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc69ff904bb528449cf79989ff85ded8e7b2f96e GIT binary patch literal 43165 zcmeHQ1zc6x)<2g^NGeFT0)nJ;!$p)70VSj?x}^~WE}$S?g3?!M3F!`%?nYYa4r$5n zF!datj$^!;dG8bTceb2;cE?)(RR_HXZ-8Sm64DX?1OfrBgMWa70YDr$f{KcUigE-E z4GkUr2nH5DHWnr(775<*qxcl0RFo8?yab&`w(5 zbGQaQK0jlB3_GMbmo0e|q7=%Q`B&2kw=owBka&hzU^6?9ZpF1xhDJ3m)SxH$% z^@^IhwvMizzJZ~Um9>qno&9YG_q+EzJnwsX2ZuZe4SV<~JmN`Qd_rPUa>~=}oZP(p zg2JNWmz7o3HMMp14IQ0b-94{*`}#*l$Hpfnr>19S->$5#t#52@z1u$Q7X*O*+^yew z_CdeEL4Y73BSVqV4*LZ`vIGA?agk9@u%qIMDWcu5IDV4D^$7mipvPG+&}ld?Efd_d zY{wv^kXD>Q_I21%-f<2gL5oZ1(K@)hy(-BFU$Zr!|RL>lz?whz+Ygn z!%*92VCb$T%Lo+kEx^bQ0~Eaho&Xs@8&awO-2f99z6t>TO*l4K<8i3n2n;jVK><*@ z2?xOHO~D!;kyT&-T3_29U(~m-qaRd#0sHkmfE8>Q1Z)eEuL1EO;f`HoR~HMC{O?vfc`DGIC25c#|XgsFcDh~uBtX9 zN)I@s?J(g&1WrHfhyy8rCI%+Zcdy+8zxwTS_VO(R+MmzzT0l)}2s3m&=O zldAkE)y)ncW`OMcmrad2Al}vn2w(u}fcz*(XB$9{io<~E!-S|0$QvM#g|PuB;xMt# z_7YAAKeomN;JAT_<69v0|K8`?P9Q!1=d*vNHdNl%_`vp$#(iXZZ6MBDF(r*FI4 zKTR2;^4R$^K;C@=75PO(PEE^OkZ=1ID)LJPg1B#(4}tbAROJ6Na{3F-h2JgLe?L}! zZ1hi_sQ=lK``T(hya$M1-%)^0fAzKTVJH1Is{xTu-!dO&|I8)zzuUM&r0xem_c5vx z>0^N5elB#|(c!W#0{G{U0Ew z|3Dt_;p+Z>i`4wPWaS@qME)kg`N9eNA^-VDjNG9R_PdFFKSoM@89;|J;KU*Qfb)*G zgMLc7wshkqIxe4Uy~|^J+C4EZ>}dMW?ALnkI|x(0usdo{xpR_gsqB{|CDps>HAj>| z;kcvo_g%_=P1?Im#kJ29-P-UK%^EoXVge*HwJO0<>O6Oreo6j`0^cho`^5gvZw0n) z*X}WFU=}(`Q1u-<0Gy_OPWLV!0Iia7y{sb(#4g&E2Y@hT!1WT(+#7pAM>mImNd_F< zU2_n2Tcm9F+&Cxt`q!k8=xY1NiqR3@+x&tO-z(;mE&EiFpKsYGi~M9~aa?*tXa0EX zKR<)N8~gVr^H0p+U$!LPYt|>$*r)nwwV!nW$b8L;c-8)js^q~``#pN`9MWX{X0v6H zdLp!fGHr&!63%m-y}rrSQqTW^dL8dc|Npa>2jSYB1$Vt3i4sX|%7S`F0B4t1L)}0| z4uC*{V*m_){o@GhLUj{XY<0K%iK2~H6DaOpIaqBK_x9Xkqu4`CXRqbR=kHq%@D zo>f~%aha!CyiyfDpa6k^Zx0`M>A9^Yo0w$83L~+ZTp7=945SdSxOf?d&zZ;{C{nm(*z}`EDz^*qNp~?h&E18)R}o=VJ48&I++6<$ZgRTq`C`=B1mb zM}mj-J#B7*$#STqlk{Z`gT%Zsz%0z@mZK^Q!`siD4jK&dABSZX9%iC#J0JOK1%3G46lCin`74C>vNe?&(HopEC!6?{i` zV!|n_x*&PInSAphgXN6n>kaPcc#8wTaF+612kQu)#FgaDYI#8y3@S#A?3kp4{1|PU zP`!c&X8y{=s85ei;>T&9HAQV{Y;+uwZS+5f0`m={uYd|Ub}{o4;G*AQevvLEpryx0Th^&Es*UBMr&)OEH6o3=|6)z>kfx9-_Ot%}Yk5?; zcNI>ow9>q?lVK<@)_|oLKX{g|S76GXP#kP=l8NEYt~-ruv!=RTo1A*}kP1=ZTkmS} zX3YFH+N-H6U1I&wwRE?GrwQLmKGS?xV6w@e#gk25xL5^Vs>)=y)D8I9?CS{$FVAMF zSKiU0qa_h~!c%a=UENArVgXmzQ8U5LXyak_055Am!Q6~Wbaz#Ew9l&u-o9rGX<;Mk zhG!QC&m4>C#*OaOw#do4teE8_u)Yx8-SB3@X*P~k*MeLBM!)>-z4-%RF8crwpkL0a zwcIaA9hi_ay4(XfAnV5l`B}?U4b@M%T#T30`fKhq22E*rz&r zEqhL9Q_VYKUWpU%h^GlVkA+9e=DK)ZmwgXeLb*hlGQD zL2DK}_1t8t6{nrr0T4(SZ~$lyY^x}2jT^EAW*gYrI$wBL?CO778|$$)otLnKzU$oC z6#8r;MvcseVtIKtgj*1V_0QP_64h1*sCw=xmf>~rUm6Ov5oQ#WwKrQZ6WUSp!l=6L zK5h8Yv_!a?VL(ZiFi4*u{_-p-{B9FRP)%fu@LTanvv%?%&Lg~Xj; zi2K^fD19f&(Fdj}Hz`Q_nHVx`m|o|g7x@ujvQy@v; zBCv2M#69*bgEAYdifgTG(3KhXMm=+Lv-5cw3r}qq^+jGrCF$#ARK+Fq?vzpD-h5T; z)LZ0=LyIDly^nvoq+h1eqGP%){fK~|8Y|7RBX>?iwo_7?j=Qg;3JaTI%99G#yAjCS zK7%smF?!i61I@h1p;TT8iW0+%BZS+JwwzlGs@BmAe0YG*l&u)f2_=ia!gPe1uC5&r_5US`*yh$7P(ukx{{AxkQZp zlib~h-<&hdfxw3uti0;rEcSRg?o&nicRDMBUz{orWDmB zTs2KHFS;OiwlGy={Ul+dIQmB0Q+aK<+dPq`^nHtY*B=V$FrRxGd)8%7S!l%}0rBoq zdk(K+=R~KOFJ9oFnd((vVWTlRI%`=KU724mqkmm9kfz4{a+l44cdw8O^ksU*+Ab0Q z)heW4tGW6i?fMyb=HD)jvnl=0x5?X{Pq+7+Q@tE0asC#!zMc)eMHjrboA#(BzE$q^ zJ>#d|xn|mmvx@1yFX6oA2f+B{PM5hj7fvU<0FETys)Zqg z;{F`DOKbx6%Ei6P(fbkARkCSneJND>IlZ2p{3K7%R|*Dc*R%As3OgTn>kz4HG@byw zgf~j0H9Kd zU7xS$@fKunwXp8ur6laS;cFJ8bCalF4(?)ZM;v$X{I1sp9*-fJtumFw5` zP!n8^n2(VpxYUi=tv`I%8N1vjIjYZH78mOf#gQ+z#-CnH5^b0ppxAA~eF1`5Jt;d) zB3ieb8XFnLdMd2s!lVsmVtLo8LjHFH6O==#_8H3BJc|uYX=%zYums$DlFygX@1Nap zS?_a+zOYZIWXH3vrQY#cxzKMd^0t;nI8~~XecEHx(LB~m((~HGv%I8vRkEk56z}?T z5i2(v5+|P|v*a?r(ZO}Qypb;cRY)>QUpzype{Zr+)OwlsovgMN<*!jY?Y1Q#%_}>+`vnW>2qS>+i$VMfa@CXU>V7#?hcIJOF}tTKCJz4gkH!F1TL1(2R8J zbmH>_&7}o)IIaVmk;n8q@k1W0U#v8gwAgNpk0I|I7PK%Y3G%MNxy8S9PJ{<Mb84o;Muh0Z$*tTtQa(rAW zBlfj(mzJlt_s+R=mUJukVNje~&T5|MI9-))_Ch3g&g33;(>Z^MN9Uf_oE9 z&MU-?mA}1no`XXwD}Tc5N%qsud+oPWf`sT$ehBrM;2e zdyFnfqNKrV&(>K7P4K z4f1+2-)cQI;H8&iM9c{k=G^3X@FLH=^L(8`bbB3t)1+wL_mqUV$EBn;UzNn`b#=EI zl(uob0TL1%5}7D{F#TI(@2KQHKve0kkJ^#|KQn zzf(Uw{#D2c%`>3I3JUNCrJ&XXvSYULRI=5o7_d5=liZa~P^3`Y z9W|fL)hU!=*;4Jb$z80{=6;dFS+_vS%rrfthy5;R;;1NT^I;{Y<%?7mx)!m%>6oz>pGVNqab>TUv@=d=OS`XYhE#K7w)vd z1EtVMr+R8)cWGBob4Y6Il24_jQi-<2^|7X9xX@4DUKeyxc-LqzW8 zsGOS3$)MYfz6@yQP|Bh`Lrd1H3X^t4OmF0Pn)h}0T!)_Yl&~7Zl7;jvM^hG ztyC0Xnuc5Ftd)6cXgp?rO+qNuqQFXbcuZfj%6-WDc50 zWz#930t&5&q!xUk5-^7Jb~dJvObw` z{#5TkappB6P9xOgj8EPv-hTy7VGxoLudy{9@bTX4Lg3i+9KSQuJ(6oYG_>Oe9LS*hd2wD#ERFOoN;7i(L#Nj3!TZacl|r)Da2!^o_o-r%~RQ))Oc7iLKkZhYLeD7zW(U^s*)pJ-WnCZM5j_=PK9yx z0BzF|ZEAY{ZRG~^RCMVi%iPOcs^}c9MdW;FiDJz>8EGdr3oNf`)mt$rtdIxB`9FHX z6siWbvm-OLU`c3@$21MX5qlip{fPc%^G5P!M=e_rGTsT6a)SOV+c8GkI9jL^mT%rN zPZ>As>vK&5YB8b_NqwxocP34%=QmYjjlwq@11%+?6sW>X=kdXPnZGEPY?L$0YcVL3 zm0ANp(8$R*Q+)B20|z7RuqBmaFBQvrg>hR0fP28zwJ{U|9UQq5uN0$@*&N!OG$Tb@ zxI6w?48}S-rUy^G-iJ_eZYm!DQc(v${x8=^5mZ88n16i0f2Neb zPOGe^!=_N6XG+(75@MAfAi5G+pK*$49>S6&6G?Fk3Xu8P}90beOj++D+k# z8IyY)+|0aGZg^F4e>IDK{V{Dmrf(wk7sB3?x(C2D(Vd0eIX8`*1QY7%(^y}u>ixe5 zQme{bKM`U9om@12;v>z;=yO@TNq*^QOTna8(|qMmNq^lz<{zmaWANX#4qD8_!zai5 zz}@blk@MJunx5h`)|Z-Jeq1o{Uu{VUad;u7TGx6K&N6>(5wvn=+dL1D5$!yIWBcs2 z!%(aDrxDPb2Y|H#B+I3k0qCt50$GtCIlt2=LGkzAi4K3lZ0JKC^aF+NZ!{11iJ}HI!7g+kA%0jHar&F=?2?PBPVa^W}^1jIs_t25Vck|cqZI*QvNxn3D z=K(DQPKCrWS3ysTl_P(FDv4CLW$!xw%v#1a9}(ZGT<=(_kD{%2(Y0&K*4uJL#RZWI zgmarKg*uy?1l-GJ5tBZ}jQ(_TD`g~2s<>TOJDzk-7TI*^#_-+MNx5e!YfFI*TFHO3sz3y1ncdD?V|Cc~OuY2mVTz8GnjW z|8etWf+K<~GNc)yDO(O3f~JZzI+6FyZq!SPcnV`{tKXdwweJWu=u$tXaw_pSWKzbZ zp9^^Wr5;MYT~+OK9#g)-4)VhT?K7ZSMbcjFwl`3Lem;hix&al%GyisCy3@IhwvBOJ zYt^$DnaH?p-rMIEbA=?7yJHyE9BX1JuiV?zub^NONM|(L^G=M6$QmP9tD9-#p2+5hjz4S|8_2rm-zEe&98JE{%E3A3u-57iMK$V3bx1JxdZZtWwsF=VAE zZpL~eIvBO^Ixcb6J3rt`b@gzxqj~zQgK5K~M%WC8xg-TUoB=7u>sIr~^un6YoUxo_ z^Qjx`7#;o=Zeq=Vj(y;)#3I##tkg&$?wbbpJ-Z_6H~aVypYODbC}<9VdXa$r3YW(S zY^q~(5Brt7z10M&Bd_$eJeS=@k~e>gKr>eF9u9q0ZF*hXji`_IezK^2b3MH`knU*C zQsF;IY8y+?6vgLN+Yp~jR|08G2aMHD#W`*?YF$&zD)xJ$y`HCFZ=H*pr*YdjbDu) zrYg=Z%v91;JFNh#rFP%vg1pdL+R+)-K|&k0JBNUKcA~;L^VqiDT8inQ$U=rJInSax zHs@xx8sqoOr$Z424Qq^&#Lwb=s|hiYyVKYTkH@`mi4W5HkoYz>5?Q#RI) z1TuFGXA9UCSb!y)}5UhwX>e4+(iZ`vw3Ro zyri(-6~?q`DP`-u5x(o0fx)f79^Typ^YH3E)msI`RI zZrbtUWpo=yBP17jHW8@(ng*8*+Xr3`42lbx$j6$xPeS+R+mMVS^2*kDY{M)X^7HR2 zlitM4cZ_mkfRg?jM)NC_@?|Q4+>uJ~Ej8=r?AxPb%|osQ#I+e#TMCe8vw=nhgdMPK z2JfMprf+a06VXTE6zN8pM(SO5f$=`1Pm#z0=c{GdfI;kWbt>GU;YWHrb_(xU`S2ic z4*ptmbwEo{WqIF^xz(6r_Zjnr$O-h7sZ1cCYDWP@>*S`MkAE-^E0#O1NhZ@0EjQfdD+n-qUfH$|o;S0q>B+O4 z!yL#QMW%6ifD-i?YG3yksBmV(;_`wgXRmj1pA74(^DwCLj$NDzT1%f9HM*?g)7D^p zg4gywt8QtR`T4~p`%OFGhAi;Zy)M5;(b|Dm z3?Nd}Z`_VPMxgXo!SPq?M&Ycv>bKg16`2nJbB-HvOe-ksEuzmxVEAW)(SbmLw=lc` zS~(kxAtEUfj}5Vqf^r5V*{$^8ZJjJbo&3uyT<%zsWq=AJ4A~7bZ2<#4q(MLy4uVX6 zOl*w{l9XX69p7qBD${{}T}}Fi@9};($29cPoU{}d8HJdRp5sH^)BdQ!4A3)fI7g_r zNdcrBr*3*mH~6XST*tXO(>Q9b4E*D5`aN*M?G`za4GlFZ7BT{60dfZgWU?!)^W+Yr zaIX2a_~N#urG6Ead`2WlrA`~_jZ1}fG$KzxZ2+!Z3U+QMMHbqiI29Gs1`c}?1lFcj zHi!Q$3)m5*lu9IUB%sC?D=`ihJ@8{-BVHg-Fr;Xqu3e*W`kb7wl@&6bcUM&~Frlt7 zYY^v7aYG@g2)U|AD;gRp_qO9T&JQ5bRuH#I`-jX~b@e5bp7;=KfJgF5oW9jP#b5)Z zW`D2L*+7;CE}mO_O*dg`y$)lUPZdotHf=ZimAh=W-A<_4d)w#a1w3vQmrez8;V-WX z)ywZl!14b-TQ?A`9RQ&2jv|cc>!_FC&iz?aeN)Vrw_f+7XbjY=35_BiD8`^VKLFCL z=NFm2G~%t#P}EwH^*uSy5HTwb0iL8S?LNp z-p?0MRZbfeq{+-&O%|t}g}{hlO}EQPe5{>Z+>D-Yh>s7wLBZ|{BM=g@vF_9tu;yuF z5^Z%ljiI_174upQMkI8eJY?(Y@Z`#5|Kg%x09$Lp3D-;LFQ_qqxG}b^J=3dZRBovAs~&$uCi{3qG%g;ijN7MY3p*z}O@@nz1G0IPg6EwmxI>BLf5F{@*cTR9$z@?a3x$`9-0n_ zIXxYmaVBdgZ4Tp)_i}w`zzhhZI_QI*8o71$d$Zfj7Lj}+lU8(tU}PR|IAQ4N_8yzE z-SM6CLWL#^S;U@=$b7Z@bs)V-^r~aPzC@ZQsb2bx7YPh)oTW1YxMzczT5(_Dg;2?8 zLCkqCTi0Auk!S-*7$tRiWVLADy!H-eQ#+Xpv*|$HT8jZRv};7xNo5gKG&rTJI1NEy zMPJZ+u|+3_0$=3dgi(fL1vMgDo>i)9z#y2GG#Zo?9ii$p# zB+>;ud;0PYJ5EF@b&R0tce28AFQm0;9h-_ES1mWomLG|YDQ5)2I1`r#HYZpQ)XA*kFZn>UX zg*FB}x;`F7S-MsYNZ)C*k61kAHapy;F+gi#u7kTsBWg#|45*r8n@X53lo7wtN16-S zRzSIL6U}If^h&1OZTx;Cr|dD!lopA>7>B4yICU4dF@6V;Oh?=!SnH%5^VZ;0!No3! z-jY(=y7|c|1=;Z;e>%TliV`x)yK9IedDo6<3>j@Zt*7Dm7~RJ*cWsDzb3KLu@=9RB zmvr2rJfc9vs>pCOinZgY0{d1QlFw_b^VY9Y3~w`gGUsRCU2&(nx`n_9>o3JMC{Bp0 zYGfHmrS_Ake$fI_BUqi>Qp~y07dy@e)?0fgD`6pVzKQ_C?{J5r?U+lDP+-440My}h zo&8i;#$o12~Q;%Z`gM!{)C*f39skJ;l34PDA)2rih z2&u0JTe3F;hDJpFCY!Q6>G4-3Qx-0@$C*lBNb1(uM z%)2FBW@a>4cxq~0yqd>j43JVFuE;u+N4NlWO(O>*;xsmIv8ekAuo36*898YLjc&~3 zwAMAvvZgmTq=}U%pIbjJab=-C6Dguo>Vk_v`D0hJAD4B0+!N}5!b#X)jx!g17pxSu ztiYSwN7lxT>7^p-F##rmZ9GmG$)?>yqF2}!HcYZiHhPF7e}bUt^Q?C0I+iBwAd~#^ z;rW}Qho#sNacZ@!4oY>%OfffE$^qx!Yca&brAK!E?cd_0`Y*CDxYoHp28ysWe^&EB zYR~r`KC_u~-;xi;F}1t^I~KXX?z~V2+NGC1cVPrXbFB}6cdHNg_Z1*}aY>-*dQ`>c z3jF8-h3NjBi36bG0pMZ)!Vs%dYKWo>&qT4VD}pfDl~@6H}4?22u&Z8<#tU2bK|7hIF^% z4QX$-)Y8VR0S!Q2(o8{ddPje+dZU$~wNzKgx`_KQoal0A23NF%F=n1};oW;dO5;%9 zF;PE2>6hchSXRy4Y&8EalsP?5jE@9?7K!;RPtGK;G`O;)3D>W;_HwNe5L|iTp`!o9 zXc#`>+joAGB7*@&Kmyn(g9G5EmX8myW|haf__?Ot>)Rk{rO~LLT^iQcM=^RcA#g$( z^oRAO8jByfHw1RrJhs<|;yFvy)VZGzVG(iO4HlcP06nQs=3xsg$&`mRY@>RN(s)WN zfU+%>pCtp>Ql)}VTb~>N#xL|~d&K%ErD_)LY74^0aU?+)h84`z-pN*)zr*rk$n?aE z)@3S1*m2FXJ*%a1-SSf~+_pnQ^c!a=b&~etU>M&e4#xNO5d8OGqnPPDboqCkdPlA` zt%H;+50OK3zk2ULy@lXjm!G8pwCfK4vYBL`#VA>{`?EgN0s4L9J+zV7big6;VcbkV zOLBgv$!NY$q2FzDONWp}1L%}Il}p`bn#-#f`)A?DWpg_vJ^(4qcx{(}|XA`ao`slo} zDI9JRifgrEdn9pLC{Z*W(4Ohpc22bM>ZuYZS4ou8UM0ytvjk#e%sj<%N%zv$1xv(* zT4|EPXc=kw`ReBZiex0RMqyEfHl1#+9c@FpQdfHSCf0aLUvvaE=Jd(pvgOj_tXuH~ zeri^}zHKOia(Mk?SG%FL^u1|nkE#h}MQIuR*C0mNtgTo4M~Arh*ZO)mmK(JCt^|yj zzJxROs?R9cYZ|HMn_4gqK6;6cu`~vkzX2MpqYP#?+t3EWsJ;AEsH^h>F2v-5(A=jz z0(?f<1VW3WUFZ*c?45Z+{to2>$lO(i<&?KPWl2WCMjQQ?hs23_9%kQ-5puDxYVGtl zfCg_x+t9W8PN=aYy4QJ~pfsqILUnd|+zeQB{jBTcIQ3%b9Uj?!`S`vpjA&PKc|hzf z>btw5H%ra#?A!wA_Y$UE#Ft={Vx!kQBc?n;r-Dz|=#=g~!8seS;i0m*}Xj0pH%-O=Zf~*Kb?96wos4 z9czlIyn<93=2_}VcslQ7AFZqyi2#-Z-rJ)m^9%3YIqqnt=X>FmOe4vSLSG!%oHt+| zdvy22HT_lX)$)Oo#z9_fb4{CSKwxr|a9J+2FoKg~h?DDv$D1>^X)+j~;;MPMuZCY= z@>I@ty%VYy7bBN(*XHFq7ldwNA;i8yB7!M7Vwf)u_3Rj?@7|I)j3764;L5IY%DV#G zT7rgVQkmuz-2gNZ@ZxJ`IoaWnXDU1q$Eg-7;jf@vKY!F}0Y(^?<8c5y-@e0ULr_|N z$KzCZejIs}o1?{UGEzc)e)}C>k*I=On!{J6()Ps{uXHHjsHEwnPy>Yny({=K-ds4lVHMmhZrz8k7{&>7^+?HD=EeOX?i_k8w zC;8a)*)$%-H^el&MG$VbC{%RfIp9~g(aMLwGQVHk?2+G0gXL*}ex z^5!N2hv(-@@~GXGoCQh}TqkDKVB{WaJPWNafzl0!5E#L(%7p2UFguuuOd?qAK&79X1f!CMo5g56L z`=3}YmgB1E{Wc`GU&6b53D5l(`l0;G9FP2t!^=VUwkK^F0T*W+C@d~BfS#J|Fy{BQ zVm*3O;LJKI`~(6;MdwySwc157G-OgBcyiLQ(IaM3HB7%|$||^*czjbx0a@uiol;WH z*+f%}R~J@pQ3u5~4Q=Mcum?B*EnjFg@(~*BH%Y@U@4_<{ueP(0-o`Fw*Y&aJCtl~9 ziFE)xz-86bIbYtA>STQ;wMj81!;vZhpbh5A&h@u!vNVAFye9rGUDdzLXC=y>=%Q$s z0!qWr>zqvQy=y?F#hVLu=z}J2tkNS0a^Ys38?c)pC3Hv*UMPRIBR*dtqqy$XL8~P_5nsc`kh`Fp<+)>=R(@!cG*VrCH-Dn0cXKEKWWj+)56mb8)1Pl=`Ov@ z5@n71QfdSjVSFu|pxjgDJsmsDd{UiaUpqGZOhiFIlR5jwxT69J<6#C&Rdt){=)AO5 z#`}v3rS|-F_`d>NpI3wW6xGKzL(08h;vA-Klhev+OM&kY(uM&^L08gbkoFHLs<*%(e3hme<>Jtun9P4k&cVbp(}u zl4b~BYT2T9HXHM4)>H*~pn>vhT5r$^&~jN=f{o6rELx8_*|vK|_v^txPdi7d0ku~qW90#rVPO|u zo{nQ8aYo@fhrt+EB>J7~K!udL3dPm~Q$VacC;4)Ik$RuQ4f^{k5Uh_xq`I#FPV zTZD{rM9A(10!vtC_T`%zX08Jun^6Z(m-Sj(6sXfR*M@@e-uC{&tqPT?yxL`5CbHO2 zGlKA6GLNdSJVP=j>?xcKP2NgB0BE=a_S_%uo5ILhe#ZGI-z_`tp92w(XGNmHZ787Q z#$BGaJ7VQGj`ltyixn9J&_N%O4pePBZD@h^4@V}8MiOq1-`7%O6E$!TjN5zM?eee; zu(XDhSPtvvMb$2GQB&QqfDsrRZu}pj^baE4{bI`Tvnai|;UQrGbg@*-g~S$)GZ z=?*6Gg_V^Sg~=)uUh~+1yv;_Vsldq69l6OOtt@eKOWk3Y{xy7vyh7o<-4hA09Epzj zU?Sf$%!n8cK?SJI?U9hmZDz$rvU*Y}3T0QOFygue7%At~nNf3Wu9fr5XI>&V95M9_ zC>2cr3}_2zv}8*v@cQ@e%7*$g#g=kD@8^RiN+Yo5j2m?;-g1)NKiiD&c2e_3Jw2Hd zXk8L_+XB;`Q_fY-w<)Af{Y<5$|81IdfcfE>1K{OxQ>139n1Xvvj)!nyt)>FX(50S% zDs!9!)8xJvG!m&os(AAZ&uu85z$sFUR8;Wnoi$E(j4*e3_DeYUj@!1<>cN>coiY~R zWta*n@$a&!`g?>;gg4mbp=yIXUD^*^7J1VFogsBO zeRhA{7xR)5l!!x0_33*X4o`Ei_4cjK!G@Klt-(c04JdiclsDl0Gtl|96aU%okn~E5 z9M9z%j`K`chq2TeXm^bzI!zzSv7s9B**gO1>uoQeu}e4<&4b#w!BQO!9sG^#^`Hgr zPx8gsbr8lW{kkaZ-xT1M_c{VVR09yuLt8Hc(AVN8Gt`1h0A*6Zpg1P3J8plrqm{& zA?T7pMGj#qe7a^l)v^|*=Jw1x4{(dw>G&3;|AXqul zLifgRHaSKBzZ~tv%oSyUpw75U^fzo7WF`+JIMMri=8HETS{u^Wh8X*u#xqjeXM8?D z9OXrs-3Jv=`oErx{q6Sr>>>JzoLDC>Mt^&u^$^J6A!qI|&n)RQVQAm6N1mD#F#4b=1G-Ch0p zO%_s{GA0OQCz$ZTM1d^0xG`i!2O5j<4cP5y!_~xQ2cH)!1npc;9ke{ zc&Bu7#}#A`HiE08!nC_0fXiPQ&;6V9Vg53k>JLq@KVt>_jqam9tnGg`#y!vvdXHcP zsejN4_%O2Y$2{zOG_LM(sNDz*GuJ@@Py!t}$KeBqG3g$WfzY_t?-glL&yaxu-3`EK z^~oUD@jX2Le6&43;`}NAU#hG6eWwQLucAeH8kV;hf1kkqK8UY;le*oxg zD|`_-8!lLEi$JLdw|NNoHPRodeEla}N*-Erew8K z?1;lJzA(QDCjEER;eWPqkUv4iebl+jDb%HxaH2m!+F@Pi^#+{(IqpKgjmoWo+9S{w zKyvpV6oUD4ek~8_e8?GIXE3gcWCDN!lHnL&couL*zVFnaAdrQz0Vo1gp!s7viqE>D z|G~h0tqbFC8o7U@3&nq^;lQU!hnG we*t#-9tZY?9QO|f?l<1`?;W|X!w)fGAGVskd<*fHDK7i~WPSl;AP0T_2li%gQvd(} literal 0 HcmV?d00001 diff --git a/image/restore_pad_image_batch_node.jpg b/image/restore_pad_image_batch_node.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3db8d760b87290d8981ffa0e5ebf5829d40b296a GIT binary patch literal 39651 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 multiplier: + raise ValueError( + "Remainder must satisfy 0 <= remainder < multiplier " + f"({remainder} is invalid for multiplier {multiplier})." + ) + + n = max( + 0, + (original_length - remainder + multiplier - 1) // multiplier, + ) + target_length = multiplier * n + remainder + padding_length = target_length - original_length + + if padding_length == 0: + return (images, original_length) + + repeated_last_frame = images[-1:].expand( + padding_length, *images.shape[1:] + ) + padded_images = torch.cat((images, repeated_last_frame), dim=0) + return (padded_images, original_length) + + +class RestoreImageBatchLength: + """Crop a processed IMAGE batch back to its original length.""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "images": ("IMAGE",), + "original_batch_length": ( + "INT", + {"forceInput": True}, + ), + } + } + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("images",) + FUNCTION = "restore_batch" + CATEGORY = '😺dzNodes/LayerUtility' + + def restore_batch(self, images: torch.Tensor, original_batch_length: int): + current_length = len(images) + if original_batch_length < 1: + raise ValueError("Original batch length must be at least 1.") + if original_batch_length > current_length: + raise ValueError( + "Original batch length cannot exceed the input IMAGE batch length " + f"({original_batch_length} > {current_length})." + ) + + return (images[:original_batch_length],) + + +NODE_CLASS_MAPPINGS = { + "LayerUtility: Pad Image Batch to 8n+1": PadImageBatchTo8NPlus1, + "LayerUtility: Restore Pad Image Batch": RestoreImageBatchLength, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "LayerUtility: PadImageBatch": "LayerUtility: Pad Image Batch to 8n+1", + "LayerUtility: RestorePadImageBatch": "LayerUtility: Restore Pad Image Batch", +} diff --git a/pyproject.toml b/pyproject.toml index a8806da..798b468 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui_layerstyle" description = "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress." -version = "2.0.38" +version = "2.0.39" license = {text = "MIT License"} dependencies = ["numpy", "pillow", "torch", "matplotlib", "Scipy", "scikit_image", "scikit_learn", "opencv-contrib-python", "pymatting", "timm", "colour-science", "transformers", "blend_modes", "huggingface_hub", "loguru"]