🐛 修复分享图渲染错误

* dom2image 不支持 mask-image,故换成了 modernScreenshot
* picture 内含 img 不支持,故用 里面的 img 替换了 picture 元素
This commit is contained in:
目棃
2024-03-06 15:02:43 +08:00
parent fdd3b44378
commit ddba583bdf

View File

@@ -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}', {});
})();`; })();`;