From 1021a8863ddbeb78e8b5d82bd45ef577d8ee0238 Mon Sep 17 00:00:00 2001 From: xChenNing <1915664627@qq.com> Date: Sat, 12 Jul 2025 18:15:05 +0800 Subject: [PATCH] First update --- README.MD | 18 +++++++ README_EN.MD | 18 +++++++ __init__.py | 13 +++++ __pycache__/__init__.cpython-311.pyc | Bin 0 -> 432 bytes __pycache__/image_pin.cpython-311.pyc | Bin 0 -> 3090 bytes image_pin.py | 37 ++++++++++++++ js/image_pin.js | 71 ++++++++++++++++++++++++++ 7 files changed, 157 insertions(+) create mode 100644 README.MD create mode 100644 README_EN.MD create mode 100644 __init__.py create mode 100644 __pycache__/__init__.cpython-311.pyc create mode 100644 __pycache__/image_pin.cpython-311.pyc create mode 100644 image_pin.py create mode 100644 js/image_pin.js diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..97a4712 --- /dev/null +++ b/README.MD @@ -0,0 +1,18 @@ +# ComfyUI Image Pin + +### 简介 + +ComfyUI Image Pin 是一个 ComfyUI 的自定义节点,允许您在 ComfyUI 工作流中“钉住”图像。这对于在处理图表的其他部分时保持参考图像可见非常有用。 + +### 安装 + +1. 导航到您的 ComfyUI 安装目录下的 `custom_nodes` 文件夹。 +2. 克隆此仓库: + ```bash + git clone https://github.com/CheNing233/ComfyUI_Image_Pin.git + ``` +3. 重启 ComfyUI。 + +### 使用方法 + +搜索 `ImagePin` 节点 \ No newline at end of file diff --git a/README_EN.MD b/README_EN.MD new file mode 100644 index 0000000..6f8cb95 --- /dev/null +++ b/README_EN.MD @@ -0,0 +1,18 @@ +# ComfyUI Image Pin + +### Introduction + +ComfyUI Image Pin is a custom node for ComfyUI that allows you to pin images within the ComfyUI workflow. This is useful for keeping reference images visible while you work on other parts of your graph. + +### Installation + +1. Navigate to the `custom_nodes` directory of your ComfyUI installation. +2. Clone this repository: + ```bash + git clone https://github.com/your-username/comfyui_image_pin.git + ``` +3. Restart ComfyUI. + +### Usage + +Search for the `ImagePin` node \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..6816bb7 --- /dev/null +++ b/__init__.py @@ -0,0 +1,13 @@ +from .image_pin import ImagePin + +WEB_DIRECTORY = "js" + +NODE_CLASS_MAPPINGS = { + "ImagePin": ImagePin +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "ImagePin": "Image PinNode (Embed image b64 to workflow)" +} + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] \ No newline at end of file diff --git a/__pycache__/__init__.cpython-311.pyc b/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6ccc80fcecc210afaf05311114b98022296d1c4 GIT binary patch literal 432 zcmY+9&q~8U5XN_trj6BLp`y@3jh+lbPof}NiA|6|n}$Y_hQQLgX^rMjNm@!h^%1=J z2;$r1C;>t6?_9=0f~=laK8-!_)6g~sNZ5yBgG5A07D13 z(0~wN%Ahc9K^q!0rg4s(In3bvkTMut(1E~y6E`5hm{r`~(9&!#rXIq8CgRg!ChRV8{_zn%_W7wFJPsUxD#T^AEy<|S6m=c7L`_rFD?P4cqNM0rQ|uyD zY{{#hD&*s}%nOZdFMBZNZskiPDIK|S-R^V)h71wpNs0>y^&AJGH?SZGmM8M5sY?yt z9n5YN^KKH3eHVFT$k4n?#fgnp)+R!>XO9u8jb=;s%=PiavFZUweA2InO_CBCLii4L xqyPJ}v^D3FJYY7T*@UKcs0fskBEhJ1PPj_AlCWT7FWRq1#fy0%UBNmr`~iBFb&LQ2 literal 0 HcmV?d00001 diff --git a/__pycache__/image_pin.cpython-311.pyc b/__pycache__/image_pin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e802a409cc059045bebb7c000bd13816739bccf3 GIT binary patch literal 3090 zcmbtWUu@gP89!2_{#l7>Q<}5J%^Y-5BPUVYEO!4Sa3aU9>&8(s|LIWH4a4Xtn;Jza zB$d^IT<9Ud)S(!Xz=e&WMfK38>5^eV(V}?_h7Elc0|F5aFi>FVfB<_?;XV|3+8re- zmXbW}BX#%P-S7B)_q*@D(-%8-1Ob-+{z_jCvjF^?G+bd?$`-`RI)DIDDiE4ACD6D{ ztDY<)Fj-b$sb;@d@Zx@t>dX2Cf2%Jb1f01+AxMKM0GZ1Gve#(Oz<2j;fXOk3}?@+Z1N zrzvdRZ<6^f$&l|j@&SDv&%D{5J<;XmDg|jX;GzL2QJr|`S)z(~7&4Gms5A||&MH%=_#F5W#27^948-Ima~XLRBdw@1Vlp{Ji+K6i~E$!4#pQ z8^qqwQ2F62ldmn#O`ObS(<=+pi>ZQP=CY!egR-%hBAo?AR7e1cc|}`nYw`Tb!{9Mh zF-#1~j}`Yj(S^4?KAk+fFfY!(eRgs#eoW1!B-I$hii_NV%^G94__+*f-1+8v<>EK9 zU;pmgb6=hN*Z4oDzMJ{SOzpQqZSh@e;+#Ek&KeQz5fLM=^tESf5tfi&moF9+U4}*W zxrxMl0)?6m7V>INg7e5bH$OX_oI-(YK{XXs(d5_3fp9=5*u+A~lwvFjrE@Bjb&;@V zAbv?U#Wq)R%FO92dJi$_BP+rDA+M3sO&MZtDFd;DY(wwEh!(LY^nL>G*+xe({3Mb{ z(l88MU_yQf582@(R(RA7k5&S8mma+8PsTrfv$|ppzGM%+gqs$3-sa9%*gE&j=J1QR zBVQi6b?DB^cVgD?$-7$ZEul8~PA#@rf8pgj2ksVXub!^OlMUAM?4Aa23Wn=%04C6{ zhl!7D0dr$Gnc{R}Y7#N06LY6fkWkp%`qcK=Y#-(S;JAF+K`zlxj(ymD1nFO551P^$ z*{ihab4LKkxCs=PWEWae>Pi4zU+|bD*jkclf34){#+5u(a&WqR4>teUpooV$F z(8Z^$!&Bw9&vSL??ewy<^?$FHfxf4#m+7=r#Eh>p+TIQ{IdhIczxj--W7gUX!@#ZJ zbsWJr+flsAl&BI@-L@Z(=E0s$n`s(f1ED0M4n80k4f4!RjW0Ry?{g<&6dp)4o1k$# zMn5=#hx7vuFqJQmGX>3+yo|h1zNDmNo!kg99(gZFhCF%%1ul#pfpQ9GTf`c9RWWtq zBw})TS<}f$(@Ef?o$`B1S~PV@Gx9k@M!r-|yCmx-qP09?C0&5uxgQ<97ahHA zSka?)^yr<09UZeG$L+}RN^mpO_u-o#{b8eM4Gh}@!&c~k9Xe2>4?OkyUu1r)We&Bbl9o=~E zZ-rZ{cNc2>DT_a4^QSPJi(E0+-@o>LRk8;5+XMS+y|J1<<|N=`EP(u?s7YB_6j4wV zvpHB$i5?Qgiv>w-jr62c$uP3AxtxRgUa~9xlZpAssWY>0qtNW+{K9OqdG8|s>kG+~ z^V4UN&i?2mQ8|{Hdqy&$P73nh$T*FQa{H;XT!Z$p_?G?s z*R11Sm){Tl$C|{9=`$EdPNT7gi-w1ys5%Ihou>}^YwlYIdumU5>tILOdFtR7wa&K= d_?r9HL7?nB4Q7zSOMSffk@WragaL obj.name === 'image_data'); + w.hidden = true; + + Object.defineProperty(w, 'value', { + set(v) { + if(v != '[IMAGE DATA]') + w._value = v; + }, + get() { + const stackTrace = new Error().stack; + if(!stackTrace.includes('draw') && !stackTrace.includes('graphToPrompt') && stackTrace.includes('app.js')) { + return "[IMAGE DATA]"; + } + else { + return w._value; + } + } + }); + + let set_img_act = (v) => { + node._img = v; + var canvas = document.createElement('canvas'); + canvas.width = v[0].width; + canvas.height = v[0].height; + + var context = canvas.getContext('2d'); + context.drawImage(v[0], 0, 0, v[0].width, v[0].height); + + var base64Image = canvas.toDataURL('image/png'); + w.value = base64Image; + }; + + Object.defineProperty(node, 'imgs', { + set(v) { + if (v && !v[0].complete) { + let orig_onload = v[0].onload; + v[0].onload = function(v2) { + if(orig_onload) + orig_onload(); + set_img_act(v); + }; + } + else { + set_img_act(v); + } + }, + get() { + if(this._img == undefined && w.value != '') { + this._img = [new Image()]; + if(w.value && w.value != '[IMAGE DATA]') + this._img[0].src = w.value; + } + + return this._img; + } + }); + } + } +}) \ No newline at end of file