网页在图片上画长方形和直线,并且能控制和编辑

  • 网页在图片上画长方形和直线,并且能控制和编辑

网页在图片上画长方形和直线,并且能控制和编辑

工作上用到了 在一张图片上画正方形和直线。并且可以控制和编辑

Your browser does not support the canvas element. 长方形 直线

var c=document.getElementById(“myCanvas”);
var cxt=c.getContext(“2d”);
var img=new Image()
img.src=“1.jpg”
var zhzcztx = “”;

//已有长方形
var changfx = [];
//已经点击的长方形
var SelectedRect;
function rectar(x,y,width,height,qdfw){
this.x = x;
this.y = y;
this.w = width;
this.h = height;
this.isSelected = false;
//起点方位
this.qdfw = qdfw;
//鼠标悬浮时临时起点位置
this.xfwz = {};
}

//已有直线
var zxy = [];
//已选直线
var selectedLine;
function line(x,y,x1,y1,fangx){
this.x = x;
this.y = y;
this.x1 = x1;
this.y1 = y1;
this.isSelected = false;
//方向
this.fangx=fangx
//鼠标悬浮时临时起点位置
this.xfwz = {};
}

//起点位置
var qidian = {};
//移动的位置
var yidong = {};
//标识位标识操作
var candraw = ‘no’;
//时间轴
var intervalli;
//鼠标样式提示
var cursor = ‘default’;
//临时的xy用于托动
var linsxy = {}
function func(){
zhzcztx = document.getElementById(“tuxing”).value;
}
img.onload = function() {
//清理掉时间轴
//clearInterval(intervalli);
document.getElementById(“myCanvas”).width = img.width;
document.getElementById(“myCanvas”).height = img.height;
cxt.drawImage(img,0,0);
intervalli = setInterval(“huizhi()”,“50”);
zhzcztx = document.getElementById(“tuxing”).value;
}

//鼠标悬浮事件
function canvasOver(e){
var xyobj = getxy(e);
var signinline = “default”;
//检测长方形部分
//标志位看鼠标是否在线上
if (SelectedRect != null){
var objsxy = cfxsiddian (xyobj,SelectedRect);
if (objsxy.sbstyle!=""){
signinline = objsxy.sbstyle;
SelectedRect.xfwz.x = objsxy.x;
SelectedRect.xfwz.y = objsxy.y;
}
//先看是否在已选长方形线上
else if(cfxsixian(xyobj.x,xyobj.y,SelectedRect.x,SelectedRect.x+SelectedRect.w,SelectedRect.y,SelectedRect.y+SelectedRect.h,SelectedRect.qdfw)){
signinline = “move”;
}
}
for(var i=changfx.length-1; i>=0; i–) {
var rect = changfx[i];
if(!rect.isSelected){
if(cfxsixian(xyobj.x,xyobj.y,rect.x,rect.x+rect.w,rect.y,rect.y+rect.h,rect.qdfw)){
signinline = ‘pointer’;
}
}
}
//检测直线部分
if(selectedLine!=null){
var silis = zhixisnotLia(xyobj,selectedLine);
if(silis!=""){
signinline = silis
}else if(jiancezhix(xyobj,selectedLine)){
signinline = “move”;
}
}
for(var i=zxy.length-1; i>=0; i–){
var lineobj = zxy[i];
if(!lineobj.isSelected){
if(jiancezhix(xyobj,lineobj)){
signinline = ‘pointer’;
}
}
}
cursor = signinline;
c.style.cursor=signinline;
}
//直线鼠标在俩点上
function zhixisnotLia(xyobj,lineobj){
if(xyobj.x>=lineobj.x-2&&xyobj.x<=lineobj.x+2&&xyobj.y>=lineobj.y-2&&xyobj.y<=lineobj.y+2){
selectedLine.xfwz = {x:lineobj.x1,y:lineobj.y1};
return “w-resize”;
}else if(xyobj.x>=lineobj.x1-2&&xyobj.x<=lineobj.x1+2&&xyobj.y>=lineobj.y1-2&&xyobj.y<=lineobj.y1+2){
selectedLine.xfwz = {x:lineobj.x,y:lineobj.y};
return “w-resize”;
}
return “”;
}
var offset = 5;
//检测是否在直线上
function jiancezhix(xyobj,lineobj){
var minX = Math.min(lineobj.x, lineobj.x1); // 较小的X轴坐标值
var maxX = Math.max(lineobj.x, lineobj.x1); // 较大的X轴坐标值
var minY = Math.min(lineobj.y, lineobj.y1); // 较小的Y轴坐标值
var maxY = Math.max(lineobj.y, lineobj.y1); // 较大的Y轴坐标值
if (lineobj.y === lineobj.y1) {
// 水平线
if ((xyobj.x >= minX && xyobj.x <= maxX) && (xyobj.y >= minY - offset && xyobj.y <= maxY + offset)) {
return true;
}
}else if (lineobj.x === lineobj.x1) {
// 垂直线
if ((xyobj.y >= minY && xyobj.y <= maxY) && (xyobj.x >= minX - offset && xyobj.x <= maxX + offset)) {
return true;
}
} else {
// 斜线 (先判断点是否进入可接受大范围(矩形),然后再根据直线上的交叉点进行小范围比较)
if ((xyobj.x >= minX && xyobj.x <= maxX) && (xyobj.y >= minY - offset && xyobj.y <= maxY + offset)) {
//求Y轴坐标
//方法1:根据tanθ= y/x = y1/x1, 即y = (y1/x1)x (该方法有局限性,垂直线(p2.x - p1.x)=0,不能用)
//var y = ((p2.y - p1.y) / (p2.x - p1.x)) * (px - p1.x);
//方法2:先求弧度hudu,根据cosθ=x/r, r=x/cosθ,求得r,再根据sinθ=y/r, y=sinθ
r, 求得y
var hudu = Math.atan2(lineobj.y1 - lineobj.y, lineobj.x1 - lineobj.x); // 直线的弧度(倾斜度)
// 用三角函数计出直线上的交叉点
var r = (xyobj.x - lineobj.x) / Math.cos(hudu); // 直角三角形的斜边(或理解成圆的半径)
var y = Math.sin(hudu) * r; // Y轴坐标
var p = { x: xyobj.x, y: lineobj.y + y }; // 直线上的交叉点
if ((Math.abs(xyobj.x - p.x) <= offset) && (Math.abs(xyobj.y - p.y) <= offset)) {
return true; // 1 - 点中
}
}
}
return false;
}

//点击
function canvasClick(e){
var xyobj = getxy(e);
//判定点的是长方形
for(var i=changfx.length-1; i>=0; i–) {
var rect = changfx[i];
if(cfxsixian(xyobj.x,xyobj.y,rect.x,rect.x+rect.w,rect.y,rect.y+rect.h,rect.qdfw)){
//点击到了某个长方形的线上
SelectedRect = rect;
rect.isSelected = true;
return;
}
}
//判定点的是直线
for(var i=zxy.length-1; i>=0; i–) {
var linobj = zxy[i];
if(jiancezhix(xyobj,linobj)){
//点击到了直线上
selectedLine = linobj;
linobj.isSelected = true;
return;
}
}
}
//获得直线的方向
function zhixGetFx(x,y,x1,y1){
var fx = “”;
if(x1<x&&y1y){
fx = “z”
}else if(x1>x&&y1y){
fx = “y”
}else if(x1x&&y1>y){
fx = “x”
}else if(x1x&&y1<y){
fx = “s”
}else if(x1x&&y1>y){
fx = “x”
}else if(x1>x&&y1>y){
fx = “yx”
}else if(x>x1&&y>y1){
fx = “zs”
}else if(x1>x&&y>y1){
fx = “ys”
}else if(x>x1&&y1>y){
fx = “zx”
}
return fx;
}
function canvaUp(e){
//不能画
candraw = ‘no’;
var isnull = (JSON.stringify(yidong) == “{}”);
if(!isnull){
if(qidian.x!=yidong.x&&qidian.y!=yidong.y){
if(zhzcztx’cfx’){
//生成已存在长方形
var fangwei = getqidfw(qidian,yidong);
var rect=new rectar(qidian.x,qidian.y,yidong.x-qidian.x,yidong.y-qidian.y,fangwei);
changfx.push(rect);
//创建完默认被选
rect.isSelected = true;
SelectedRect = rect;
}else{
var fx = zhixGetFx(qidian.x,qidian.y,yidong.x,yidong.y)
var lineobj=new line(qidian.x,qidian.y,yidong.x,yidong.y,fx);
zxy.push(lineobj);
//创建完默认被选
lineobj.isSelected = true;
selectedLine = lineobj;
}
}
}
//初始化终点
yidong = {};
}

function canvasMove(e){
let objxy = getxy(e);
if(candraw==‘hua’){
//画图的移动
yidong.x = objxy.x;
yidong.y = objxy.y;
}if(candraw==‘yi’){
if(SelectedRect!=null){
//控制移动图形
SelectedRect.x = objxy.x-linsxy.x
SelectedRect.y = objxy.y-linsxy.y
}else if(selectedLine!=null){
//直线移动
selectedLine.x = objxy.x-linsxy.x
selectedLine.y = objxy.y-linsxy.y
selectedLine.x1 = objxy.x-linsxy.x1
selectedLine.y1 = objxy.y-linsxy.y1
}
}else if(candraw==‘las’){
if(SelectedRect!=null){
//拉伸已选长方形
SelectedRect.x = SelectedRect.xfwz.x;
SelectedRect.y = SelectedRect.xfwz.y;
SelectedRect.w = objxy.x-SelectedRect.x;
SelectedRect.h = objxy.y-SelectedRect.y;
SelectedRect.qdfw = getqidfw(SelectedRect.xfwz,objxy);
}else if(selectedLine!=null){
selectedLine.x = selectedLine.xfwz.x;
selectedLine.y = selectedLine.xfwz.y;
selectedLine.x1 = objxy.x;
selectedLine.y1 = objxy.y;
selectedLine.fangx = zhixGetFx(selectedLine.xfwz.x,selectedLine.xfwz.y,objxy.x,objxy.y);
}
}else{
//悬浮的移动为了鼠标变化
canvasOver(e);
}
}

function canvasDown(e){
// client是基于整个页面的坐标,offset是cavas距离pictureDetail顶部以及左边的距离
let objxy = getxy(e);
qidian.x = objxy.x;
qidian.y = objxy.y;
if(cursor===‘default’){
clearSelectAlready();
//画图
candraw = ‘hua’;
}else if(cursor===‘move’){
//移动长方形
if(SelectedRect!=null){
linsxy.x = objxy.x-SelectedRect.x
linsxy.y = objxy.y-SelectedRect.y
}else if(selectedLine!=null){
//直线移动
linsxy.x = objxy.x-selectedLine.x
linsxy.y = objxy.y-selectedLine.y
linsxy.x1 = objxy.x-selectedLine.x1
linsxy.y1 = objxy.y-selectedLine.y1
}
candraw=‘yi’;
}else if(cursor===‘nw-resize’){
//左上 右下 做拉伸
candraw=‘las’;
}else if(cursor===‘ne-resize’){
//右上 左下做拉伸
candraw=‘las’;
}else if(cursor===‘w-resize’){
//直线左右拉伸
candraw=‘las’;
}else if (cursor===‘pointer’){
clearSelectAlready();
//点击
canvasClick(e);
}
}

//时间轴绘制
function huizhi(){
//清掉上面所有的东西
clearCanvas();
//绘制图片
cxt.drawImage(img,0,0);
//绘制已存在的形状
xingzhuang();
if(zhzcztx==‘cfx’){
//绘制长方形
changfxing();
}else{
//绘制直线
zhixian();
}
//绘制文字
}
//绘制正在进行的长方形
function changfxing(){
cxt.strokeRect(qidian.x,qidian.y,yidong.x-qidian.x,yidong.y-qidian.y);
}
//画直线
function zhixian (){
cxt.beginPath();
cxt.moveTo(qidian.x,qidian.y);
cxt.lineTo(yidong.x,yidong.y);
cxt.stroke();
}
//绘制已存在的形状
function xingzhuang(){
//长方形
for ( var i = 0; i <changfx.length; i++){
rect = changfx[i];
if(rect.isSelectedtrue){
cxt.lineWidth = 3;
}else{
cxt.lineWidth = 1;
}
cxt.strokeRect(rect.x,rect.y,rect.w,rect.h);
cxt.lineWidth = 1;
}
//直线
for ( var i = 0; i <zxy.length; i++){
var lineobj = zxy[i];
if(lineobj.isSelectedtrue){
cxt.lineWidth = 3;
}else{
cxt.lineWidth = 1;
}
cxt.beginPath();
cxt.moveTo(lineobj.x,lineobj.y);
cxt.lineTo(lineobj.x1,lineobj.y1);
cxt.stroke();
cxt.lineWidth = 1;
}
}
function clearCanvas(){
cxt.clearRect(0, 0, c.width, c.height)
cxt.drawImage(img, 0, 0)
}
//长方形四条线的判断 鼠标是否在上面
//参数依次位 点击的x 点击的y 长方形宽的起点 宽的终点 高的起点 高的终点
function cfxsixian(clickX,clickY,widthstarts,widthends,heightstarts,heightends,qdfw){
if(qdfw==“zs”){
if((clickX>=widthstarts-1&&clickX<=widthstarts+1&&clickY>heightstarts&&clickY<heightends)
||(clickX>=widthends-1&&clickX<=widthends+1&&clickY>heightstarts&&clickY<heightends)
||(clickX>widthstarts&&clickX<widthends&&clickY>=heightstarts-1&&clickY<=heightstarts+1)
||(clickX>widthstarts&&clickX<widthends&&clickY>=heightends-1&&clickY<=heightends+1)){
return true;
}else{
return false;
}
}else if(qdfw==“zx”){
if((clickX>=widthstarts-1&&clickX<=widthstarts+1&&clickY<heightstarts&&clickY>heightends)
||(clickX>=widthends-1&&clickX<=widthends+1&&clickY<heightstarts&&clickY>heightends)
||(clickX>widthstarts&&clickX<widthends&&clickY>=heightstarts-1&&clickY<=heightstarts+1)
||(clickX>widthstarts&&clickX<widthends&&clickY>=heightends-1&&clickY<=heightends+1)){
return true;
}else{
return false;
}
}else if(qdfw==“ys”){
if((clickX>=widthstarts-1&&clickX<=widthstarts+1&&clickY>heightstarts&&clickY<heightends)
||(clickX>=widthends-1&&clickX<=widthends+1&&clickY>heightstarts&&clickY<heightends)
||(clickX<widthstarts&&clickX>widthends&&clickY>=heightstarts-1&&clickY<=heightstarts+1)
||(clickX<widthstarts&&clickX>widthends&&clickY>=heightends-1&&clickY<=heightends+1)){
return true;
}else{
return false;
}
}else if(qdfw==“yx”){
if((clickX>=widthstarts-1&&clickX<=widthstarts+1&&clickY<heightstarts&&clickY>heightends)
||(clickX>=widthends-1&&clickX<=widthends+1&&clickY<heightstarts&&clickY>heightends)
||(clickX<widthstarts&&clickX>widthends&&clickY>=heightstarts-1&&clickY<=heightstarts+1)
||(clickX<widthstarts&&clickX>widthends&&clickY>=heightends-1&&clickY<=heightends+1)){
return true;
}else{
return false;
}
}
}

//获得xy信息
function getxy(e){
var objxy = {};
objxy.x = e.clientX - e.target.parentNode.offsetLeft-5
objxy.y = e.clientY - e.target.parentNode.offsetTop-5
return objxy;
}

//长方形四个顶点的信息
function cfxsiddian (xyobj,SelectedRect){
var obj = {sbstyle:’’};
if(xyobj.x>=SelectedRect.x-2&&xyobj.x<=SelectedRect.x+2&&xyobj.y>=SelectedRect.y-2&&xyobj.y<=SelectedRect.y+2){
//起点
if(SelectedRect.qdfw==‘zs’){
//起点是左上
obj.sbstyle = ‘nw-resize’;
}else if(SelectedRect.qdfw==‘zx’){
//起点是左下
obj.sbstyle = ‘ne-resize’;
}else if(SelectedRect.qdfw==‘ys’){
//起点是右上
obj.sbstyle = ‘ne-resize’;
}else if(SelectedRect.qdfw==‘yx’){
//右下
obj.sbstyle = ‘nw-resize’;
}
obj.x = SelectedRect.x+SelectedRect.w;
obj.y = SelectedRect.y+SelectedRect.h;
}else if(xyobj.x>=SelectedRect.x+SelectedRect.w-2&&xyobj.x<=SelectedRect.x+SelectedRect.w+2&&xyobj.y>=SelectedRect.y-2&&xyobj.y<=SelectedRect.y+2){
//起点对应的横着的点
if(SelectedRect.qdfw==‘zs’){
//起点是左上
obj.sbstyle = ‘ne-resize’;
}else if(SelectedRect.qdfw==‘zx’){
//起点是左下
obj.sbstyle = ‘nw-resize’;
}else if(SelectedRect.qdfw==‘ys’){
//起点是右上
obj.sbstyle = ‘nw-resize’;
}else if(SelectedRect.qdfw==‘yx’){
//右下
obj.sbstyle = ‘ne-resize’;
}
obj.x = SelectedRect.x;
obj.y = SelectedRect.y+SelectedRect.h;
}else if (xyobj.x>=SelectedRect.x-2&&xyobj.x<=SelectedRect.x+2&&xyobj.y>=SelectedRect.y+SelectedRect.h-2&&xyobj.y<=SelectedRect.y+SelectedRect.h+2){
//起点对应竖着那点
if(SelectedRect.qdfw==‘zs’){
//起点是左上
obj.sbstyle = ‘ne-resize’;
}else if(SelectedRect.qdfw==‘zx’){
//起点是左下
obj.sbstyle = ‘nw-resize’;
}else if(SelectedRect.qdfw==‘ys’){
//起点是右上
obj.sbstyle = ‘nw-resize’;
}else if(SelectedRect.qdfw==‘yx’){
//右下
obj.sbstyle = ‘ne-resize’;
}
obj.x = SelectedRect.x+SelectedRect.w;
obj.y = SelectedRect.y;
}else if (xyobj.x>=SelectedRect.x+SelectedRect.w-2&&xyobj.x<=SelectedRect.x+SelectedRect.w+2&&xyobj.y>=SelectedRect.y+SelectedRect.h-2&&xyobj.y<=SelectedRect.y+SelectedRect.h+2){
//起点对应对各那点
if(SelectedRect.qdfw==‘zs’){
//起点是左上
obj.sbstyle = ‘nw-resize’;
}else if(SelectedRect.qdfw==‘zx’){
//起点是左下
obj.sbstyle = ‘ne-resize’;
}else if(SelectedRect.qdfw==‘ys’){
//起点是右上
obj.sbstyle = ‘ne-resize’;
}else if(SelectedRect.qdfw==‘yx’){
//右下
obj.sbstyle = ‘nw-resize’;
}
obj.x = SelectedRect.x;
obj.y = SelectedRect.y;
}
return obj;
}
//清理掉已经选的对象
function clearSelectAlready(){
if (SelectedRect != null) SelectedRect.isSelected = false;
SelectedRect = null;
if (selectedLine != null) selectedLine.isSelected = false;
selectedLine = null;
}
//获取起点方位
function getqidfw(qidian,yidong){
var fangwei = “”;
//起点
if(yidong.x-qidian.x>0&&yidong.y-qidian.y>0){
//起点是左上
fangwei = ‘zs’;
}else if(yidong.x-qidian.x>0&&yidong.y-qidian.y<0){
//起点是左下
fangwei = ‘zx’;
}else if(yidong.x-qidian.x<0&&yidong.y-qidian.y>0){
//起点是右上
fangwei = ‘ys’;
}else if(yidong.x-qidian.x<0&&yidong.y-qidian.y<0){
//右下
fangwei = ‘yx’;
}
return fangwei;
}

网页在图片上画长方形和直线,并且能控制和编辑相关推荐

  1. C#图片处理之:在图片上画直线

    在图片上画直线比画框更简单.线形的控制还是通过对Pen的设置来实现的.         /**//// <summary>         /// 在图片上画线         /// & ...

  2. 在网页地图图片上加注企业和“圳品”数量信息+1

    之前我们在"圳品"信息系统中实现了在网页地图图片上加注企业和"圳品"数量信息,实现的方法是直接用document.write在<body>里输出&l ...

  3. python中怎样在图片上画线段_python 实现PIL模块在图片画线写字

    图片上画线条 import sys from PIL import Image,ImageDraw im = Image.open("th.png") draw = ImageDr ...

  4. java画板中画直线_java实现画图板上画一条直线

    目标:在画图板上画一条直线,供大家参考,具体内容如下 一.首先需要建立一个界面 过程:1.创建界面对象(Java语言中已经有,可直接创建对象来使用). 2.对于一个界面,我们需要设置它的大小.居中.界 ...

  5. 在9个点上画10条直线,要求每条直线上有3个点

    在9个点上画10条直线,要求每条直线上有3个点,其示意图大体如下所示,红色代表点:

  6. html中矩形坐标,js怎么根据坐标在图片上画出矩形框?

    如图本地上传的图片,并点击获取到这个图片里每个地方的坐标,根据4个角坐标在图片上画出矩形框,该怎么画?大神支招. 我图片是显示在div里的,是不是应该用canvas显示图片? 代码: Document ...

  7. python怎么在散点图上画圆圈_Python如何在图片上画一个实心圆

    有时候我们需要对图片进行标记操作,即在原图的基础上进行画出一些图案,这里给出画一个实心圆的相关方法,基于Python. 工具/原料 win10系统64位 winPython集成软件 方法/步骤 1 集 ...

  8. Python 在图片上画点、圆和矩形实例

    1.在图片上画点.圆 import cv2 img = cv2.imread(img_path) # 读取图片cv2.circle(img,(100,100),20,(0,0,255),-1) # c ...

  9. 用python的opencv库在图片上画出蓝底黑字的文本框

    以下是使用Python的OpenCV库实现在图片上绘制的示例代码: import cv2# 读入图片 img = cv2.imread('example.jpg')# 在图片上绘制红色矩形框 cv2. ...

最新文章

  1. Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问
  2. 素质教育,是救命稻草,还是压垮教培机构的最后一根稻草
  3. ant centos环境下 编译没有将配置文件加载_你可能忽略的macOS下brew安装nginx细节解读,干货
  4. 安装memcached服务和PECL关于memcache的两个PHP扩展
  5. 在下列集成电路说法中不正确_教孩子正确认识性别,保护个人隐私,对成长中的尴尬行为说不...
  6. xshell访问内网虚拟机
  7. Mybatis 配置文件(转载)
  8. 阶段3 1.Mybatis_03.自定义Mybatis框架_3.自定义mybatis的编码-根据测试类中缺少的创建接口和类...
  9. Linux下Gogs二进制安装配置
  10. html点击文本框唤醒手机键盘,html移动应用 input 标签 清除按钮功能如何实现(不触发键盘)...
  11. 虚拟机桥接模式下配置静态IP
  12. 爱奇艺影视剧智能配音系统奇声获2022年度CCF科技成果奖“科技进步一等奖”
  13. 【PNP与NPN两种三极管使用方法(工作在开关状态)】
  14. 麒麟子Cocos Creator实用技巧
  15. 记一次CTFd平台搭建
  16. SparkSteaming细节问题
  17. 配置OHS 12C转发HTTPS请求
  18. docker 进入容器内部及退出
  19. 中基协:推荐使用电子合同
  20. 室内定位 Wi-Fi指纹 深度神经网络keras

热门文章

  1. spring概念介绍及自己的一点感受
  2. xsd 节点可循环_应用案例丨邦纳无线振动和温度监测解决方案在冷却循环水系统中的应用...
  3. label runat=server
  4. 凌恩生物文献分享|IF31.316→一网打尽与婴儿疾病相关的病毒组研究
  5. UnicodeDecodeError: ‘charmap‘ codec can‘t decode byte 0x8f in position 156: character maps to
  6. Endnote无法sync, 一招破解 重置密码后可以登录网页端,却遇到桌面端显示 The username/password specified is not valid!
  7. 【Linux基本操作】centos vimplus安装
  8. 笔记-Ubuntu部署K8s,启动nginx服务
  9. java - io流拷贝文件
  10. 3DSA-MFN:用于高光谱图像分类的结合3D自注意力的多尺度特征融合网络