customer-chat-sdk 1.0.63 → 1.0.65
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.
|
@@ -290,8 +290,16 @@ export declare class ScreenshotManager {
|
|
|
290
290
|
*/
|
|
291
291
|
private arrayBufferToBase64;
|
|
292
292
|
/**
|
|
293
|
-
* 构建二进制结构(按顺序:sign[
|
|
294
|
-
* 20 + 1 +
|
|
293
|
+
* 构建二进制结构(按顺序:sign[20], type[1], topicLength[1], topic[topicLength], routingKeyLength[1], routingKey[routingKeyLength])
|
|
294
|
+
* 总大小 = 20 + 1 + 1 + topicLength + 1 + routingKeyLength(动态计算)
|
|
295
|
+
*
|
|
296
|
+
* 与服务端格式对应:
|
|
297
|
+
* - sign: 20字节 (CharSequence, UTF-8)
|
|
298
|
+
* - type: 1字节 (转为无符号)
|
|
299
|
+
* - topicLength: 1字节
|
|
300
|
+
* - topic: topicLength字节 (CharSequence, UTF-8)
|
|
301
|
+
* - routingKeyLength: 1字节
|
|
302
|
+
* - routingKey: routingKeyLength字节 (CharSequence, UTF-8)
|
|
295
303
|
*/
|
|
296
304
|
private buildBinaryConfig;
|
|
297
305
|
/**
|
|
@@ -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
|
@@ -15190,7 +15190,6 @@ class ScreenshotManager {
|
|
|
15190
15190
|
throw new Error('元素尺寸为 0,无法截图');
|
|
15191
15191
|
}
|
|
15192
15192
|
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
15193
|
-
const isLowEndDevice = navigator.hardwareConcurrency && navigator.hardwareConcurrency <= 4;
|
|
15194
15193
|
// 计算压缩后的尺寸
|
|
15195
15194
|
let elementWidth = element.scrollWidth || element.clientWidth || element.offsetWidth;
|
|
15196
15195
|
let elementHeight = element.scrollHeight || element.clientHeight || element.offsetHeight;
|
|
@@ -15199,10 +15198,9 @@ class ScreenshotManager {
|
|
|
15199
15198
|
elementHeight = Math.max(element.scrollHeight, element.offsetHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight, window.innerHeight);
|
|
15200
15199
|
}
|
|
15201
15200
|
// html2canvas 质量设置(0-1)
|
|
15202
|
-
//
|
|
15203
|
-
|
|
15204
|
-
|
|
15205
|
-
: Math.max(this.options.quality, 0.15); // 桌面设备:最低 0.15
|
|
15201
|
+
// 直接使用用户传入的质量值,不再自动降低
|
|
15202
|
+
// 最低限制为 0.1,避免质量过低导致图片无法使用
|
|
15203
|
+
const finalQuality = Math.max(this.options.quality || 0.4, 0.1);
|
|
15206
15204
|
// html2canvas 配置选项
|
|
15207
15205
|
// 注意:不要设置 width 和 height,让 html2canvas 自动计算元素的实际尺寸
|
|
15208
15206
|
// 设置固定的 width/height 会导致截图尺寸不正确
|
|
@@ -15414,13 +15412,15 @@ class ScreenshotManager {
|
|
|
15414
15412
|
if (!this.options.silentMode) {
|
|
15415
15413
|
console.log(`📸 html2canvas 配置: 元素尺寸 ${elementWidth}x${elementHeight}, 质量 ${finalQuality.toFixed(2)}, 缩放 ${options.scale}`);
|
|
15416
15414
|
console.log(`📸 html2canvas 将自动计算截图尺寸(不限制 width/height)`);
|
|
15415
|
+
console.log(`📸 用户配置质量: ${this.options.quality}, 实际使用质量: ${finalQuality.toFixed(2)}`);
|
|
15417
15416
|
}
|
|
15418
15417
|
// 执行截图
|
|
15419
15418
|
const canvas = await html2canvas(element, options);
|
|
15420
15419
|
// 根据输出格式转换
|
|
15421
15420
|
let mimeType = 'image/png';
|
|
15422
15421
|
let finalQualityForExport = undefined;
|
|
15423
|
-
|
|
15422
|
+
// 尝试使用用户指定的格式(包括移动设备)
|
|
15423
|
+
if (this.options.outputFormat === 'webp') {
|
|
15424
15424
|
try {
|
|
15425
15425
|
const testCanvas = document.createElement('canvas');
|
|
15426
15426
|
testCanvas.width = 1;
|
|
@@ -15430,8 +15430,14 @@ class ScreenshotManager {
|
|
|
15430
15430
|
mimeType = 'image/webp';
|
|
15431
15431
|
finalQualityForExport = finalQuality;
|
|
15432
15432
|
}
|
|
15433
|
+
else {
|
|
15434
|
+
// WebP 不支持,回退到 JPEG
|
|
15435
|
+
mimeType = 'image/jpeg';
|
|
15436
|
+
finalQualityForExport = finalQuality;
|
|
15437
|
+
}
|
|
15433
15438
|
}
|
|
15434
15439
|
catch {
|
|
15440
|
+
// WebP 测试失败,回退到 JPEG
|
|
15435
15441
|
mimeType = 'image/jpeg';
|
|
15436
15442
|
finalQualityForExport = finalQuality;
|
|
15437
15443
|
}
|
|
@@ -15449,7 +15455,8 @@ class ScreenshotManager {
|
|
|
15449
15455
|
throw new Error('生成的截图数据无效或过短');
|
|
15450
15456
|
}
|
|
15451
15457
|
if (!this.options.silentMode) {
|
|
15452
|
-
console.log(`📸 html2canvas 截图成功!格式: ${
|
|
15458
|
+
console.log(`📸 html2canvas 截图成功!格式: ${mimeType}, 尺寸: ${canvas.width}x${canvas.height}, 质量: ${finalQualityForExport?.toFixed(2) || 'N/A (PNG)'}`);
|
|
15459
|
+
console.log(`📸 输出格式: ${mimeType}, 用户配置质量: ${this.options.quality}, 实际使用质量: ${finalQualityForExport?.toFixed(2) || 'N/A (PNG)'}`);
|
|
15453
15460
|
}
|
|
15454
15461
|
return dataUrl;
|
|
15455
15462
|
}
|
|
@@ -17200,16 +17207,30 @@ class ScreenshotManager {
|
|
|
17200
17207
|
return btoa(binaryStr);
|
|
17201
17208
|
}
|
|
17202
17209
|
/**
|
|
17203
|
-
* 构建二进制结构(按顺序:sign[
|
|
17204
|
-
* 20 + 1 +
|
|
17210
|
+
* 构建二进制结构(按顺序:sign[20], type[1], topicLength[1], topic[topicLength], routingKeyLength[1], routingKey[routingKeyLength])
|
|
17211
|
+
* 总大小 = 20 + 1 + 1 + topicLength + 1 + routingKeyLength(动态计算)
|
|
17212
|
+
*
|
|
17213
|
+
* 与服务端格式对应:
|
|
17214
|
+
* - sign: 20字节 (CharSequence, UTF-8)
|
|
17215
|
+
* - type: 1字节 (转为无符号)
|
|
17216
|
+
* - topicLength: 1字节
|
|
17217
|
+
* - topic: topicLength字节 (CharSequence, UTF-8)
|
|
17218
|
+
* - routingKeyLength: 1字节
|
|
17219
|
+
* - routingKey: routingKeyLength字节 (CharSequence, UTF-8)
|
|
17205
17220
|
*/
|
|
17206
17221
|
buildBinaryConfig(config) {
|
|
17207
|
-
// 20 + 1 + 8 + 8 = 37 字节
|
|
17208
|
-
const buffer = new ArrayBuffer(37);
|
|
17209
|
-
const view = new DataView(buffer);
|
|
17210
17222
|
const encoder = new TextEncoder();
|
|
17223
|
+
// 计算实际长度
|
|
17224
|
+
const topicBytes = encoder.encode(config.topic);
|
|
17225
|
+
const topicLength = topicBytes.length;
|
|
17226
|
+
const routingKeyBytes = encoder.encode(config.routingKey.trim());
|
|
17227
|
+
const routingKeyLength = routingKeyBytes.length;
|
|
17228
|
+
// 动态计算总大小:20(sign) + 1(type) + 1(topicLength) + topicLength + 1(routingKeyLength) + routingKeyLength
|
|
17229
|
+
const totalSize = 20 + 1 + 1 + topicLength + 1 + routingKeyLength;
|
|
17230
|
+
const buffer = new ArrayBuffer(totalSize);
|
|
17231
|
+
const view = new DataView(buffer);
|
|
17211
17232
|
let offset = 0;
|
|
17212
|
-
// sign: 20字节 (字符串,UTF-8编码,不足补0
|
|
17233
|
+
// sign: 20字节 (字符串,UTF-8编码,不足补0)
|
|
17213
17234
|
const signStr = String(config.sign);
|
|
17214
17235
|
const signBytes = encoder.encode(signStr);
|
|
17215
17236
|
const signArray = new Uint8Array(buffer, offset, 20);
|
|
@@ -17218,21 +17239,17 @@ class ScreenshotManager {
|
|
|
17218
17239
|
// type: 1字节
|
|
17219
17240
|
view.setUint8(offset, config.type);
|
|
17220
17241
|
offset += 1;
|
|
17221
|
-
// topic: 8字节
|
|
17222
|
-
const topicBytes = encoder.encode(config.topic);
|
|
17223
|
-
const topicLength = topicBytes.length;
|
|
17224
17242
|
// topicLength: 1字节
|
|
17225
17243
|
view.setUint8(offset, topicLength);
|
|
17226
17244
|
offset += 1;
|
|
17245
|
+
// topic: topicLength字节
|
|
17227
17246
|
const topicArray = new Uint8Array(buffer, offset, topicLength);
|
|
17228
17247
|
topicArray.set(topicBytes);
|
|
17229
17248
|
offset += topicLength;
|
|
17230
|
-
// routingKey:
|
|
17231
|
-
const routingKeyBytes = encoder.encode(config.routingKey.trim());
|
|
17232
|
-
const routingKeyLength = routingKeyBytes.length;
|
|
17233
17249
|
// routingKeyLength: 1字节
|
|
17234
17250
|
view.setUint8(offset, routingKeyLength);
|
|
17235
17251
|
offset += 1;
|
|
17252
|
+
// routingKey: routingKeyLength字节
|
|
17236
17253
|
const routingKeyArray = new Uint8Array(buffer, offset, routingKeyLength);
|
|
17237
17254
|
routingKeyArray.set(routingKeyBytes);
|
|
17238
17255
|
offset += routingKeyLength;
|
|
@@ -17285,12 +17302,26 @@ class ScreenshotManager {
|
|
|
17285
17302
|
const imageBufferSize = imageBuffer.byteLength;
|
|
17286
17303
|
// 将 imageBuffer 转换为 base64 字符串(用于和接收端对比)
|
|
17287
17304
|
const imageBufferBase64 = this.arrayBufferToBase64(imageBuffer);
|
|
17305
|
+
// 验证:base64Data(从 latestScreenshot 提取)和 imageBufferBase64(从 imageBuffer 转换)应该一致
|
|
17306
|
+
const isBase64Same = base64Data === imageBufferBase64;
|
|
17288
17307
|
// 打印 imageBuffer 的 base64 编码(用于和接收端对比)
|
|
17289
17308
|
if (!this.options.silentMode) {
|
|
17309
|
+
console.log('📸 [发送前] 数据流程分析:');
|
|
17310
|
+
console.log(` latestScreenshot: ${latestScreenshot.substring(0, 50)}... (原始 data URL)`);
|
|
17311
|
+
console.log(` base64Data (从 latestScreenshot 提取): 长度 ${base64Data.length} 字符`);
|
|
17312
|
+
console.log(` imageBuffer: ArrayBuffer, 大小 ${imageBufferSize} 字节`);
|
|
17313
|
+
console.log(` imageBufferBase64 (从 imageBuffer 转换): 长度 ${imageBufferBase64.length} 字符`);
|
|
17314
|
+
console.log(` ✅ 验证: base64Data === imageBufferBase64 ? ${isBase64Same ? '✅ 一致' : '❌ 不一致'}`);
|
|
17315
|
+
if (!isBase64Same) {
|
|
17316
|
+
console.warn('📸 ⚠️ 警告: base64Data 和 imageBufferBase64 不一致!');
|
|
17317
|
+
console.log(' base64Data (前100字符):', base64Data.substring(0, 100));
|
|
17318
|
+
console.log(' imageBufferBase64 (前100字符):', imageBufferBase64.substring(0, 100));
|
|
17319
|
+
}
|
|
17290
17320
|
console.log('📸 [发送前] imageBuffer 转换为 Base64(用于和接收端对比):');
|
|
17291
17321
|
console.log(` Base64 长度: ${imageBufferBase64.length} 字符`);
|
|
17292
17322
|
console.log(` Base64 完整字符串:`);
|
|
17293
17323
|
console.log(imageBufferBase64);
|
|
17324
|
+
console.log(` 📌 接收端使用方法: const imageUrl = \`data:image/webp;base64,\${receivedBase64}\``);
|
|
17294
17325
|
console.log(` Data URL: data:image/webp;base64,${imageBufferBase64}`);
|
|
17295
17326
|
}
|
|
17296
17327
|
// 构建配置的二进制结构
|
package/dist/customer-sdk.esm.js
CHANGED
|
@@ -15186,7 +15186,6 @@ class ScreenshotManager {
|
|
|
15186
15186
|
throw new Error('元素尺寸为 0,无法截图');
|
|
15187
15187
|
}
|
|
15188
15188
|
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
15189
|
-
const isLowEndDevice = navigator.hardwareConcurrency && navigator.hardwareConcurrency <= 4;
|
|
15190
15189
|
// 计算压缩后的尺寸
|
|
15191
15190
|
let elementWidth = element.scrollWidth || element.clientWidth || element.offsetWidth;
|
|
15192
15191
|
let elementHeight = element.scrollHeight || element.clientHeight || element.offsetHeight;
|
|
@@ -15195,10 +15194,9 @@ class ScreenshotManager {
|
|
|
15195
15194
|
elementHeight = Math.max(element.scrollHeight, element.offsetHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight, window.innerHeight);
|
|
15196
15195
|
}
|
|
15197
15196
|
// html2canvas 质量设置(0-1)
|
|
15198
|
-
//
|
|
15199
|
-
|
|
15200
|
-
|
|
15201
|
-
: Math.max(this.options.quality, 0.15); // 桌面设备:最低 0.15
|
|
15197
|
+
// 直接使用用户传入的质量值,不再自动降低
|
|
15198
|
+
// 最低限制为 0.1,避免质量过低导致图片无法使用
|
|
15199
|
+
const finalQuality = Math.max(this.options.quality || 0.4, 0.1);
|
|
15202
15200
|
// html2canvas 配置选项
|
|
15203
15201
|
// 注意:不要设置 width 和 height,让 html2canvas 自动计算元素的实际尺寸
|
|
15204
15202
|
// 设置固定的 width/height 会导致截图尺寸不正确
|
|
@@ -15410,13 +15408,15 @@ class ScreenshotManager {
|
|
|
15410
15408
|
if (!this.options.silentMode) {
|
|
15411
15409
|
console.log(`📸 html2canvas 配置: 元素尺寸 ${elementWidth}x${elementHeight}, 质量 ${finalQuality.toFixed(2)}, 缩放 ${options.scale}`);
|
|
15412
15410
|
console.log(`📸 html2canvas 将自动计算截图尺寸(不限制 width/height)`);
|
|
15411
|
+
console.log(`📸 用户配置质量: ${this.options.quality}, 实际使用质量: ${finalQuality.toFixed(2)}`);
|
|
15413
15412
|
}
|
|
15414
15413
|
// 执行截图
|
|
15415
15414
|
const canvas = await html2canvas(element, options);
|
|
15416
15415
|
// 根据输出格式转换
|
|
15417
15416
|
let mimeType = 'image/png';
|
|
15418
15417
|
let finalQualityForExport = undefined;
|
|
15419
|
-
|
|
15418
|
+
// 尝试使用用户指定的格式(包括移动设备)
|
|
15419
|
+
if (this.options.outputFormat === 'webp') {
|
|
15420
15420
|
try {
|
|
15421
15421
|
const testCanvas = document.createElement('canvas');
|
|
15422
15422
|
testCanvas.width = 1;
|
|
@@ -15426,8 +15426,14 @@ class ScreenshotManager {
|
|
|
15426
15426
|
mimeType = 'image/webp';
|
|
15427
15427
|
finalQualityForExport = finalQuality;
|
|
15428
15428
|
}
|
|
15429
|
+
else {
|
|
15430
|
+
// WebP 不支持,回退到 JPEG
|
|
15431
|
+
mimeType = 'image/jpeg';
|
|
15432
|
+
finalQualityForExport = finalQuality;
|
|
15433
|
+
}
|
|
15429
15434
|
}
|
|
15430
15435
|
catch {
|
|
15436
|
+
// WebP 测试失败,回退到 JPEG
|
|
15431
15437
|
mimeType = 'image/jpeg';
|
|
15432
15438
|
finalQualityForExport = finalQuality;
|
|
15433
15439
|
}
|
|
@@ -15445,7 +15451,8 @@ class ScreenshotManager {
|
|
|
15445
15451
|
throw new Error('生成的截图数据无效或过短');
|
|
15446
15452
|
}
|
|
15447
15453
|
if (!this.options.silentMode) {
|
|
15448
|
-
console.log(`📸 html2canvas 截图成功!格式: ${
|
|
15454
|
+
console.log(`📸 html2canvas 截图成功!格式: ${mimeType}, 尺寸: ${canvas.width}x${canvas.height}, 质量: ${finalQualityForExport?.toFixed(2) || 'N/A (PNG)'}`);
|
|
15455
|
+
console.log(`📸 输出格式: ${mimeType}, 用户配置质量: ${this.options.quality}, 实际使用质量: ${finalQualityForExport?.toFixed(2) || 'N/A (PNG)'}`);
|
|
15449
15456
|
}
|
|
15450
15457
|
return dataUrl;
|
|
15451
15458
|
}
|
|
@@ -17196,16 +17203,30 @@ class ScreenshotManager {
|
|
|
17196
17203
|
return btoa(binaryStr);
|
|
17197
17204
|
}
|
|
17198
17205
|
/**
|
|
17199
|
-
* 构建二进制结构(按顺序:sign[
|
|
17200
|
-
* 20 + 1 +
|
|
17206
|
+
* 构建二进制结构(按顺序:sign[20], type[1], topicLength[1], topic[topicLength], routingKeyLength[1], routingKey[routingKeyLength])
|
|
17207
|
+
* 总大小 = 20 + 1 + 1 + topicLength + 1 + routingKeyLength(动态计算)
|
|
17208
|
+
*
|
|
17209
|
+
* 与服务端格式对应:
|
|
17210
|
+
* - sign: 20字节 (CharSequence, UTF-8)
|
|
17211
|
+
* - type: 1字节 (转为无符号)
|
|
17212
|
+
* - topicLength: 1字节
|
|
17213
|
+
* - topic: topicLength字节 (CharSequence, UTF-8)
|
|
17214
|
+
* - routingKeyLength: 1字节
|
|
17215
|
+
* - routingKey: routingKeyLength字节 (CharSequence, UTF-8)
|
|
17201
17216
|
*/
|
|
17202
17217
|
buildBinaryConfig(config) {
|
|
17203
|
-
// 20 + 1 + 8 + 8 = 37 字节
|
|
17204
|
-
const buffer = new ArrayBuffer(37);
|
|
17205
|
-
const view = new DataView(buffer);
|
|
17206
17218
|
const encoder = new TextEncoder();
|
|
17219
|
+
// 计算实际长度
|
|
17220
|
+
const topicBytes = encoder.encode(config.topic);
|
|
17221
|
+
const topicLength = topicBytes.length;
|
|
17222
|
+
const routingKeyBytes = encoder.encode(config.routingKey.trim());
|
|
17223
|
+
const routingKeyLength = routingKeyBytes.length;
|
|
17224
|
+
// 动态计算总大小:20(sign) + 1(type) + 1(topicLength) + topicLength + 1(routingKeyLength) + routingKeyLength
|
|
17225
|
+
const totalSize = 20 + 1 + 1 + topicLength + 1 + routingKeyLength;
|
|
17226
|
+
const buffer = new ArrayBuffer(totalSize);
|
|
17227
|
+
const view = new DataView(buffer);
|
|
17207
17228
|
let offset = 0;
|
|
17208
|
-
// sign: 20字节 (字符串,UTF-8编码,不足补0
|
|
17229
|
+
// sign: 20字节 (字符串,UTF-8编码,不足补0)
|
|
17209
17230
|
const signStr = String(config.sign);
|
|
17210
17231
|
const signBytes = encoder.encode(signStr);
|
|
17211
17232
|
const signArray = new Uint8Array(buffer, offset, 20);
|
|
@@ -17214,21 +17235,17 @@ class ScreenshotManager {
|
|
|
17214
17235
|
// type: 1字节
|
|
17215
17236
|
view.setUint8(offset, config.type);
|
|
17216
17237
|
offset += 1;
|
|
17217
|
-
// topic: 8字节
|
|
17218
|
-
const topicBytes = encoder.encode(config.topic);
|
|
17219
|
-
const topicLength = topicBytes.length;
|
|
17220
17238
|
// topicLength: 1字节
|
|
17221
17239
|
view.setUint8(offset, topicLength);
|
|
17222
17240
|
offset += 1;
|
|
17241
|
+
// topic: topicLength字节
|
|
17223
17242
|
const topicArray = new Uint8Array(buffer, offset, topicLength);
|
|
17224
17243
|
topicArray.set(topicBytes);
|
|
17225
17244
|
offset += topicLength;
|
|
17226
|
-
// routingKey:
|
|
17227
|
-
const routingKeyBytes = encoder.encode(config.routingKey.trim());
|
|
17228
|
-
const routingKeyLength = routingKeyBytes.length;
|
|
17229
17245
|
// routingKeyLength: 1字节
|
|
17230
17246
|
view.setUint8(offset, routingKeyLength);
|
|
17231
17247
|
offset += 1;
|
|
17248
|
+
// routingKey: routingKeyLength字节
|
|
17232
17249
|
const routingKeyArray = new Uint8Array(buffer, offset, routingKeyLength);
|
|
17233
17250
|
routingKeyArray.set(routingKeyBytes);
|
|
17234
17251
|
offset += routingKeyLength;
|
|
@@ -17281,12 +17298,26 @@ class ScreenshotManager {
|
|
|
17281
17298
|
const imageBufferSize = imageBuffer.byteLength;
|
|
17282
17299
|
// 将 imageBuffer 转换为 base64 字符串(用于和接收端对比)
|
|
17283
17300
|
const imageBufferBase64 = this.arrayBufferToBase64(imageBuffer);
|
|
17301
|
+
// 验证:base64Data(从 latestScreenshot 提取)和 imageBufferBase64(从 imageBuffer 转换)应该一致
|
|
17302
|
+
const isBase64Same = base64Data === imageBufferBase64;
|
|
17284
17303
|
// 打印 imageBuffer 的 base64 编码(用于和接收端对比)
|
|
17285
17304
|
if (!this.options.silentMode) {
|
|
17305
|
+
console.log('📸 [发送前] 数据流程分析:');
|
|
17306
|
+
console.log(` latestScreenshot: ${latestScreenshot.substring(0, 50)}... (原始 data URL)`);
|
|
17307
|
+
console.log(` base64Data (从 latestScreenshot 提取): 长度 ${base64Data.length} 字符`);
|
|
17308
|
+
console.log(` imageBuffer: ArrayBuffer, 大小 ${imageBufferSize} 字节`);
|
|
17309
|
+
console.log(` imageBufferBase64 (从 imageBuffer 转换): 长度 ${imageBufferBase64.length} 字符`);
|
|
17310
|
+
console.log(` ✅ 验证: base64Data === imageBufferBase64 ? ${isBase64Same ? '✅ 一致' : '❌ 不一致'}`);
|
|
17311
|
+
if (!isBase64Same) {
|
|
17312
|
+
console.warn('📸 ⚠️ 警告: base64Data 和 imageBufferBase64 不一致!');
|
|
17313
|
+
console.log(' base64Data (前100字符):', base64Data.substring(0, 100));
|
|
17314
|
+
console.log(' imageBufferBase64 (前100字符):', imageBufferBase64.substring(0, 100));
|
|
17315
|
+
}
|
|
17286
17316
|
console.log('📸 [发送前] imageBuffer 转换为 Base64(用于和接收端对比):');
|
|
17287
17317
|
console.log(` Base64 长度: ${imageBufferBase64.length} 字符`);
|
|
17288
17318
|
console.log(` Base64 完整字符串:`);
|
|
17289
17319
|
console.log(imageBufferBase64);
|
|
17320
|
+
console.log(` 📌 接收端使用方法: const imageUrl = \`data:image/webp;base64,\${receivedBase64}\``);
|
|
17290
17321
|
console.log(` Data URL: data:image/webp;base64,${imageBufferBase64}`);
|
|
17291
17322
|
}
|
|
17292
17323
|
// 构建配置的二进制结构
|