diff --git a/web/index.html b/web/index.html
index 339fdaf..b52cf39 100644
--- a/web/index.html
+++ b/web/index.html
@@ -435,8 +435,9 @@
body
})
- // console.log(resp)
+
let data = await resp.json()
+ // console.log(data)
let { name, subfolder } = data
let src = `${url}/view?filename=${encodeURIComponent(
name
@@ -888,6 +889,52 @@
}
+ function generateRainbowVideo() {
+ // 创建一个canvas元素
+ const canvas = document.createElement('canvas');
+ canvas.width = 640; // 设置canvas宽度
+ canvas.height = 480; // 设置canvas高度
+ const context = canvas.getContext('2d');
+
+ // 绘制第一帧彩虹
+ context.fillStyle = 'red';
+ context.fillRect(0, 0, canvas.width / 2, canvas.height);
+ context.fillStyle = 'orange';
+ context.fillRect(canvas.width / 2, 0, canvas.width / 2, canvas.height);
+
+ // 绘制第二帧彩虹
+ context.fillStyle = 'yellow';
+ context.fillRect(0, 0, canvas.width / 2, canvas.height);
+ context.fillStyle = 'green';
+ context.fillRect(canvas.width / 2, 0, canvas.width / 2, canvas.height);
+
+ // 创建一个新的video元素
+ const video = document.createElement('video');
+ video.setAttribute('controls', true)
+ // 将canvas绘制到video中
+ const stream = canvas.captureStream();
+ video.srcObject = stream;
+
+ // 导出视频
+ const mediaRecorder = new MediaRecorder(stream);
+ const chunks = [];
+ mediaRecorder.ondataavailable = function (event) {
+ chunks.push(event.data);
+ };
+ mediaRecorder.onstop = function () {
+ const blob = new Blob(chunks, { type: 'video/mp4' });
+ const url = URL.createObjectURL(blob);
+ video.src = url;
+ };
+ mediaRecorder.start();
+ setTimeout(function () {
+ mediaRecorder.stop();
+ }, 1000); // 设置录制时长,这里设置为1秒
+
+ return video;
+ }
+
+
async function calculateImageHash(blob) {
const buffer = await blob.arrayBuffer();
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
@@ -1081,16 +1128,19 @@
inputData = inputData.filter(inp => inp);
// console.log('inputData',inputData)
inputData.forEach(data => {
- // console.log(data)
+ console.log(data)
// Check if the class_type is "LoadImage"
- if (data.class_type === "LoadImage") {
+ if (data.class_type === "LoadImage" || data.class_type === "VHS_LoadVideo") {
+
+ let isVideoUpload = data.class_type === "VHS_LoadVideo";
+
// Create a container for the upload control
const uploadContainer = document.createElement("div");
uploadContainer.className = 'card';
// Create a label for the upload control
const nameLabel = document.createElement("label");
- nameLabel.textContent = data.title || "LoadImage: ";
+ nameLabel.textContent = data.title || (isVideoUpload ? "LoadVideo: " : "LoadImage: ");
nameLabel.style.marginBottom = '12px'
uploadContainer.appendChild(nameLabel);
@@ -1109,25 +1159,48 @@
const btnFromClipboard = document.createElement("button");
btnFromClipboard.style = `width: 156px; margin-left: 18px;`
btnFromClipboard.innerText = 'paste from clipboard'
- actionDiv.appendChild(btnFromClipboard);
+ if (!isVideoUpload) actionDiv.appendChild(btnFromClipboard);
const btnForImageEdit = document.createElement("button");
btnForImageEdit.style = ` width: 32px; background: none;margin-left: 18px;`
btnForImageEdit.innerHTML = ''
- actionDiv.appendChild(btnForImageEdit);
+ if (!isVideoUpload) actionDiv.appendChild(btnForImageEdit);
uploadContainer.appendChild(actionDiv)
// Create an image element to display the uploaded image
- const imageElement = document.createElement("img");
- imageElement.src = base64Df
+ let imageElement = document.createElement("img");
+ if (isVideoUpload) {
+ imageElement = document.createElement('video');
+ imageElement.setAttribute('controls', true)
+ let [subfolder, name] = data.inputs.video.split('/');
+ // console.log(subfolder,name)
+ if (!name) {
+ subfolder = "";
+ name = data.inputs.video;
+ }
+ let url = `${get_url()}/view?filename=${encodeURIComponent(name)}&type=input&subfolder=${subfolder}&rand=${Math.random()}`
+ imageElement.src = url;
+ } else {
+ // 图片
+ let [subfolder, name] = data.inputs.image.split('/');
+ if (!name) {
+ subfolder = "";
+ name = data.inputs.image;
+ }
+ // imageElement.src = base64Df
+ let url = `${get_url()}/view?filename=${encodeURIComponent(name)}&type=input&subfolder=${subfolder}&rand=${Math.random()}`
+ imageElement.src = url;
+ }
+
imageElement.style.maxWidth = '200px';
- btnFromClipboard.addEventListener('click', (event) => handleClipboardImage(imageElement, data));
- btnForImageEdit.addEventListener('click', e => editImage(imageElement, data))
+ if (!isVideoUpload) btnFromClipboard.addEventListener('click', (event) => handleClipboardImage(imageElement, data));
+
+ if (!isVideoUpload) btnForImageEdit.addEventListener('click', e => editImage(imageElement, data))
uploadImageInput.addEventListener('click', (event) => {
@@ -1145,15 +1218,24 @@
reader.onloadend = async function () {
// 获取读取的文件内容,即 Blob 对象
const fileBlob = new Blob([reader.result], { type: file.type });
-
+ // console.log( file.type.split('/')[1])
let hashId = await calculateImageHash(fileBlob)
if (hashId == window._appData.data[data.id].hashId) return
- let { url, name } = await uploadImage(fileBlob)
+ let { url, name } = await uploadImage(fileBlob, '.' + file.type.split('/')[1])
+ if (isVideoUpload) {
+ imageElement.srcObject = null;
+ }
// 在这里可以对 Blob 对象进行进一步处理
imageElement.src = url;
- window._appData.data[data.id].inputs.image = name;
+
+ if (isVideoUpload) {
+ window._appData.data[data.id].inputs.video = name;
+ } else {
+ window._appData.data[data.id].inputs.image = name;
+ }
+
window._appData.data[data.id].hashId = hashId;
console.log("上传的文件:", url, data.id, name);
diff --git a/web/javascript/app_mixlab.js b/web/javascript/app_mixlab.js
index b15ec77..a1b84bd 100644
--- a/web/javascript/app_mixlab.js
+++ b/web/javascript/app_mixlab.js
@@ -277,7 +277,7 @@ async function save (json, download = false, showInfo = true) {
function getInputsAndOutputs () {
const inputs =
- `LoadImage CLIPTextEncode PromptSlide TextInput_ Color FloatSlider IntNumber CheckpointLoaderSimple LoraLoader`.split(
+ `LoadImage VHS_LoadVideo CLIPTextEncode PromptSlide TextInput_ Color FloatSlider IntNumber CheckpointLoaderSimple LoraLoader`.split(
' '
),
outputs = `PreviewImage SaveImage ShowTextForGPT VHS_VideoCombine`.split(