commit e15f240735785a0d90dc56e318fbf439367d361a Author: Crimson Date: Tue Aug 27 23:11:10 2024 +0800 first commit diff --git a/.build/default.Manifest.xml b/.build/default.Manifest.xml new file mode 100644 index 0000000..b0cb82a --- /dev/null +++ b/.build/default.Manifest.xml @@ -0,0 +1,61 @@ + + + + 视频添加二维码 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True/PM + PerMonitorV2, PerMonitor + + + \ No newline at end of file diff --git a/.build/default.init.aardio b/.build/default.init.aardio new file mode 100644 index 0000000..11c61af --- /dev/null +++ b/.build/default.init.aardio @@ -0,0 +1,2 @@ +//发布前触发 +import ide; \ No newline at end of file diff --git a/.build/default.main.aardio b/.build/default.main.aardio new file mode 100644 index 0000000..f2f1b0a --- /dev/null +++ b/.build/default.main.aardio @@ -0,0 +1,6 @@ +//此触发器在生成EXE以后执行 +import ide; +import fsys; + +//获取生成的EXE文件路径 +var publishFile = ide.getPublishPath(); \ No newline at end of file diff --git a/default.aproj b/default.aproj new file mode 100644 index 0000000..2f64945 --- /dev/null +++ b/default.aproj @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dist/视频添加二维码.exe b/dist/视频添加二维码.exe new file mode 100644 index 0000000..adb2ab3 Binary files /dev/null and b/dist/视频添加二维码.exe differ diff --git a/dlg/qrcode.aardio b/dlg/qrcode.aardio new file mode 100644 index 0000000..4f49500 --- /dev/null +++ b/dlg/qrcode.aardio @@ -0,0 +1,43 @@ +import win.ui; +/*DSG{{*/ +var winform = win.form(text="aardio form";right=304;bottom=297;bgcolor=16777215;exmode="none";max=false;min=false;mode="popup";sysmenu=false;title=false) +winform.add( +plus={cls="plus";left=0;top=0;right=167;bottom=159;clipBk=false;dl=1;dt=1;repeat="scale";z=1} +) +/*}}*/ + +import console; +import gdip; + +subscribe("getQrcode",function(...){ + var qrcodePath, width, height = ...; + winform.width = width; + winform.height = height; + winform.plus.width = width; + winform.plus.height = height; + winform.plus.background = qrcodePath; +} ) + +winform.wndproc = function(hwnd, message, wParam, lParam) { + select(message) { + case 0x201/*_WM_LBUTTONDOWN*/{ + //点击左键移动窗体 + winform.hitCaption() + } + case 0x205/*_WM_RBUTTONUP*/{ + //右键菜单 + var popmenu = win.ui.popmenu(winform); + popmenu.add('关闭', + function(id) { + win.close(winform.hwnd); + }) + popmenu.popup() + } + } +} + +//winform.setPos(0,0, winform.parent.hwnd); +winform.show(); +//winform.transparent(128,0xFFFFFF) +//winform.transparent(true) +win.loopMessage(); \ No newline at end of file diff --git a/dlg/test.aardio b/dlg/test.aardio new file mode 100644 index 0000000..5662581 --- /dev/null +++ b/dlg/test.aardio @@ -0,0 +1,14 @@ +import win.ui; +/*DSG{{*/ +var winform = win.form(text="aardio form";right=735;bottom=618;bgcolor=16777215;max=false;min=false;mode="popup";sysmenu=false;title=false) +winform.add( +button={cls="button";text="Button";left=230;top=360;right=332;bottom=413;z=2}; +plus={cls="plus";left=0;top=0;right=167;bottom=159;clipBk=false;dl=1;dt=1;repeat="scale";z=1} +) +/*}}*/ + +import console; + + +winform.show(); +win.loopMessage(); \ No newline at end of file diff --git a/lib/config.aardio b/lib/config.aardio new file mode 100644 index 0000000..5da06a0 --- /dev/null +++ b/lib/config.aardio @@ -0,0 +1,17 @@ +//config 配置文件 +import fsys.config; +config = fsys.config("/config/"); +//config = fsys.config( io.appData("/软件作者/应用程序名/") ); + +//不需要序列化的配置名字前请添加下划线 +namespace config { + __appName = "应用程序名"; + __website = "http://www.aardio.com/"; +} + +/**intellisense(config) +__appName = 应用程序名 +__website = 官方网站 +saveAll() = 写入所有配置到文件 +? = 获取值时指定不以下划线开始的配置表名称,\n返回一个可自动序列化到同名配置文件的表对象。\n如果此对象名以下划线开始,则可以正常读写值不会序列化为配置文件。\n否则不能对此对象直接赋值,只能对配置表对象的成员赋值。\n\n配置表可自动自文件加载,退出线程前自动序列化并存入文件。\n仅序列化以字符串、数值为键的元素,\n仅序列化值为字符串、数值、buffer 以及定义了 _serialize 元方法的成员。\n循环引用的值转换为 null,序列化时忽略成员函数\n!fsys_table. +end intellisense**/ \ No newline at end of file diff --git a/main.aardio b/main.aardio new file mode 100644 index 0000000..6b89a22 --- /dev/null +++ b/main.aardio @@ -0,0 +1,155 @@ +import win.ui; +/*DSG{{*/ +mainForm = win.form(text="视频添加二维码";right=519;bottom=759;bgcolor=16777215) +mainForm.add( +custom={cls="custom";text="自定义控件";left=10;top=76;right=510;bottom=668;border=1;clip=1;db=1;dl=1;dr=1;dt=1;z=4}; +edit={cls="edit";left=10;top=673;right=510;bottom=750;db=1;dl=1;dr=1;edge=1;multiline=1;readonly=1;z=5}; +plus={cls="plus";text="导入视频";left=63;top=28;right=162;bottom=58;bgcolor=-5197169;border={color=-16777216;radius=3;width=1};dl=0.12;dr=0.69;dt=1;font=LOGFONT(h=-13);forecolor=16777215;z=1}; +plus2={cls="plus";text="导入二维码";left=179;top=28;right=278;bottom=58;bgcolor=-5197169;border={color=-16777216;radius=3;width=1};dl=0.34;dr=0.47;dt=1;font=LOGFONT(h=-13);forecolor=16777215;notify=1;z=2}; +plus3={cls="plus";text="保存格式";left=337;top=28;right=436;bottom=58;bgcolor=-5197169;border={color=-16777216;radius=3;width=1};dl=0.65;dr=0.16;dt=1;font=LOGFONT(h=-13);forecolor=5881621;notify=1;z=3} +) +/*}}*/ + +mainForm.plus.skin({ + foreground={ + active=0xFFFFBAB7; + default=0xFFFFFFFF + }; +}) + +mainForm.plus2.skin({ + foreground={ + active=0xFFFFBAB7; + default=0xFFFFFFFF + }; +}) + +mainForm.plus3.skin({ + foreground={ + active=0xFFFFBAB7; + default=0xFF15BF59 + }; +}) + +import console; +import gdip; +import fsys.dlg; +import process.ffmpeg; + +var frmChild; // qrcode winform +var videoPath; +var qrcodePath; +var scaleRatio; // 定义一个全局变量来保存缩放比例 +var offsetX; // 视频在 custom 内 x 偏移量 +var offsetY; // 视频在 custom 内 y 偏移量 + +showVideo = function(vpath){ + var customW = mainForm.custom.width; + var customH = mainForm.custom.height; + mainForm.edit.print(vpath); + var img = gdip.image(vpath + "0001.png"); + var imgW = img.width; + var imgH = img.height; + + var aspectRatio = imgW / imgH; + var customAspectRatio = customW / customH; + + var newImgW, newImgH; + + if (aspectRatio > customAspectRatio) { + newImgW = customW; + newImgH = customW / aspectRatio; + scaleRatio = customW / imgW; // 保存缩放比例 + } else { + newImgH = customH; + newImgW = customH * aspectRatio; + scaleRatio = customH / imgH; // 保存缩放比例 + } + + offsetX = (customW - newImgW) / 2; + offsetY = (customH - newImgH) / 2; + + mainForm.custom.add( + plus4 = { + cls = "plus"; + left = offsetX; + top = offsetY; + right = offsetX + newImgW; + bottom = offsetY + newImgH; + background = vpath + "0001.png"; + z = 6 + } + ); +} + +mainForm.plus.oncommand = function(id,event){ + var path = fsys.dlg.open("MP4 files (*.mp4)|*.mp4|其他格式 (*.*)|*||"); // 假设只支持mp4格式 + if(path){ + videoPath = path; + var tpath = io.splitpath(path); + var vpath = io._exedir+"temp\"+tpath.name+"\"; + if(!io.exist(vpath)){ + io.createDir(vpath) + } + + if(io.exist(vpath+"0001.png")){ + showVideo(vpath); + } + else { + //var ffmpeg = process.ffmpeg(,"-i "+path+" -vf fps=1 "+vpath+"\%04d.png"); + var ffmpeg = process.ffmpeg(, `-i `++path++` -vf "select=eq(n\,0)" -vframes 1 `++vpath++`\0001.png`); + ffmpeg.logResponse(mainForm.edit); + + ffmpeg.onResponseEnd = function(){ + showVideo(vpath); + } + } + } +} + +mainForm.plus2.oncommand = function(id,event){ + // 导入二维码 + var path = fsys.dlg.open("*.png|*.png|其他格式 (*.*)|*||"); // 假设只支持png格式 + if(path){ + qrcodePath = path; + var img = gdip.image(path); + var imgW = img.width; + var imgH = img.height; + + // 使用保存的缩放比例来计算新图片的宽度和高度 + var newImgW = imgW * scaleRatio; + var newImgH = imgH * scaleRatio; + if(frmChild){ + frmChild.close(); + } + frmChild = mainForm.loadForm("\dlg\qrcode.aardio"); + publish("getQrcode", path, newImgW, newImgH); + frmChild.show(); + } +} + +mainForm.plus3.oncommand = function(id,event){ + var rc = mainForm.custom.plus4.getRect(); + var vRect = win.toScreenRect(mainForm.custom.plus4.hwnd,rc); + var vLeft = vRect.left - offsetX; + var vTop = vRect.top - offsetY; + var iLeft = frmChild.left; + var iTop = frmChild.top; + var x = (iLeft - vLeft) / scaleRatio; + var y = (iTop - vTop) / scaleRatio; + + var vpath = io.splitpath(videoPath); + var qrpath = io.splitpath(qrcodePath); + + var str = `-i `++ vpath.file ++` -i `++ qrpath.file ++` -filter_complex "overlay=`++ x ++`:`++ y ++ `" ` ++ vpath.name ++`-output.mp4`; + + var ffmpeg = process.ffmpeg(vpath.dir, str); + ffmpeg.logResponse(mainForm.edit); + ffmpeg.onResponseEnd = function(){ + mainForm.edit.print("完成。"); + mainForm.msgbox("处理完成,在原视频目录下查看 -output后缀") + } +} + +mainForm.show(); +return win.loopMessage();