199 lines
6.2 KiB
Plaintext
199 lines
6.2 KiB
Plaintext
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=14;top=28;right=113;bottom=58;bgcolor=-5197169;border={color=-16777216;radius=3;width=1};dl=0.03;dr=0.78;dt=1;font=LOGFONT(h=-13);forecolor=16777215;z=1};
|
|
plus2={cls="plus";text="导入二维码";left=130;top=28;right=229;bottom=58;bgcolor=-5197169;border={color=-16777216;radius=3;width=1};dl=0.25;dr=0.56;dt=1;font=LOGFONT(h=-13);forecolor=16777215;notify=1;z=2};
|
|
plus3={cls="plus";text="保存格式";left=408;top=28;right=507;bottom=58;bgcolor=-5197169;border={color=-16777216;radius=3;width=1};dl=0.78;dr=0.03;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;
|
|
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)
|
|
}
|
|
|
|
//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 -y `++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 customW = mainForm.custom.width;
|
|
var customH = mainForm.custom.height;
|
|
var img = gdip.image(path);
|
|
var imgW = img.width;
|
|
var imgH = img.height;
|
|
|
|
if(imgW > customW or imgH > customW){
|
|
var aspectRatio = imgW / imgH;
|
|
var customAspectRatio = customW / customH;
|
|
|
|
var newImgW, newImgH;
|
|
|
|
if (aspectRatio > customAspectRatio) {
|
|
newImgW = customW / 2;
|
|
newImgH = customW / 2 / aspectRatio;
|
|
} else {
|
|
newImgH = customH / 2;
|
|
newImgW = customH / 2 * aspectRatio;
|
|
}
|
|
imgW = newImgW;
|
|
imgH = newImgH;
|
|
}
|
|
|
|
if(frmChild){
|
|
frmChild.close();
|
|
}
|
|
frmChild = mainForm.loadForm("\dlg\qrcode.aardio");
|
|
publish("getQrcode", path, imgW, imgH);
|
|
frmChild.show();
|
|
frmChild.wndproc = function(hwnd,message,wParam,lParam){
|
|
import mouse
|
|
select(message) {
|
|
case 0x201/*_WM_LBUTTONDOWN*/{
|
|
//点击左键移动窗体
|
|
frmChild.hitCaption()
|
|
}
|
|
case 0x46/*_WM_WINDOWPOSCHANGING*/{
|
|
// 窗口位置即将改变时
|
|
//var x,y = win.getMessagePos(lParam);
|
|
//x, y = mouse.getPos();
|
|
//mainForm.text = x ++ "," ++ y;
|
|
}
|
|
case 0x47/*_WM_WINDOWPOSCHANGED*/{
|
|
// 窗口位置已经改变时
|
|
//x, y = mouse.getPos();
|
|
//mainForm.text = x ++ "---" ++ y;
|
|
}
|
|
case 0x232/*_WM_EXITSIZEMOVE*/{
|
|
// 用户停止拖动窗口或调整窗口大小时
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
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 二维码裁剪后宽度 = frmChild.width / scaleRatio;
|
|
var 二维码裁剪后高度 = frmChild.height / scaleRatio;
|
|
var qrcodePath_new = io._exedir++"temp\"++ qrpath.name ++ "-output" ++ qrpath.ext;
|
|
|
|
// ffmpeg -i input.jpg -vf "scale=width:height" output.jpg
|
|
var ffmpeg = process.ffmpeg(, `-i `++ qrcodePath ++` -vf "scale=`++ 二维码裁剪后宽度 ++`:`++ 二维码裁剪后高度 ++`" -y `++qrcodePath_new);
|
|
|
|
ffmpeg.logResponse(mainForm.edit);
|
|
ffmpeg.onResponseEnd = function(){
|
|
// ffmpeg -i input.mp4 -i overlay.png -filter_complex "overlay=10:10" output.mp4
|
|
var str = `-i `++ videoPath ++` -i `++ qrcodePath_new ++` -filter_complex "overlay=`++ x ++`:`++ y ++ `" -y ` ++ io._exedir ++ vpath.name ++`-output`++vpath.ext;
|
|
var ffmpeg = process.ffmpeg(, str);
|
|
ffmpeg.logResponse(mainForm.edit);
|
|
ffmpeg.onResponseEnd = function(){
|
|
mainForm.edit.print(vpath.dir, str);
|
|
mainForm.edit.print("完成。");
|
|
mainForm.msgbox("处理完成,在原视频目录下查看 -output后缀")
|
|
}
|
|
}
|
|
}
|
|
|
|
mainForm.show();
|
|
return win.loopMessage(); |