我在html img标签中有一个图像。我的要求是,当用户点击图像时,它将标记一个点并在拖动鼠标时绘制一条线。然后,当用户完成拖动并单击图像时,它应显示该行还显示以毫米/厘米为单位的线的尺寸。即,用户必须在图像上画一条线并显示他绘制的线的距离/长度(以毫米/厘米为单位)。
如何在Web应用程序中实现此功能?有人可以帮我实现这个功能吗?
答案 0 :(得分:9)
使用html5 canvas元素,将图像设置为canvas元素的css背景(使得绘制线条更容易,因为您不必重绘图像)并在画布上绘制线条:
1)在mousedown
上,记录鼠标位置并注册围绕这些起始位置关闭的mousemove
处理程序,并注册mouseup
处理程序以删除mousemove
处理程序。
2)在mousemove
处理程序中,找到当前鼠标位置和鼠标起始位置之间的偏移量,将此偏移量添加到起始行位置,然后使用此新位置重绘画布。
您无法使用物理距离标记线条,因为这取决于显示您工作的屏幕。您可以做的最好的事情是决定图像的比例/打印分辨率(以dpi为单位,例如每英寸300像素),并根据该值计算线条的长度。确切的实现取决于您希望如何使用结果。
更新:示例
<强> HTML 强>
<canvas id="canvas" width="200" height="200">
Your browser doesn't support canvas
</canvas>
<强> CSS 强>
canvas{
background-image: url("image.jpg");
background-position: center;
background-size: 100% 100%;
}
<强> JS 强>
$(document).ready(function(){
var imageDpi = 300;
var can = document.getElementById('canvas');
var ctx = can.getContext('2d');
var startX, startY;
$("canvas").mousedown(function(event){
startX = event.pageX;
startY= event.pageY;
$(this).bind('mousemove', function(e){
drawLine(startX, startY, e.pageX, e.pageY);
});
}).mouseup(function(){
$(this).unbind('mousemove');
});
function drawLine(x, y, stopX, stopY){
ctx.clearRect (0, 0, can.width, can.height);
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(stopX, stopY);
ctx.closePath();
ctx.stroke();
// calculate length
var pixelLength = Math.sqrt(Math.pow((stopX - x),2) + Math.pow((stopY-y),2));
var physicalLength = pixelLength / imageDpi;
console.log("line length = " + physicalLength +
" inches (image at " + imageDpi + " dpi)");
}
});
更新2:行长
我更新了我的例子。它定义了图像的物理分辨率,并根据该假设计算了线的长度。