mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-15 09:48:14 +08:00
🐛 修复分享图渲染错误
* dom2image 不支持 mask-image,故换成了 modernScreenshot * picture 内含 img 不支持,故用 里面的 img 替换了 picture 元素
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file utils/TGClient.ts
|
* @file utils/TGClient.ts
|
||||||
* @desc 负责米游社客户端的 callback 处理
|
* @desc 负责米游社客户端的 callback 处理
|
||||||
* @since Beta v0.4.3
|
* @since Beta v0.4.4
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { event, invoke } from "@tauri-apps/api";
|
import { event, invoke } from "@tauri-apps/api";
|
||||||
@@ -29,7 +29,7 @@ interface InvokeArg {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @class TGClient
|
* @class TGClient
|
||||||
* @since Beta v0.4.3
|
* @since Beta v0.4.4
|
||||||
* @description 米游社客户端
|
* @description 米游社客户端
|
||||||
*/
|
*/
|
||||||
class TGClient {
|
class TGClient {
|
||||||
@@ -807,7 +807,7 @@ class TGClient {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @func share
|
* @func share
|
||||||
* @since Beta v0.3.9
|
* @since Beta v0.4.4
|
||||||
* @desc 分享
|
* @desc 分享
|
||||||
* @param {TGApp.Plugins.JSBridge.Arg<TGApp.Plugins.JSBridge.SharePayload>} arg - 方法参数
|
* @param {TGApp.Plugins.JSBridge.Arg<TGApp.Plugins.JSBridge.SharePayload>} arg - 方法参数
|
||||||
* @returns {Promise<void>} - 无返回值
|
* @returns {Promise<void>} - 无返回值
|
||||||
@@ -824,63 +824,65 @@ class TGClient {
|
|||||||
}
|
}
|
||||||
if (arg.payload.type === "screenshot") {
|
if (arg.payload.type === "screenshot") {
|
||||||
const executeJS = `javascript:(async function() {
|
const executeJS = `javascript:(async function() {
|
||||||
// 查找 id 为 dom2img 的 script
|
var checkLib = false;
|
||||||
var hasDom2img = false;
|
var scripts = document.querySelectorAll("script");
|
||||||
var scripts = document.querySelectorAll('script');
|
for(var script of scripts) {
|
||||||
for (var i = 0; i < scripts.length; i++) {
|
if(script.src.includes("modern-screenshot")) {
|
||||||
if (scripts[i].src === 'https://cdn.bootcdn.net/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js') {
|
checkLib = true;
|
||||||
hasDom2img = true;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 如果没有 dom2img 的 js
|
if (!checkLib) {
|
||||||
if (!hasDom2img) {
|
var script = document.createElement("script");
|
||||||
// 添加 dom2img 的 js
|
script.src = "https://cdn.jsdelivr.net/npm/modern-screenshot";
|
||||||
var script = document.createElement('script');
|
|
||||||
script.src = 'https://cdn.bootcdn.net/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js';
|
|
||||||
document.body.appendChild(script);
|
document.body.appendChild(script);
|
||||||
// 等待 dom2img 加载完成
|
|
||||||
await new Promise((resolve) => {
|
await new Promise((resolve) => {
|
||||||
script.onload = function() {
|
script.onload = resolve;
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var shareDom;
|
var shareDom;
|
||||||
if(${JSON.stringify(arg.payload.content)} === '{}') {
|
if(${JSON.stringify(arg.payload.content)} === "{}") {
|
||||||
shareDom = document.querySelector('.share');
|
shareDom = document.querySelector(".share");
|
||||||
} else if (${arg.payload.content?.preview} === true) {
|
} else if (${arg.payload.content?.preview} === true) {
|
||||||
shareDom = document.querySelector('#root');
|
shareDom = document.querySelector("#root");
|
||||||
}
|
}
|
||||||
if(shareDom === undefined || shareDom === null) {
|
if(shareDom === undefined || shareDom === null) {
|
||||||
shareDom = document.body;
|
shareDom = document.body;
|
||||||
}
|
}
|
||||||
var scale = 1.5;
|
var scale = 1.5;
|
||||||
var img = await domtoimage.toPng(shareDom, {
|
var option = {
|
||||||
|
debug: true,
|
||||||
height: shareDom.scrollHeight * scale,
|
height: shareDom.scrollHeight * scale,
|
||||||
width: shareDom.scrollWidth * scale,
|
width: shareDom.scrollWidth * scale,
|
||||||
style: {
|
style: {
|
||||||
transform: 'scale(' + scale + ')',
|
transform: "scale(" + scale + ")",
|
||||||
transformOrigin: 'top left'
|
transformOrigin: "top left"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var pictures = shareDom.querySelectorAll("picture","div picture");
|
||||||
|
pictures.forEach(picture => {
|
||||||
|
var img = picture.querySelector("img");
|
||||||
|
if (img !== null) {
|
||||||
|
picture.replaceWith(img);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// 转换成 blob
|
var img = await modernScreenshot.domToPng(shareDom, option);
|
||||||
var buffer = new Uint8Array(atob(img.split(',')[1]).split('').map(function(item) {
|
var buffer = new Uint8Array(atob(img.split(",")[1]).split("").map(function(item) {
|
||||||
return item.charCodeAt(0);
|
return item.charCodeAt(0);
|
||||||
}));
|
}));
|
||||||
var _t = window.__TAURI__;
|
var _t = window.__TAURI__;
|
||||||
var savePath = await _t.path.downloadDir() + Date.now() + '.png';
|
var savePath = await _t.path.downloadDir() + Date.now() + ".png";
|
||||||
var save = await _t.dialog.save({
|
var save = await _t.dialog.save({
|
||||||
title: '保存图片',
|
title: "保存图片",
|
||||||
filters: [{ name: '图片', extensions: ['png'] }],
|
filters: [{ name: "图片", extensions: ["png"] }],
|
||||||
defaultPath: savePath,
|
defaultPath: savePath
|
||||||
});
|
});
|
||||||
if (save) {
|
if (save) {
|
||||||
await _t.fs.writeBinaryFile({
|
await _t.fs.writeBinaryFile({
|
||||||
contents: buffer,
|
contents: buffer,
|
||||||
path: save,
|
path: save
|
||||||
});
|
});
|
||||||
alert('保存成功');
|
alert("保存成功");
|
||||||
}
|
}
|
||||||
mhyWebBridge('${arg.callback}', {});
|
mhyWebBridge('${arg.callback}', {});
|
||||||
})();`;
|
})();`;
|
||||||
|
|||||||
Reference in New Issue
Block a user