画心电图插件
支持环境
下载插件
npm i ecg-api
EcgApi参数结构
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|
type | 在什么环境下使用 | 'uni'或'wx'或'web' | 'uni'或'wx'或'web' | - |
props | 心电配置参数 | PropsApi | 请参考下面的PropsApi配置 | - |
PropsApi参数结构
参数 | 类型 | 环境 | 是否必传 | 说明 |
---|
ctx | CanvasRenderingContext2D或UniApp.CanvasContext | 全部 | 是 | canvas的画笔对象 |
canvasId | string | uniapp或wx | 否 | 如果要获取图片就需要传canvas的canvas-id |
canvasToTempFilePath | (uni或wx).canvasToTempFilePath | uniapp或wx | 否 | 如果要获取图片就需要传 |
width | number | 全部 | 是 | canvas的宽度 |
height | number | 全部 | 否 | canvas的高度 |
multiple | number | 全部 | 否 | 整体倍数 |
textFontSize | number | 全部 | 否 | 字体大小 |
backgroundColor | string | 全部 | 否 | 背景颜色 |
hasStart | boolean | 全部 | 否 | 心电图默认开头,实时心电图无效 |
xAxis | boolean或xAxisApi | 全部 | 否 | x轴刻度配置 |
bigCell.count | number | 全部 | 是 | 横排大格子的个数 |
bigCell.color | string | 全部 | 否 | 大格子线的颜色 |
bigCell.lineWidth | number | 全部 | 否 | 大格子线的宽度 |
smallCell.count | number | 全部 | 否 | 每个大格子中小格子的个数 |
smallCell.color | string | 全部 | 否 | 小格子线的颜色 |
smallCell.lineWidth | number | 全部 | 否 | 小格子线的宽度 |
ecg.timeLong | number | 全部 | 否 | 心电图总的时长 |
ecg.color | string | 全部 | 否 | 心电图线的颜色 |
ecg.lineWidth | number | 全部 | 否 | 心电图线的宽度 |
ecg.gain | number | 全部 | 否 | 心电图增益,默认:10 |
ecg.speed | number | 全部 | 否 | 心电图走纸速度 |
xAxisApi参数结构
参数 | 类型 | 环境 | 是否必传 | 说明 |
---|
fontSize | number | 全部 | 否 | x轴的字体大小 |
textColor | string | 全部 | 否 | x轴的字体的颜色 |
lineWidth | number | 全部 | 否 | x轴的线的宽度 |
color | string | 全部 | 否 | x轴线的颜色 |
Methods方法
方法名 | 说明 | 类型 |
---|
start | 画线格子 | ()=>this |
drawECG | 开始绘制静态心电图,isFragment是否分片绘制,getImg是否返回图片地址 | (isFragment:boolean = false, getImg:boolean = true)=> Promise<string[]>/Promise |
setBigCellYCount | 设置每排心电图大格子数,增益10对应2, 5对应1,其他的安倍数来 | (num:number)=>this |
setGain | 设置增益 | (num:number)=>this |
setSpeed | 设置走纸速度 | (num:number)=>this |
setWhScale | 设置canvas的宽高比,计算高度需要 | (num:number)=>this |
setData | 设置绘制的全部数据 | (data:string[])=>this |
addDataToDraw | 实时心电图添加数据,同时会出发绘制 | (data: string[])=>this |
computedMinHeight | 计算心电图高度,isFragment是否分片绘制 | (isFragment: boolean = false)=>height |
stopContinueDraw | 实时心电图停止绘画 | ()=>this |
setHeight | 设置高度 | (height:number)=>this |
destroy | 销毁组件 | ()=>void |
h5实时心电图
import {EcgApi} from "ecg-api";
const devicePixelRatio = window.devicePixelRatio||1;
const canvas = document.createElement("canvas");
const canvasView = document.getElementById('canvasView'); // 获取canvas的父元素
// canvas要显示的大小
canvas.style.width= canvasView.offsetWidth+'px';
canvas.style.height= canvasView.offsetHeight+'px';
// 防止模糊,按设备屏幕分配率放大
canvas.width = canvasView.offsetWidth*devicePixelRatio;
canvas.height = canvasView.offsetHeight*devicePixelRatio;
canvasView.appendChild(canvas); // 加入需要显示的位置
const ctx = canvas.getContext('2d');
ecgObj.value = new EcgApi('web',{
ctx, //canvas.getContext('2d');
multiple:devicePixelRatio, // 倍数防模糊
width:canvas.width,
height:canvas.height,
ecg:{ // 心电图的配置
color:'rgba(0,0,0,0.5)',
lineWidth:1,
},
bigCell:{ // 大格子的配置
count:15,
},
smallCell:{ // 小格子的配置
count:5,
},
gain:30, // 增益
translateY:2, // 向下移动2个大格子
backgroundColor:'#FFF6F6', // 背景颜色
}).start(); // 画格子
ecgObj.value?.addDataToDraw([1,2,3]); // 实时添加数据,会自动绘图
ecgObj.value?.stopContinueDraw(); // 停止绘画
// 销毁
ecgObj.value?.destroy();
ecgObj.value = undefined;
h5生成心电图
import {EcgApi} from "ecg-api";
canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// 注意,增益发生变化时需要重新设置setBigCellYCount,且重新计算高度和获取图片
const multiple = 1.5*(window.devicePixelRatio||1);
canvas.value = document.createElement('canvas');
canvas.value.width = data.width*multiple;
const ctx = canvas.value.getContext('2d');
ecgObj.value = new EcgApi('web',{
ctx,
multiple,
width:canvas.value.width,
ecg:{
timeLong:70, // 时长
},
bigCell:{
count:31,
},
smallCell:{
count:5,
},
backgroundColor:'#FFF6F6',
hasStart:true, // 显示心电默认开头
xAxis:true, // 显示横坐标的刻度
textFontSize:5 //字体大小
})
// 下面setBigCellYCount、setGain、setSpeed这个3个如果是该值可以不传,默认值就是这个
ecgObj.value.setBigCellYCount(2) // 设置每排心电图的大格子个数,增益10对应2, 5对应1,20对应4,其他的安倍数来
.setGain(10) // 设置增益
.setSpeed(25); // 设置速度
.setWhScale(data.width/data.height); // 设置canvas的宽高比,后面要根据这个计算高度
.setData([]); // 设置绘制的数据
//是不是分片的
const isFragment = true;
// 计算高度
const h = ecgObj.value.computedMinHeight(isFragment);
canvas.value.height = h;
// 生成的心电图,分片返回的数组,反之返回的字符串,报错就不一样了
const arr = await ecgObj.value.drawECG(isFragment);
console.log(arr)
uniapp生成心电图
import {EcgApi} from "ecg-api";
<template>
<canvas :canvas-id="canvasId" :style="{width, height}"></canvas>
</template>
// script
const multiple = 1.5;
const width = ref(0);
const height = ref(0);
const canvasId ="myCanvas"
const query = uni.createSelectorQuery().in(_this);
query
.select(".psy-img-vt")
.boundingClientRect((data) => { // 这主要是获取父元素的宽度
const ctx = uni.createCanvasContext(canvasId, _this);
width.value = data.width+'px';
ecgObj.value = new EcgApi('uni',{
canvasId,
ctx,
multiple,
width:data.width,
ecg:{
timeLong:70, // 时长
},
bigCell:{
count:31,
},
smallCell:{
count:5,
},
backgroundColor:'#FFF6F6',
hasStart:true,
xAxis:true,
textFontSize:5,
canvasToTempFilePath:uni.canvasToTempFilePath
})
ecgObj.value.setBigCellYCount(2) // 设置每排心电图的大格子个数,增益10对应2, 5对应1,20对应4,其他的安倍数来
.setGain(10) // 设置增益
.setSpeed(25); // 设置速度
.setWhScale(data.width/data.height); // 设置canvas的宽高比,后面要根据这个计算高度
.setData([]); // 设置绘制的数据
})
//是不是分片的
const isFragment = false;
// 计算高度
let h = ecgObj.value?.computedMinHeight(isFragment);
height.value = h+'px';
// 给时间让canvas响应
const t = setTimeout(async()=>{
// 生成的心电图,分片返回的数组,反之返回的字符串,报错就不一样了
const arr = await ecgObj.value.drawECG(isFragment);
console.log(arr)
},200)
uniapp实时心电图参考h5的,替换ctx就行
wx同uniapp一样
注意:如果是手机显示模糊不清,需要获取手机的devicePixelRatio,通过multiple传进去
示例图片
