customer-chat-sdk 1.0.58 → 1.0.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -287,7 +287,7 @@ export declare class ScreenshotManager {
|
|
|
287
287
|
private dataUrlToArrayBuffer;
|
|
288
288
|
/**
|
|
289
289
|
* 构建二进制结构(按顺序:sign[14], type[1], topicLength[1], topic[topicLength], routingKey[8])
|
|
290
|
-
* 总大小:
|
|
290
|
+
* 总大小:15 + 1 + 8 + 8 = 31 字节
|
|
291
291
|
*/
|
|
292
292
|
private buildBinaryConfig;
|
|
293
293
|
/**
|
|
@@ -306,6 +306,17 @@ export declare class ScreenshotManager {
|
|
|
306
306
|
* 发送压缩后的截图到 iframe
|
|
307
307
|
*/
|
|
308
308
|
private sendCompressedScreenshotToIframe;
|
|
309
|
+
/**
|
|
310
|
+
* 获取最新的截图(压缩后的,如果启用了压缩)
|
|
311
|
+
* @param format 返回格式:'dataUrl' | 'blob' | 'arrayBuffer' | 'file' | 'image'
|
|
312
|
+
* @param fileName 当 format 为 'file' 时的文件名,默认为 'screenshot.webp'
|
|
313
|
+
* @returns 根据 format 返回对应格式的数据,如果没有截图则返回 null
|
|
314
|
+
*/
|
|
315
|
+
getCompressedScreenshot(format: 'dataUrl'): string | null;
|
|
316
|
+
getCompressedScreenshot(format: 'blob'): Blob | null;
|
|
317
|
+
getCompressedScreenshot(format: 'arrayBuffer'): ArrayBuffer | null;
|
|
318
|
+
getCompressedScreenshot(format: 'file', fileName?: string): File | null;
|
|
319
|
+
getCompressedScreenshot(format: 'image'): Promise<HTMLImageElement | null>;
|
|
309
320
|
/**
|
|
310
321
|
* 启用/禁用截图功能
|
|
311
322
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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"}
|
package/dist/customer-sdk.cjs.js
CHANGED
|
@@ -14881,13 +14881,18 @@ class ScreenshotManager {
|
|
|
14881
14881
|
}
|
|
14882
14882
|
}
|
|
14883
14883
|
// 打印基本信息
|
|
14884
|
-
const base64Data = dataUrl.split(',')[1];
|
|
14884
|
+
const base64Data = dataUrl.split(',')[1] || '';
|
|
14885
14885
|
if (!this.options.silentMode) {
|
|
14886
14886
|
console.log('📸 截图完成:');
|
|
14887
14887
|
console.log(`📸 编号: #${this.screenshotCount}`);
|
|
14888
14888
|
console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
|
|
14889
14889
|
console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
|
|
14890
14890
|
console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
|
|
14891
|
+
// 完整打印压缩前的 base64
|
|
14892
|
+
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
14893
|
+
console.log(base64Data);
|
|
14894
|
+
console.log(`📸 [压缩前] 完整 Data URL:`);
|
|
14895
|
+
console.log(dataUrl);
|
|
14891
14896
|
}
|
|
14892
14897
|
// 如果启用压缩(所有设备都支持)
|
|
14893
14898
|
const shouldCompress = this.options.compress;
|
|
@@ -14908,10 +14913,13 @@ class ScreenshotManager {
|
|
|
14908
14913
|
if (!this.options.silentMode) {
|
|
14909
14914
|
console.log('📸 发送到 WebWorker 进行压缩...');
|
|
14910
14915
|
}
|
|
14916
|
+
// 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
|
|
14917
|
+
// 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
|
|
14918
|
+
const originalDataUrlForCompression = dataUrl;
|
|
14911
14919
|
this.worker.postMessage({
|
|
14912
14920
|
type: 'COMPRESS_IMAGE',
|
|
14913
14921
|
data: {
|
|
14914
|
-
dataUrl,
|
|
14922
|
+
dataUrl: originalDataUrlForCompression, // 保存原始 dataUrl
|
|
14915
14923
|
maxWidth: this.options.maxWidth,
|
|
14916
14924
|
maxHeight: this.options.maxHeight,
|
|
14917
14925
|
quality: this.options.quality,
|
|
@@ -16964,15 +16972,29 @@ class ScreenshotManager {
|
|
|
16964
16972
|
const { type, data } = e.data;
|
|
16965
16973
|
if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
|
|
16966
16974
|
const compressed = data.compressed;
|
|
16975
|
+
// 获取压缩前的原始数据
|
|
16976
|
+
// 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
|
|
16977
|
+
const originalDataUrl = this.screenshotHistory.length > 0
|
|
16978
|
+
? this.screenshotHistory[this.screenshotHistory.length - 1]
|
|
16979
|
+
: '';
|
|
16967
16980
|
// 更新截图历史记录(压缩成功或失败都会更新)
|
|
16968
16981
|
if (this.screenshotHistory.length > 0 && compressed.dataUrl) {
|
|
16982
|
+
// 保存压缩前的原始数据用于对比
|
|
16983
|
+
const originalBase64 = originalDataUrl.split(',')[1] || '';
|
|
16984
|
+
const compressedBase64 = compressed.dataUrl.split(',')[1] || '';
|
|
16985
|
+
// 更新历史记录为压缩后的数据
|
|
16969
16986
|
this.screenshotHistory[this.screenshotHistory.length - 1] = compressed.dataUrl;
|
|
16970
|
-
//
|
|
16987
|
+
// 打印压缩统计信息和 base64 对比
|
|
16971
16988
|
if (!this.options.silentMode) {
|
|
16972
16989
|
if (compressed.error) {
|
|
16973
16990
|
// 压缩失败,使用原始数据
|
|
16974
16991
|
console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
|
|
16975
16992
|
console.warn(` ⚠️ 错误: ${compressed.error}`);
|
|
16993
|
+
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
16994
|
+
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
16995
|
+
console.log(originalBase64);
|
|
16996
|
+
console.log(`📸 [压缩前] 完整 Data URL:`);
|
|
16997
|
+
console.log(originalDataUrl);
|
|
16976
16998
|
}
|
|
16977
16999
|
else if (compressed.originalSize && compressed.compressedSize) {
|
|
16978
17000
|
// 压缩成功,显示统计信息
|
|
@@ -16983,6 +17005,17 @@ class ScreenshotManager {
|
|
|
16983
17005
|
console.log(` 原始大小: ${originalKB} KB`);
|
|
16984
17006
|
console.log(` 压缩后: ${compressedKB} KB`);
|
|
16985
17007
|
console.log(` 压缩率: ${ratio}%`);
|
|
17008
|
+
// 完整打印压缩前后的 base64 对比
|
|
17009
|
+
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
17010
|
+
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
17011
|
+
console.log(originalBase64);
|
|
17012
|
+
console.log(`📸 [压缩前] 完整 Data URL:`);
|
|
17013
|
+
console.log(originalDataUrl);
|
|
17014
|
+
console.log(`📸 [压缩后] Base64 长度: ${compressedBase64.length} 字符`);
|
|
17015
|
+
console.log(`📸 [压缩后] 完整 Base64:`);
|
|
17016
|
+
console.log(compressedBase64);
|
|
17017
|
+
console.log(`📸 [压缩后] 完整 Data URL:`);
|
|
17018
|
+
console.log(compressed.dataUrl);
|
|
16986
17019
|
}
|
|
16987
17020
|
}
|
|
16988
17021
|
// 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
|
|
@@ -17087,20 +17120,20 @@ class ScreenshotManager {
|
|
|
17087
17120
|
}
|
|
17088
17121
|
/**
|
|
17089
17122
|
* 构建二进制结构(按顺序:sign[14], type[1], topicLength[1], topic[topicLength], routingKey[8])
|
|
17090
|
-
* 总大小:
|
|
17123
|
+
* 总大小:15 + 1 + 8 + 8 = 31 字节
|
|
17091
17124
|
*/
|
|
17092
17125
|
buildBinaryConfig(config) {
|
|
17093
|
-
// 总大小:
|
|
17094
|
-
const buffer = new ArrayBuffer(
|
|
17126
|
+
// 总大小:15 + 1 + 8 + 8 = 32 字节
|
|
17127
|
+
const buffer = new ArrayBuffer(32);
|
|
17095
17128
|
const view = new DataView(buffer);
|
|
17096
17129
|
const encoder = new TextEncoder();
|
|
17097
17130
|
let offset = 0;
|
|
17098
17131
|
// sign: 14字节 (字符串,UTF-8编码,不足补0,大端序)
|
|
17099
17132
|
const signStr = String(config.sign);
|
|
17100
17133
|
const signBytes = encoder.encode(signStr);
|
|
17101
|
-
const signArray = new Uint8Array(buffer, offset,
|
|
17102
|
-
signArray.set(signBytes.slice(0,
|
|
17103
|
-
offset +=
|
|
17134
|
+
const signArray = new Uint8Array(buffer, offset, 15);
|
|
17135
|
+
signArray.set(signBytes.slice(0, 15)); // 截取前15字节,不足自动补0
|
|
17136
|
+
offset += 15;
|
|
17104
17137
|
// type: 1字节
|
|
17105
17138
|
view.setUint8(offset, config.type);
|
|
17106
17139
|
offset += 1;
|
|
@@ -17234,6 +17267,15 @@ class ScreenshotManager {
|
|
|
17234
17267
|
// 计算 base64 大小
|
|
17235
17268
|
const base64Data = dataUrl.split(',')[1] || '';
|
|
17236
17269
|
const base64Size = base64Data.length;
|
|
17270
|
+
// 完整打印发送前的 base64 信息(用于调试)
|
|
17271
|
+
if (!this.options.silentMode) {
|
|
17272
|
+
console.log('📸 [发送前] Base64 信息:');
|
|
17273
|
+
console.log(` Base64 长度: ${base64Size} 字符`);
|
|
17274
|
+
console.log(` 📸 [发送前] 完整 Base64:`);
|
|
17275
|
+
console.log(base64Data);
|
|
17276
|
+
console.log(` 📸 [发送前] 完整 Data URL:`);
|
|
17277
|
+
console.log(dataUrl);
|
|
17278
|
+
}
|
|
17237
17279
|
// 将截图转换为 ArrayBuffer
|
|
17238
17280
|
const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
|
|
17239
17281
|
const imageBufferSize = imageBuffer.byteLength;
|
|
@@ -17265,6 +17307,54 @@ class ScreenshotManager {
|
|
|
17265
17307
|
console.error('📸 [压缩后] ❌ 处理二进制数据失败:', error);
|
|
17266
17308
|
}
|
|
17267
17309
|
}
|
|
17310
|
+
getCompressedScreenshot(format = 'dataUrl', fileName) {
|
|
17311
|
+
const dataUrl = this.getLatestScreenshot();
|
|
17312
|
+
if (!dataUrl) {
|
|
17313
|
+
return null;
|
|
17314
|
+
}
|
|
17315
|
+
switch (format) {
|
|
17316
|
+
case 'dataUrl':
|
|
17317
|
+
return dataUrl;
|
|
17318
|
+
case 'blob': {
|
|
17319
|
+
const arr = dataUrl.split(',');
|
|
17320
|
+
const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
|
|
17321
|
+
const bstr = atob(arr[1]);
|
|
17322
|
+
const n = bstr.length;
|
|
17323
|
+
const u8arr = new Uint8Array(n);
|
|
17324
|
+
for (let i = 0; i < n; i++) {
|
|
17325
|
+
u8arr[i] = bstr.charCodeAt(i);
|
|
17326
|
+
}
|
|
17327
|
+
return new Blob([u8arr], { type: mime });
|
|
17328
|
+
}
|
|
17329
|
+
case 'arrayBuffer': {
|
|
17330
|
+
return this.dataUrlToArrayBuffer(dataUrl);
|
|
17331
|
+
}
|
|
17332
|
+
case 'file': {
|
|
17333
|
+
const arr = dataUrl.split(',');
|
|
17334
|
+
const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
|
|
17335
|
+
const bstr = atob(arr[1]);
|
|
17336
|
+
const n = bstr.length;
|
|
17337
|
+
const u8arr = new Uint8Array(n);
|
|
17338
|
+
for (let i = 0; i < n; i++) {
|
|
17339
|
+
u8arr[i] = bstr.charCodeAt(i);
|
|
17340
|
+
}
|
|
17341
|
+
const blob = new Blob([u8arr], { type: mime });
|
|
17342
|
+
const fileExtension = mime.split('/')[1] || 'webp';
|
|
17343
|
+
const finalFileName = fileName || `screenshot.${fileExtension}`;
|
|
17344
|
+
return new File([blob], finalFileName, { type: mime });
|
|
17345
|
+
}
|
|
17346
|
+
case 'image': {
|
|
17347
|
+
return new Promise((resolve) => {
|
|
17348
|
+
const img = new Image();
|
|
17349
|
+
img.onload = () => resolve(img);
|
|
17350
|
+
img.onerror = () => resolve(null);
|
|
17351
|
+
img.src = dataUrl;
|
|
17352
|
+
});
|
|
17353
|
+
}
|
|
17354
|
+
default:
|
|
17355
|
+
return dataUrl;
|
|
17356
|
+
}
|
|
17357
|
+
}
|
|
17268
17358
|
/**
|
|
17269
17359
|
* 启用/禁用截图功能
|
|
17270
17360
|
*/
|
package/dist/customer-sdk.esm.js
CHANGED
|
@@ -14877,13 +14877,18 @@ class ScreenshotManager {
|
|
|
14877
14877
|
}
|
|
14878
14878
|
}
|
|
14879
14879
|
// 打印基本信息
|
|
14880
|
-
const base64Data = dataUrl.split(',')[1];
|
|
14880
|
+
const base64Data = dataUrl.split(',')[1] || '';
|
|
14881
14881
|
if (!this.options.silentMode) {
|
|
14882
14882
|
console.log('📸 截图完成:');
|
|
14883
14883
|
console.log(`📸 编号: #${this.screenshotCount}`);
|
|
14884
14884
|
console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
|
|
14885
14885
|
console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
|
|
14886
14886
|
console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
|
|
14887
|
+
// 完整打印压缩前的 base64
|
|
14888
|
+
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
14889
|
+
console.log(base64Data);
|
|
14890
|
+
console.log(`📸 [压缩前] 完整 Data URL:`);
|
|
14891
|
+
console.log(dataUrl);
|
|
14887
14892
|
}
|
|
14888
14893
|
// 如果启用压缩(所有设备都支持)
|
|
14889
14894
|
const shouldCompress = this.options.compress;
|
|
@@ -14904,10 +14909,13 @@ class ScreenshotManager {
|
|
|
14904
14909
|
if (!this.options.silentMode) {
|
|
14905
14910
|
console.log('📸 发送到 WebWorker 进行压缩...');
|
|
14906
14911
|
}
|
|
14912
|
+
// 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
|
|
14913
|
+
// 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
|
|
14914
|
+
const originalDataUrlForCompression = dataUrl;
|
|
14907
14915
|
this.worker.postMessage({
|
|
14908
14916
|
type: 'COMPRESS_IMAGE',
|
|
14909
14917
|
data: {
|
|
14910
|
-
dataUrl,
|
|
14918
|
+
dataUrl: originalDataUrlForCompression, // 保存原始 dataUrl
|
|
14911
14919
|
maxWidth: this.options.maxWidth,
|
|
14912
14920
|
maxHeight: this.options.maxHeight,
|
|
14913
14921
|
quality: this.options.quality,
|
|
@@ -16960,15 +16968,29 @@ class ScreenshotManager {
|
|
|
16960
16968
|
const { type, data } = e.data;
|
|
16961
16969
|
if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
|
|
16962
16970
|
const compressed = data.compressed;
|
|
16971
|
+
// 获取压缩前的原始数据
|
|
16972
|
+
// 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
|
|
16973
|
+
const originalDataUrl = this.screenshotHistory.length > 0
|
|
16974
|
+
? this.screenshotHistory[this.screenshotHistory.length - 1]
|
|
16975
|
+
: '';
|
|
16963
16976
|
// 更新截图历史记录(压缩成功或失败都会更新)
|
|
16964
16977
|
if (this.screenshotHistory.length > 0 && compressed.dataUrl) {
|
|
16978
|
+
// 保存压缩前的原始数据用于对比
|
|
16979
|
+
const originalBase64 = originalDataUrl.split(',')[1] || '';
|
|
16980
|
+
const compressedBase64 = compressed.dataUrl.split(',')[1] || '';
|
|
16981
|
+
// 更新历史记录为压缩后的数据
|
|
16965
16982
|
this.screenshotHistory[this.screenshotHistory.length - 1] = compressed.dataUrl;
|
|
16966
|
-
//
|
|
16983
|
+
// 打印压缩统计信息和 base64 对比
|
|
16967
16984
|
if (!this.options.silentMode) {
|
|
16968
16985
|
if (compressed.error) {
|
|
16969
16986
|
// 压缩失败,使用原始数据
|
|
16970
16987
|
console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
|
|
16971
16988
|
console.warn(` ⚠️ 错误: ${compressed.error}`);
|
|
16989
|
+
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
16990
|
+
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
16991
|
+
console.log(originalBase64);
|
|
16992
|
+
console.log(`📸 [压缩前] 完整 Data URL:`);
|
|
16993
|
+
console.log(originalDataUrl);
|
|
16972
16994
|
}
|
|
16973
16995
|
else if (compressed.originalSize && compressed.compressedSize) {
|
|
16974
16996
|
// 压缩成功,显示统计信息
|
|
@@ -16979,6 +17001,17 @@ class ScreenshotManager {
|
|
|
16979
17001
|
console.log(` 原始大小: ${originalKB} KB`);
|
|
16980
17002
|
console.log(` 压缩后: ${compressedKB} KB`);
|
|
16981
17003
|
console.log(` 压缩率: ${ratio}%`);
|
|
17004
|
+
// 完整打印压缩前后的 base64 对比
|
|
17005
|
+
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
17006
|
+
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
17007
|
+
console.log(originalBase64);
|
|
17008
|
+
console.log(`📸 [压缩前] 完整 Data URL:`);
|
|
17009
|
+
console.log(originalDataUrl);
|
|
17010
|
+
console.log(`📸 [压缩后] Base64 长度: ${compressedBase64.length} 字符`);
|
|
17011
|
+
console.log(`📸 [压缩后] 完整 Base64:`);
|
|
17012
|
+
console.log(compressedBase64);
|
|
17013
|
+
console.log(`📸 [压缩后] 完整 Data URL:`);
|
|
17014
|
+
console.log(compressed.dataUrl);
|
|
16982
17015
|
}
|
|
16983
17016
|
}
|
|
16984
17017
|
// 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
|
|
@@ -17083,20 +17116,20 @@ class ScreenshotManager {
|
|
|
17083
17116
|
}
|
|
17084
17117
|
/**
|
|
17085
17118
|
* 构建二进制结构(按顺序:sign[14], type[1], topicLength[1], topic[topicLength], routingKey[8])
|
|
17086
|
-
* 总大小:
|
|
17119
|
+
* 总大小:15 + 1 + 8 + 8 = 31 字节
|
|
17087
17120
|
*/
|
|
17088
17121
|
buildBinaryConfig(config) {
|
|
17089
|
-
// 总大小:
|
|
17090
|
-
const buffer = new ArrayBuffer(
|
|
17122
|
+
// 总大小:15 + 1 + 8 + 8 = 32 字节
|
|
17123
|
+
const buffer = new ArrayBuffer(32);
|
|
17091
17124
|
const view = new DataView(buffer);
|
|
17092
17125
|
const encoder = new TextEncoder();
|
|
17093
17126
|
let offset = 0;
|
|
17094
17127
|
// sign: 14字节 (字符串,UTF-8编码,不足补0,大端序)
|
|
17095
17128
|
const signStr = String(config.sign);
|
|
17096
17129
|
const signBytes = encoder.encode(signStr);
|
|
17097
|
-
const signArray = new Uint8Array(buffer, offset,
|
|
17098
|
-
signArray.set(signBytes.slice(0,
|
|
17099
|
-
offset +=
|
|
17130
|
+
const signArray = new Uint8Array(buffer, offset, 15);
|
|
17131
|
+
signArray.set(signBytes.slice(0, 15)); // 截取前15字节,不足自动补0
|
|
17132
|
+
offset += 15;
|
|
17100
17133
|
// type: 1字节
|
|
17101
17134
|
view.setUint8(offset, config.type);
|
|
17102
17135
|
offset += 1;
|
|
@@ -17230,6 +17263,15 @@ class ScreenshotManager {
|
|
|
17230
17263
|
// 计算 base64 大小
|
|
17231
17264
|
const base64Data = dataUrl.split(',')[1] || '';
|
|
17232
17265
|
const base64Size = base64Data.length;
|
|
17266
|
+
// 完整打印发送前的 base64 信息(用于调试)
|
|
17267
|
+
if (!this.options.silentMode) {
|
|
17268
|
+
console.log('📸 [发送前] Base64 信息:');
|
|
17269
|
+
console.log(` Base64 长度: ${base64Size} 字符`);
|
|
17270
|
+
console.log(` 📸 [发送前] 完整 Base64:`);
|
|
17271
|
+
console.log(base64Data);
|
|
17272
|
+
console.log(` 📸 [发送前] 完整 Data URL:`);
|
|
17273
|
+
console.log(dataUrl);
|
|
17274
|
+
}
|
|
17233
17275
|
// 将截图转换为 ArrayBuffer
|
|
17234
17276
|
const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
|
|
17235
17277
|
const imageBufferSize = imageBuffer.byteLength;
|
|
@@ -17261,6 +17303,54 @@ class ScreenshotManager {
|
|
|
17261
17303
|
console.error('📸 [压缩后] ❌ 处理二进制数据失败:', error);
|
|
17262
17304
|
}
|
|
17263
17305
|
}
|
|
17306
|
+
getCompressedScreenshot(format = 'dataUrl', fileName) {
|
|
17307
|
+
const dataUrl = this.getLatestScreenshot();
|
|
17308
|
+
if (!dataUrl) {
|
|
17309
|
+
return null;
|
|
17310
|
+
}
|
|
17311
|
+
switch (format) {
|
|
17312
|
+
case 'dataUrl':
|
|
17313
|
+
return dataUrl;
|
|
17314
|
+
case 'blob': {
|
|
17315
|
+
const arr = dataUrl.split(',');
|
|
17316
|
+
const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
|
|
17317
|
+
const bstr = atob(arr[1]);
|
|
17318
|
+
const n = bstr.length;
|
|
17319
|
+
const u8arr = new Uint8Array(n);
|
|
17320
|
+
for (let i = 0; i < n; i++) {
|
|
17321
|
+
u8arr[i] = bstr.charCodeAt(i);
|
|
17322
|
+
}
|
|
17323
|
+
return new Blob([u8arr], { type: mime });
|
|
17324
|
+
}
|
|
17325
|
+
case 'arrayBuffer': {
|
|
17326
|
+
return this.dataUrlToArrayBuffer(dataUrl);
|
|
17327
|
+
}
|
|
17328
|
+
case 'file': {
|
|
17329
|
+
const arr = dataUrl.split(',');
|
|
17330
|
+
const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
|
|
17331
|
+
const bstr = atob(arr[1]);
|
|
17332
|
+
const n = bstr.length;
|
|
17333
|
+
const u8arr = new Uint8Array(n);
|
|
17334
|
+
for (let i = 0; i < n; i++) {
|
|
17335
|
+
u8arr[i] = bstr.charCodeAt(i);
|
|
17336
|
+
}
|
|
17337
|
+
const blob = new Blob([u8arr], { type: mime });
|
|
17338
|
+
const fileExtension = mime.split('/')[1] || 'webp';
|
|
17339
|
+
const finalFileName = fileName || `screenshot.${fileExtension}`;
|
|
17340
|
+
return new File([blob], finalFileName, { type: mime });
|
|
17341
|
+
}
|
|
17342
|
+
case 'image': {
|
|
17343
|
+
return new Promise((resolve) => {
|
|
17344
|
+
const img = new Image();
|
|
17345
|
+
img.onload = () => resolve(img);
|
|
17346
|
+
img.onerror = () => resolve(null);
|
|
17347
|
+
img.src = dataUrl;
|
|
17348
|
+
});
|
|
17349
|
+
}
|
|
17350
|
+
default:
|
|
17351
|
+
return dataUrl;
|
|
17352
|
+
}
|
|
17353
|
+
}
|
|
17264
17354
|
/**
|
|
17265
17355
|
* 启用/禁用截图功能
|
|
17266
17356
|
*/
|