From a70275c2970a42d6ad208d72a787de1c1446c137 Mon Sep 17 00:00:00 2001 From: JJMdzh Date: Fri, 27 Jun 2025 15:43:48 +0800 Subject: [PATCH] =?UTF-8?q?js:=20=E8=AF=86=E5=9B=BE=E5=B7=A5=E5=85=B7=20(#?= =?UTF-8?q?1212)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * js,识图工具 能识别标注图片的位置,并输出推荐识别区域 * Add files via upload --- repo/js/识图工具 区域坐标/assets/1p.png | Bin 0 -> 2085 bytes repo/js/识图工具 区域坐标/assets/Bagpack.png | Bin 0 -> 2208 bytes repo/js/识图工具 区域坐标/assets/Comfirm.png | Bin 0 -> 1261 bytes repo/js/识图工具 区域坐标/assets/Paimon.png | Bin 0 -> 2035 bytes repo/js/识图工具 区域坐标/assets/Space.png | Bin 0 -> 2136 bytes repo/js/识图工具 区域坐标/main.js | 110 +++++++++++++++++++ repo/js/识图工具 区域坐标/manifest.json | 13 +++ repo/js/识图工具 区域坐标/settings.json | 7 ++ 8 files changed, 130 insertions(+) create mode 100644 repo/js/识图工具 区域坐标/assets/1p.png create mode 100644 repo/js/识图工具 区域坐标/assets/Bagpack.png create mode 100644 repo/js/识图工具 区域坐标/assets/Comfirm.png create mode 100644 repo/js/识图工具 区域坐标/assets/Paimon.png create mode 100644 repo/js/识图工具 区域坐标/assets/Space.png create mode 100644 repo/js/识图工具 区域坐标/main.js create mode 100644 repo/js/识图工具 区域坐标/manifest.json create mode 100644 repo/js/识图工具 区域坐标/settings.json diff --git a/repo/js/识图工具 区域坐标/assets/1p.png b/repo/js/识图工具 区域坐标/assets/1p.png new file mode 100644 index 0000000000000000000000000000000000000000..3489f0be3637734e906ac8fd86ce12eb01f9c070 GIT binary patch literal 2085 zcmV+=2-^3FP)JOPDI!I!^-xc&y1(xAaa2uOi` z@Lu@KFQ9%NIBA6ML0H9TzYLaL1C7%mm5qr44|J?ALV#t*ij<0QasXrdOQ?f85M~mb zEKH2U{kOnCFWh=Jlr*CAh}Qa%-@;Q5LbeGs;FsWnS%}NO2y+%fPz7nkqyS1m=*Md_ z0aDi1Ca4H32YU9Px4r;FMi0CbN^^X3;IPp=ky*wLvrvrVCMk{MU2v-&ep+qoNQI zR^W!8B05@KO@1y&i7porE7l^e`V!G#AMW%PDkH;)&5uBD7upLk5)ML@(4uCgju1K^ z@J~fyPQg`7|uM7J2nL%xV#B z+VpkpW#HHlT(A(rB6TMZk@iOEZ&s>E2)o01N@y6etOkWe63BGrZ{c-Gq`j zSp?)1q#fq9OR(Q z+yc2Qn}4>N##Dmv-DLX!A|V(UE7H|_f?xf0H~5M}Qz3Tiau)ULc(~$2IBtS^e5qCYgjm0eu ztm>Ha-tOsAm1nmfrYU7Jx4D72tpxz4=QBL`wdI6f$P@oQ$no5K3f60wLDNhkk%Gx7 z4y<3tyyn=#k3_-%FJyP`&{@QT6BTaWuo-eT7$#eOzJ|-&rvs32Z0@{nF;Dz+FEkYh zo8};`*%w2$4w4pY9(s-&AAW(yw;aR|qmL#R0`%FBG=OVC)&>=_{-th875}~c_O?c{ z(=$-4612@j%C=dw=YgE$@Myr3Z@t5f8(w5j@6gA@??b#XWbLvfW0RE+DSuT<9r#r$ zb@P!rU5|~=rEmU*_U^}Uyc3YK=^H72Eb+NLQ6ml%N!!FYD@S0@sWPB33R$F1IGE*A z2$90AoWzqx&7yPK^zoSTVY~v4%{MQfPb!&sZ)<35l6Q`dgK3a+1*UpmACr!}Ktzlp&b}VVswx?;;2zPK-?<06&bF^h0_^iu~=Z zUjF=_Ly)P1;sM&Gd?Ke6Q;!aTX(LR5t~vUA&_7;c_Aj4}%c&YbHGApU2rOC-h6Q2uyot*}1bt&rZ-ZfjX+c9Bxf9!%(YF=b8%HJch+G|d z&o)dBbwS5fkZ*>;x6hjx08@gSrhV7Ln1vZQ1G^BRMp+q@$U>nxHtH@25G@d88K!^lF{rPH({Ix_+KrO-8LxyM%)SV+dGtRX1q`%Oh>ivGHBK6Q z4Q46{j1*B= zrN3!0BbTg1M3VH8tu&1vrm@&VXcyw?Q)|!)+!V}P0!R15sUfiKcq~qsh|b4f)!hGM zh!jei$e@BwB=GZX7=8(3vO255}8gdvvr)HZU*Wa zVe|x)C&94dvnqhwA3$>D3b^48DE1*jADwVP3GCscm|g`ktwf3RneqvJxadlZ=2^&= zIj~?kN{KV1h5^Y`Y;pf#sFdTsjnIe50l4W-SaCIyl7h8ghg%;8I{}p`kOtbc(bXz= zl`{gB0u)^KdB`~EoCBX(Su4RPen;y#w&kg~Sr{^wnXury_rdkwfRf_>|FBp$YV~C( P00000NkvXXu0mjf)VAPq literal 0 HcmV?d00001 diff --git a/repo/js/识图工具 区域坐标/assets/Bagpack.png b/repo/js/识图工具 区域坐标/assets/Bagpack.png new file mode 100644 index 0000000000000000000000000000000000000000..361984014c24ab492d7a9cb4051ba997d8cf4122 GIT binary patch literal 2208 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 X+5Fmk<6x2400000NkvXXu0mjfM`bz| literal 0 HcmV?d00001 diff --git a/repo/js/识图工具 区域坐标/assets/Paimon.png b/repo/js/识图工具 区域坐标/assets/Paimon.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc973750a7f64831f2bffbfff65f35a4887117e GIT binary patch literal 2035 zcmVrDLldAILcBj3_Na$46^XnE^9x5yuDZl$VUv*0EL#0v6?w5R!(3M<5}A#6S{u z^CH>o-M#npk5EbqNp_*<&)@x?-|zD~=lot*)ipFr{`gE{vETjiJ(|x3cxBn5nDkY9 zcd+)MIjq^RmcD*-pizWq)FLBe4Bb7wytm~;+RQ|LUa}S2vM^$W0Vw|JRBoQWm?aP0 z&Dd1`h-7_ZAoW_l{VWba7b4l)sm zy{LEYtpo!!s=qMd*bTnJAT~1IM$C_Kg?cnhGm$bU9l$H*(l|TNXSbS+jm5D_;Dqbai!0EVksu*CloC;}Yr*$D|+0E&@d& zQF&{_pQR(%EXR*m%hF}Pk@Cu#5j!|^v|eD2oa^ZN{{o4K>@TmBnwkS55|pOXM6$XJ z!>tl(J1HVPvUcs8^7+1sxMnIMVp*0MvGB%5i+mBLJ z)qum}BznGwX;UZA)6)~rS{aC*Qam#6PJaE$+L(Q`-o6kMCX8ol;W+ZLy|kS?$Za=| zBVvZood$-XF?v)YR@AyGpqaPM;BQ+$WB!9r({^t7Jq|$sduikIDZWG!bVW{1I+^3r z$R0O_%-k%#Jkvo}PY90_&IUphs2U(r3x`y`{tIwZ|T~ z3oFo!0#ZE?=?f7#-;LN7D1~iCP)a9twC}1?rj)|vx^Ug~d-!=TM{WHX+5??K1HHYyobF&dn$tb#gHnoUI7(l? zh0l9+D+~tqp;PTa{9Z4bQXoR-`M#ln2zIe(=}L^GF(@(708Ipk+r{Sh{z2Zv$>>*j zw_nM2mQ~W(HTZ}Ln7(>6l{tX#RiD&31 R)M@|#002ovPDHLkV1n-@=`8>N literal 0 HcmV?d00001 diff --git a/repo/js/识图工具 区域坐标/assets/Space.png b/repo/js/识图工具 区域坐标/assets/Space.png new file mode 100644 index 0000000000000000000000000000000000000000..b307c5ada4bd36dfda1d9e0397277325672d0bf6 GIT binary patch literal 2136 zcmV-e2&eanP)DTFKV98A5s9ZSWG_o=Zx%sj8}y*I$2K zmMvQ*LqkJ_O#d%XaH$_Wc#zYlPowKPSFT)Pbaa%xd-oCy2Dx|d9@np5e{tFQUm#yJ z9zJ|1<>lql*w`q0_UxJQZ+LiET3cJCr>EzIWJW~9Fbv6Nv;UQs&1S_gj6dZw?;f9; zn!;wYVYOPhapMM&NCc0^13*hl3&)QiClm?+kjZ2Shrgwtl{>R3~7#tiV7K572MNLf&_4W1C z*Vi*|-n>5&$MEnlH*el#Y-|io)A0NKbai#jUW4*QBb`o5LqmhKw6sVd5RkUEHo0`^ zl4LTO8PUyVv+~V1--yrWla`hiX>V_rj*bp-I-TNhI3y4V$f8Ay#Zyz<@M2H;doz7njQ=4u?bBZnrcvG|2Yt+jG2= zCr?UaW1|!o7t6|(E2X-+S{fP}WZk-T5|76VX1ri=yL9Q2G&MCzQ&W?)wzkT=dGqAm zci)v?e)&ZvCMI&cP$(p8)~u1HrY31_ZkA6!{Zww>zAZ$>dPwMzi``s=SHnM}%$KmI85=g*hg+FCh%`m~6Mgu`KZ=bd+?p`k&#y1JyVuTPT6 zr1baq%Z3dbq_nhD?%%&J{r&x-X`1+aJ~@2&u!x8Z4i3s2Z@eM3wY9Qu-#(e1p3bYU zU~%i}>f*~UzhuswIi%BRoK7c0Lqoj({`-9X`R9bgVE{ZH4<3()Y&Of>xpP^+em#p8 zEn@TL&9t?(p(qL?BO|%3;dZ;}?(U|$yPKk-B3^yMPjC6-8m)x^*mBvV=p24srJESxQPua5|m*^wUq+Y&H%ZI)tjKSglt6wR&>) z4u^xfx;py%`xze}XMB7dRaNQf>A`BX5)1}8b?OvXuU^IJbYd6=@pv4=Ft~g7E}2XQ zv)PQ_??+YDoL{fk%MU;NKr|X95{aOyDypi|*Vjid7{p{U5s$}FRh4Ko%EZJ(t{%+L zmrry&9!J-8R8__6^>XCM5zd@B!@`9NnVg)YtgMWaCr|SG@4pv{8vvT7AtI=%N+OX! zM7VS34)4A99-W;2ckWPCRfWZ3K~eHA>bx1hdGjXGXq3&HH=`&DCXTkrfGOQ9&}yj!Gi~An#SVAi)n9fr>(7xS6+FAs;VmNc6(moc{A?!`&qquHCwlC zWnf@{wQJW>R#rwR6k`AW{fGz)7A#=Nk|jACRaF@uALq!CBW&8ViGhIuZr!>?B9UO* zwr$kb))I@wuv)Dsio*Hx=ka(voI7`p`uchvJ$l6G=qS_E)3mp@vtq>xdV71hc<~}; zvzaw()?hZ9xpwUuUwrWekw}E@?rwhl^;hEYI3IraA>G~GG&VMpNF@0A=bwp0BAhsJ z0+-A6tjI#`EEo*RS6_W4>({T(oz($pZEckuJ9fzJ+qZMv4?g%n7A#mGOP4N{o}M0Q zZEY2g$0KjQ{k9xCb}ZNabX}M4zWYu(J3FPcv{W=rlPz1e$l&0hY}&L*Dl04H+i$-W zUDqWNiO7Ki2W0v3uvje2nKOst;$o(zrbwsLsH&Pf!RfkAB9R~-kCRL$ zal73(91b*1n=#K+Dn&Ax1Q-VSO O0000= 0; + } catch (error) { + return false; // 如果读取失败,返回 false + } +} + +// 自定义 readAllFilePaths 函数 +function readAllFilePaths(dirPath, currentDepth = 0, maxDepth = 3, includeExtensions = ['.png', '.jpg', '.jpeg', '.bmp']) { + if (!pathExists(dirPath)) { + log.error(`目录 ${dirPath} 不存在`); + return []; + } + + try { + const entries = file.readPathSync(dirPath); // 读取目录内容,返回的是完整路径 + const filePaths = []; + + for (const entry of entries) { + const isDirectory = pathExists(entry); // 如果路径存在且返回的是数组,则认为是目录 + if (isDirectory && currentDepth < maxDepth) { + filePaths.push(...readAllFilePaths(entry, currentDepth + 1, maxDepth, includeExtensions)); // 递归读取子目录 + } else if (!isDirectory) { + const fileExtension = entry.substring(entry.lastIndexOf('.')); + if (includeExtensions.includes(fileExtension.toLowerCase())) { + filePaths.push(entry); // 添加文件路径 + } + } + } + + return filePaths; + } catch (error) { + log.error(`读取目录 ${dirPath} 时发生错误: ${error}`); + return []; + } +} + +// 定义一个函数用于识别图像 +async function recognizeImage(recognitionObject, timeout = 5000) { + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 尝试识别图像 + let imageResult = captureGameRegion().find(recognitionObject); + if (imageResult && imageResult.x !== 0 && imageResult.y !== 0 && imageResult.width !== 0 && imageResult.height !== 0) { + await drawAndClearRedBox(imageResult, 500);// 调用异步函数绘制红框并延时清除 + log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}, width=${imageResult.width}, height=${imageResult.height}`); + return { success: true, x: imageResult.x, y: imageResult.y, width: imageResult.width, height: imageResult.height}; + } + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + } + await sleep(10); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法识别图像`); + return { success: false }; +} + +// 定义一个异步函数来绘制红框并延时清除 +async function drawAndClearRedBox(result, delay) { + // 绘制红框 + let drawRegion = captureGameRegion().DeriveCrop(result.x, result.y, result.width, result.height).DrawSelf("icon"); + + // 延时 + await sleep(delay); + + // 清除红框 + if (drawRegion) { + drawRegion = captureGameRegion().DeriveCrop(0, 0, 0, 0).DrawSelf("icon"); + drawRegion = null; // 释放对象 + } +} +// 主函数 +(async function () { + setGameMetrics(1920, 1080, 1); + + // 读取 assets 文件夹下的所有图标路径 + const assetsDir = "assets"; + const imagePaths = readAllFilePaths(assetsDir, 0, 1); + + // 遍历每个图标 + for (const imagePath of imagePaths) { + const fileName = basename(imagePath); // 获取文件名 + // log.info(`正在处理图标: ${fileName}`); + + // 创建识别对象 + let recognitionObject = RecognitionObject.TemplateMatch(file.ReadImageMatSync(imagePath)); + + // 识别图标 + let result = await recognizeImage(recognitionObject, 50); + if (result.success) { + // 输出坐标和识图范围推荐 + log.info(`图标 ${fileName} 的坐标: x=${result.x}, y=${result.y}, width=${result.width}, height=${result.height},识图范围推荐: ${result.x-1}, ${result.y-1}, ${result.width+2}, ${result.height+2}`); + } else { + // log.warn(`未能识别到图标 ${fileName}`); + } + + await sleep(50); // 确保识别之间有足够的时间间隔 + } +})(); diff --git a/repo/js/识图工具 区域坐标/manifest.json b/repo/js/识图工具 区域坐标/manifest.json new file mode 100644 index 00000000..e09cf3a4 --- /dev/null +++ b/repo/js/识图工具 区域坐标/manifest.json @@ -0,0 +1,13 @@ +{ + "manifest_version": 1, + "name": "识图坐标区域", + "version": "1.0", + "description": "识别图片输出坐标区域", + "authors": [ + { + "name": "吉吉喵", + } + ], + "settings_ui": "settings.json", + "main": "main.js", +} \ No newline at end of file diff --git a/repo/js/识图工具 区域坐标/settings.json b/repo/js/识图工具 区域坐标/settings.json new file mode 100644 index 00000000..4032a9b9 --- /dev/null +++ b/repo/js/识图工具 区域坐标/settings.json @@ -0,0 +1,7 @@ +[ + { + "name": "A1", + "type": "checkbox", + "label": "无需勾选= =\n把需要获取识别区域的图片\n放到assets文件夹下" + } +]