From 1e51023c00bd615ed6fa024afdd9c360da12596b Mon Sep 17 00:00:00 2001 From: liub Date: Fri, 3 Apr 2026 17:24:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=96=E6=A8=A1=E7=BB=84?= =?UTF-8?q?=E4=BB=B6,=E5=8F=96=E6=A8=A1=E6=95=88=E6=9E=9C=E6=9B=B4?= =?UTF-8?q?=E5=A5=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ProParams/ProParams.vue | 2 +- components/TextToHex/TextToHex.vue | 58 ++++++++----- components/TextToHex/TextToHexV1.vue | 86 +++++++++---------- components/TextToHex/TextToHexV2.vue | 6 +- components/TextToHex/textToDotMatrix.vue | 17 +++- .../TextToHex/textToDotMatrixFor7305.vue | 28 +++--- components/TextToHex/textToDotMatrixV1.vue | 18 ++-- pages/6075J/BJQ6075J.vue | 4 +- utils/BleHelper.js | 2 +- 9 files changed, 132 insertions(+), 89 deletions(-) diff --git a/components/ProParams/ProParams.vue b/components/ProParams/ProParams.vue index 11742ea..28a41b6 100644 --- a/components/ProParams/ProParams.vue +++ b/components/ProParams/ProParams.vue @@ -107,6 +107,6 @@ justify-content: space-between; align-items: center; font-size: 28rpx; - color: #FFFFFF; + color: #FFFFFFde; } \ No newline at end of file diff --git a/components/TextToHex/TextToHex.vue b/components/TextToHex/TextToHex.vue index ea33b5e..fe8cfee 100644 --- a/components/TextToHex/TextToHex.vue +++ b/components/TextToHex/TextToHex.vue @@ -58,7 +58,7 @@ * 清除Canvas内容 */ clearCanvas() { - this.ctx.setFillStyle(this.bgColor); + this.ctx.setFillStyle('#FFFFFF');//this.bgColor this.ctx.fillRect(0, 0, this.currentCanvasWidth, this.currentCanvasHeight); }, @@ -73,31 +73,49 @@ // 逐行处理 for (let y = 0; y < 16; y++) { - let byte1 = 0, - byte2 = 0; + let byte1 = '', + byte2 = ''; // 每行16个像素,分为两个字节 for (let x = 0; x < 16; x++) { // 计算像素在imageData中的索引 (RGBA格式) let index = (y * 16 + x) * 4; - let red = imageData[index]; - - // 黑色像素(R值较低)视为1,白色视为0 - let isBlack = red < 128; - - if (x < 8) { - // 第一个字节(左8位) - if (isBlack) { - byte1 |= 0x80 >> x; // 从左到右设置位 - } - } else { - // 第二个字节(右8位) - if (isBlack) { - byte2 |= 0x80 >> (x - 8); - } + let index = (y * 16 + x) * 4; + let r = imageData[index]; + let g = imageData[index+1]; + let b = imageData[index+2]; + + + let gray = (r + g + b) / 3; + let bit = gray < 255 ? '1' : '0'; + + + + if (x < 8) { + byte1+=bit; + } else { + byte2+=bit; } - } + // let red = imageData[index]; + // // 黑色像素(R值较低)视为1,白色视为0 + // let isBlack = red < 128; + + // if (x < 8) { + // // 第一个字节(左8位) + // if (isBlack) { + // byte1 |= 0x80 >> x; // 从左到右设置位 + // } + // } else { + // // 第二个字节(右8位) + // if (isBlack) { + // byte2 |= 0x80 >> (x - 8); + // } + // } + } + + byte1=parseInt(byte1,2); + byte2=parseInt(byte2,2); // 将字节转换为两位十六进制字符串 matrix.push('0x' + byte1.toString(16).padStart(2, '0').toUpperCase()); matrix.push('0x' + byte2.toString(16).padStart(2, '0').toUpperCase()); @@ -118,7 +136,7 @@ this.clearCanvas(); // 3. 设置文字样式 - ctx.setFillStyle(this.color); + ctx.setFillStyle('#000000');//this.color ctx.setTextBaseline('middle'); ctx.setFontSize(this.fontSize); ctx.font = `${this.fontSize}px "PingFang SC", PingFang SC, Arial, sans-serif`; diff --git a/components/TextToHex/TextToHexV1.vue b/components/TextToHex/TextToHexV1.vue index 36612d1..a54a9ed 100644 --- a/components/TextToHex/TextToHexV1.vue +++ b/components/TextToHex/TextToHexV1.vue @@ -60,7 +60,7 @@ * 清除Canvas内容 */ clearCanvas() { - this.ctx.setFillStyle(this.bgColor); + this.ctx.setFillStyle('#FFFFFF'); //this.bgColor this.ctx.fillRect(0, 0, this.currentCanvasWidth, this.currentCanvasHeight); }, @@ -71,22 +71,22 @@ if (this.canvasWarmed) { return; } - + try { // 设置画布尺寸 this.currentCanvasWidth = 16; this.currentCanvasHeight = 16; - + // 清空画布 this.clearCanvas(); - + // 绘制一个测试字符来预热字体和画布 - this.ctx.setFillStyle(this.color); + this.ctx.setFillStyle('#000000'); //this.color this.ctx.setFontSize(this.fontSize); this.ctx.font = `${this.fontSize}px "PingFangBold", "PingFang SC", Arial, sans-serif`; this.ctx.setTextBaseline('middle'); this.ctx.fillText('测', 0, 8); - + // 等待画布绘制完成 await new Promise((resolve) => { this.ctx.draw(false, () => { @@ -110,7 +110,7 @@ }, 100); }); }); - + // 额外等待确保字体完全加载 await new Promise(resolve => setTimeout(resolve, 200)); } catch (ex) { @@ -118,55 +118,55 @@ this.canvasWarmed = true; // 即使失败也标记为已预热,避免重复尝试 } }, - + /** * 复用单个Canvas处理所有文本行 */ async drawAndGetPixels() { // 第一次调用时先预热画布(解决APP重新打开后第一次获取数据不完整的问题) // await this.warmupCanvas(); - - let convertCharToMatrix=function(imageData) { - debugger; + let convertCharToMatrix = function(imageData) { + // console.log("imgData=",imageData) let matrix = []; - + // 逐行处理 for (let y = 0; y < 16; y++) { - let byte1 = 0, - byte2 = 0; - - // 每行16个像素,分为两个字节 + let byte1 = '', + byte2 = ''; + + for (let x = 0; x < 16; x++) { - // 计算像素在imageData中的索引 (RGBA格式) + let index = (y * 16 + x) * 4; - let red = imageData[index]; - - // 黑色像素(R值较低)视为1,白色视为0 - let isBlack = red < 128; - - if (x < 8) { - // 第一个字节(左8位) - if (isBlack) { - byte1 |= 0x80 >> x; // 从左到右设置位 - } - } else { - // 第二个字节(右8位) - if (isBlack) { - byte2 |= 0x80 >> (x - 8); - } + let r = imageData[index]; + let g = imageData[index+1]; + let b = imageData[index+2]; + + + let gray = (r + g + b) / 3; + let bit = gray < 255 ? '1' : '0'; + + + + if (x < 8) { + byte1+=bit; + } else { + byte2+=bit; } } - + byte1=parseInt(byte1,2); + byte2=parseInt(byte2,2); // 将字节转换为两位十六进制字符串 matrix.push('0x' + byte1.toString(16).padStart(2, '0').toUpperCase()); matrix.push('0x' + byte2.toString(16).padStart(2, '0').toUpperCase()); } - + return matrix; } + - let drawTxt=async (textLine)=> { + let drawTxt = async (textLine) => { debugger; let result = {}; let ctx = this.ctx; @@ -179,12 +179,12 @@ this.clearCanvas(); // 3. 设置文字样式 - ctx.setFillStyle(this.color); + ctx.setFillStyle('#000000'); //this.color ctx.setTextBaseline('middle'); // ctx.setTextAlign('center') ctx.setFontSize(this.fontSize); - ctx.font = `${this.fontSize}px "PingFangBold", "PingFang SC", Arial, sans-serif`; - + ctx.font = `${this.fontSize}px "PingFang SC","PingFangBold", Arial, sans-serif`; + // 4. 绘制当前行文本 let currentX = 0; let currentY = this.fontSize / 2; @@ -206,8 +206,8 @@ width: this.currentCanvasWidth, height: this.currentCanvasHeight, success: res => { - - result={ + + result = { line: textLine, pixelData: res.data, width: this.currentCanvasWidth, @@ -228,10 +228,10 @@ let arr = []; // 循环处理每行文本 for (let i = 0; i < this.validTxts.length; i++) { -debugger; + debugger; let linePixls = []; let item = this.validTxts[i]; - + for (var j = 0; j < item.length; j++) { let result = await drawTxt(item[j]); linePixls.push(convertCharToMatrix(result.pixelData)); @@ -239,7 +239,7 @@ debugger; // console.log("hexs=",linePixls.join(",")); arr.push(linePixls); } - + return arr; } } diff --git a/components/TextToHex/TextToHexV2.vue b/components/TextToHex/TextToHexV2.vue index ffd27b4..d49c4ed 100644 --- a/components/TextToHex/TextToHexV2.vue +++ b/components/TextToHex/TextToHexV2.vue @@ -70,7 +70,7 @@ * 清除Canvas内容 */ clearCanvas() { - this.ctx.setFillStyle(this.bgColor); + this.ctx.setFillStyle('#FFFFFF');//this.bgColor this.ctx.fillRect(0, 0, this.currentCanvasWidth, this.currentCanvasHeight); }, @@ -87,7 +87,7 @@ this.clearCanvas(); // 绘制一个测试字符来预热字体和画布 - this.ctx.setFillStyle(this.color); + this.ctx.setFillStyle('#000000');//this.color this.ctx.setFontSize(this.fontSize); this.ctx.font = `${this.fontSize}px "PingFangBold","PingFang SC", Arial, sans-serif`; this.ctx.setTextBaseline('middle'); @@ -212,7 +212,7 @@ this.clearCanvas(); // 3. 设置文字样式 - ctx.setFillStyle(this.color); + ctx.setFillStyle('#000000');//this.color ctx.setTextBaseline('middle'); // ctx.setTextAlign('center') ctx.setFontSize(this.fontSize); diff --git a/components/TextToHex/textToDotMatrix.vue b/components/TextToHex/textToDotMatrix.vue index 2dc904d..1ac8e4b 100644 --- a/components/TextToHex/textToDotMatrix.vue +++ b/components/TextToHex/textToDotMatrix.vue @@ -58,7 +58,7 @@ * 清除Canvas内容 */ clearCanvas() { - this.ctx.setFillStyle(this.bgColor); + this.ctx.setFillStyle('#FFFFFF');//this.bgColor this.ctx.fillRect(0, 0, this.currentCanvasWidth, this.currentCanvasHeight); }, @@ -100,10 +100,19 @@ for (let x = 0; x < 16; x++) { // 计算像素在imageData中的索引 (RGBA格式) let index = (y * 16 + x) * 4; - let red = imageData[index]; + // let red = imageData[index]; + + let r = imageData[index]; + let g = imageData[index+1]; + let b = imageData[index+2]; + + + let gray = (r + g + b) / 3; + let bit = gray < 255 ? '1' : '0'; + // 黑色像素(R值较低)视为1,白色视为0 - let isBlack = red < 128 ? 1 : 0; + let isBlack =gray < 255 ? 1 : 0;// red < 128 ? 1 : 0; arr.push(isBlack); } @@ -154,7 +163,7 @@ this.clearCanvas(); // 3. 设置文字样式 - ctx.setFillStyle(this.color); + ctx.setFillStyle('#000000');//this.color ctx.setTextBaseline('middle'); // ctx.setTextAlign('center') ctx.setFontSize(this.fontSize); diff --git a/components/TextToHex/textToDotMatrixFor7305.vue b/components/TextToHex/textToDotMatrixFor7305.vue index ddf0847..082a62e 100644 --- a/components/TextToHex/textToDotMatrixFor7305.vue +++ b/components/TextToHex/textToDotMatrixFor7305.vue @@ -65,7 +65,7 @@ * 清除Canvas内容 */ clearCanvas() { - this.ctx.setFillStyle(this.bgColor); + this.ctx.setFillStyle('#FFFFFF');//this.bgColor this.ctx.fillRect(0, 0, this.currentCanvasWidth, this.currentCanvasHeight); }, @@ -82,9 +82,9 @@ this.currentCanvasWidth = 16; this.currentCanvasHeight = 16; this.clearCanvas(); - this.ctx.setFillStyle(this.color); + this.ctx.setFillStyle('#000000');//this.color this.ctx.setFontSize(this.fontSize); - this.ctx.font = `${this.fontSize}px "PingFangBold", "PingFang SC", Arial, sans-serif`; + this.ctx.font = `${this.fontSize}px "PingFang SC","PingFangBold", Arial, sans-serif`; this.ctx.setTextBaseline('middle'); this.ctx.fillText('测', 0, 8); @@ -158,12 +158,20 @@ // pixels.push(R < 128 ? 1 : 0); - const R = imageData[i]; - const G = imageData[i + 1]; - const B = imageData[i + 2]; - const gray = 0.299 * R + 0.587 * G + 0.114 * B; // 灰度转换 - pixels.push(gray < 128 ? 1 : 0); + // const R = imageData[i]; + // const G = imageData[i + 1]; + // const B = imageData[i + 2]; + // const gray = 0.299 * R + 0.587 * G + 0.114 * B; // 灰度转换 + // pixels.push(gray < 128 ? 1 : 0); + let r = imageData[i]; + let g = imageData[i+1]; + let b = imageData[i+2]; + + + let gray = (r + g + b) / 3; + let bit = gray < 255 ? 1 : 0; + pixels.push(bit); } const lowBytes = new Array(charWidth).fill(0); @@ -197,11 +205,11 @@ this.clearCanvas(); // 3. 设置文字样式 - ctx.setFillStyle(this.color); + ctx.setFillStyle('#000000');//this.color ctx.setTextBaseline('middle'); // ctx.setTextAlign('center') ctx.setFontSize(this.fontSize); - ctx.font = `${this.fontSize}px "PingFangBold", "PingFang SC", Arial, sans-serif`; + ctx.font = `${this.fontSize}px "PingFang SC","PingFangBold", Arial, sans-serif`; // 4. 绘制当前行文本 debugger; diff --git a/components/TextToHex/textToDotMatrixV1.vue b/components/TextToHex/textToDotMatrixV1.vue index 5191740..04f2cb0 100644 --- a/components/TextToHex/textToDotMatrixV1.vue +++ b/components/TextToHex/textToDotMatrixV1.vue @@ -59,7 +59,7 @@ * 清除Canvas内容 */ clearCanvas() { - this.ctx.setFillStyle(this.bgColor); + this.ctx.setFillStyle('#FFFFFF');//this.bgColor this.ctx.fillRect(0, 0, this.currentCanvasWidth, this.currentCanvasHeight); }, @@ -105,10 +105,18 @@ let G = imageData[index+1]; let B = imageData[index]+2; + // let r = imageData[i]; + // let g = imageData[i+1]; + // let b = imageData[i+2]; + + + let gray = (R + G + B) / 3; + let bit = gray < 255 ? 1 : 0; + // 黑色像素(R值较低)视为1,白色视为0 - let isBlack = R < 128 ? 1 : 0; - arr.push(isBlack); + // let isBlack = R < 128 ? 1 : 0; + arr.push(bit); } } @@ -159,11 +167,11 @@ this.clearCanvas(); // 3. 设置文字样式 - ctx.setFillStyle(this.color); + ctx.setFillStyle('#000000');//this.color ctx.setTextBaseline('middle'); // ctx.setTextAlign('center') ctx.setFontSize(this.fontSize); - ctx.font = `${this.fontSize}px "PingFangBold", "PingFang SC", Arial, sans-serif`; + ctx.font = `${this.fontSize}px PingFangBold", "PingFang SC", Arial, sans-serif`; // 4. 绘制当前行文本 let currentX = 0; diff --git a/pages/6075J/BJQ6075J.vue b/pages/6075J/BJQ6075J.vue index 23e169c..08d522c 100644 --- a/pages/6075J/BJQ6075J.vue +++ b/pages/6075J/BJQ6075J.vue @@ -39,7 +39,7 @@ - + {{formData.sta_ShakeBit==3?'设备疑似受到外力碰撞':'设备声光报警中'}}! @@ -1418,7 +1418,7 @@ console.error("出现错误", ex) }); } - let msg = val == 1 ? '确定开启声光报警' : '确定关闭声光报警'; + let msg = val == 1 ? '确定开启声光报警' : '确定解除声光报警'; showPop({ message: msg, diff --git a/utils/BleHelper.js b/utils/BleHelper.js index 3d2b207..c531e02 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -668,7 +668,7 @@ class BleHelper { BleReceive() { uni.onBLECharacteristicValueChange((receive) => { //订阅消息 - console.log("收到订阅消息", receive); + // console.log("收到订阅消息", receive); let f = this.data.LinkedList.find((v) => { return v.deviceId == receive.deviceId; })