我是前端的初学者,我有一个用例允许用户选择图像并在其上绘制点。后来我想收集绘制点的坐标并用它们做一些基本的数学运算,比如计算距离、面积等。
我正在使用 react canvas draw 来完成绘图。下面是我到目前为止所做的粗略代码。
import React, {Component} from 'react'
import CanvasDraw from 'react-canvas-draw'
class DemoApp extends Component {
constructor (props) {
super()
this.state = {
showCanvas : false,
image : null,
coords : {
p1: null,
p2: null
},
canvasHeight: 500,
canvasWidth: 800,
lazyRadius : 0,
brushRadius : 5
}
}
showCanvas = () => {
this.setState ({ showCanvas : true })
}
handleCanvasChange = (e) => {
let point = e.catenary.p1;
let coord = this.state.coords;
if (coord.p1 == null) {
coord.p1 = [point.x, point.y]
} else if (coord.p2 == null) {
coord.p2 = [point.x, point.y]
this.setState ({
coords : coord
})
}
}
onImageChange = (event) => {
this.setState ({
showCanvas : false
})
if (event.target.files && event.target.files[0]) {
this.setState({
image: URL.createObjectURL(event.target.files[0])
});
}
}
render() {
return (
<div>
<div>
<input type="file" onChange={this.onImageChange} /> <br/>
<button onClick={this.showCanvas}>Show Canvas</button>
</div>
{
this.state.showCanvas &&
<div>
<button
onClick={() => {
this.saveableCanvas.clear();
}}
>
Clear
</button>
<button
onClick={() => {
this.saveableCanvas.undo();
}}
>
Undo
</button>
</div>
}
{
this.state.showCanvas &&
<div className = "container">
<CanvasDraw
onChange={this.handleCanvasChange}
brushColor="rgba(0,0,0)"
imgSrc={this.state.image}
canvasHeight={this.state.canvasHeight}
canvasWidth={this.state.canvasWidth}
lazyRadius = {this.state.lazyRadius}
brushRadius = {this.state.brushRadius}
ref={canvasDraw => (this.saveableCanvas = canvasDraw)}
/>
</div>
}
</div>
)
}
}
export default DemoApp
下图是结果。用户可以选择图像并在其上绘制东西(屏幕截图中缺少撤消和清除按钮)
以状态存储坐标数据是一种好方法吗?因为如果我想将其扩展到多个图像,这看起来不可扩展。
以下是我坚持并需要一些帮助的事情。
- react-canvas-draw 读取 mouse-down 和 mouse-up 并根据鼠标指针绘制曲线。如何覆盖它以仅读取鼠标按下,以便我只会得到一个点而不是曲线?
- 我想允许用户选择多个图像。如何更改
<input>
标签以实现此目的? - 我想在某种图库中显示多个图像。我没有找到太多关于如何做到这一点的资源。
- 从图库中选择图像时,应该会弹出一个模态框,其中包含画布绘制组件。我该怎么做?
react-canvas-draw 是我在谷歌上找到的一个库。有没有更好的方法来实现这个而不使用 react-canvas-draw?
提前致谢。