canvas设置文本框

最近使用canvas的时候遇到一个问题,需要在canvas画布的上面增加文本输入框用于文本的输入并在完成后保存
找了很多资料,没有找到解决方案,求出手

你可以使用HTML的“
”标签。以下是一个简单的例子:

<html>
  <head>
    <style>
      canvas {
        border: 1px solid black;
      }
    </style>
  </head>
  <body>
    <canvas id="myCanvas" width="200" height="100"></canvas>
    <input type="text" id="myTextInput" />
  </body>
  <script>
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    // 设置文本框位置
    var textBoxPosition = canvas.getBoundingClientRect();
    var textBox = document.getElementById("myTextInput");
    textBox.style.position = "absolute";
    textBox.style.top = textBoxPosition.top + "px";
    textBox.style.left = textBoxPosition.left + "px";

    // 添加事件监听器,以便在用户输入时重绘画布
    textBox.addEventListener("input", function () {
      context.clearRect(0, 0, canvas.width, canvas.height);
      context.fillText(textBox.value, 10, 50);
    });

    // 初始化画布
    context.font = "20px Arial";
    context.fillStyle = "black";
    context.fillText("Canvas", 10, 30);
  </script>
</html>

在上面的代码中,我们首先定义了一个Canvas和一个文本框,然后使用JavaScript将文本框的位置设置为Canvas的下方。在文本框中输入时,我们使用“input”事件监听器来重新绘制Canvas并显示输入的文本。

需要注意的是,在绘制文本之前,我们需要设置字体,字体大小和颜色等属性。在此示例中,我们使用了20像素的Arial字体,并将文本颜色设置为黑色。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/692666
  • 这篇博客也不错, 你可以看下canvas双缓存绘制中,缓存canvas中绘制的图片无法在显示canvas中显示出来
  • 除此之外, 这篇博客: 在微信小程序中用Canvas绘制定制的图样并生成图片保存到手机相册的工程方案中的 用户点击保存图片时,当用户拒绝访问相册权限时,下次点击按钮无反应,无法自动调起授权申请 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    let this.data.hasDenyWritePhotosAlbum = false,//拒绝授权
    save() {
    	var _this = this;
    	//保存图片到系统相册 底部自动弹出授权选项
    	wx.saveImageToPhotosAlbum({
    		filePath: tempFilePath,//wx.canvasToTempFilePath 的 res.tempFilePath,图片临时路径
    		success(res) {
    			wx.showToast({
    				title: '成功',
    				icon: 'success',
    				duration: 2000
    			})
    		},
    		fail(res) {
    			//用户拒绝相册授权
    			if ((res.errMsg).indexOf('saveImageToPhotosAlbum') != -1) {
    				_this.data.hasDenyWritePhotosAlbum = true;
    			}
    		}
    	})
    	//第一次拒绝授权相册 第二次需要主动调用授权
    	if (this.data.hasDenyWritePhotosAlbum){
    		//只能是用户手动触发
    		wx.openSetting({
    			success(res) {
    				if (res.authSetting["scope.writePhotosAlbum"]){
    					_this.data.hasDenyWritePhotosAlbum = false;
    				}
    			}
    		})
    	}
    }
    
  • 以下回答来自chatgpt:

    我可以给出可能的解决方案:在canvas画布上增加文本输入框并保存输入的文本可以通过以下步骤来实现:

    1. 创建文本输入框,并添加到canvas画布上。可以使用HTML5中的\元素来创建文本输入框,使用CSS来设置其样式,使用JavaScript来将其添加到canvas画布上。例如:
    const input = document.createElement('input');
    input.type = 'text';
    input.style.position = 'absolute';
    input.style.left = 100 + 'px'; // 设置输入框在画布上的位置
    input.style.top = 100 + 'px';
    canvas.parentElement.appendChild(input); // 将输入框添加到画布的父级元素中
    
    1. 监听文本输入框的输入事件,将其输入的文本保存到变量中。可以使用JavaScript中的addEventListener方法,监听input事件来实现。例如:
    let text = '';
    input.addEventListener('input', e => {
      text = e.target.value;
    });
    
    1. 使用canvas的绘制 API 将文本绘制在画布上。可以使用JavaScript中的fillText方法来绘制文本。例如:
    const ctx = canvas.getContext('2d');
    ctx.font = '16px Arial';
    ctx.fillStyle = 'black';
    ctx.fillText(text, x, y); // 绘制输入的文本,x和y是文本的坐标
    
    1. (可选)添加一些用户交互功能。例如,可以监听鼠标事件来在点击画布时弹出输入框,并在输入完成后将文本保存在画布上。例如:
    canvas.addEventListener('click', () => {
      input.style.display = 'block'; // 显示输入框
      input.focus(); // 让输入框获取焦点
    });
    
    input.addEventListener('blur', () => {
      input.style.display = 'none'; // 隐藏输入框
      ctx.fillText(text, x, y); // 绘制文本
    });
    

    以上是一个简单的实现文本输入框并保存输入的文本的方案,可以根据具体需求和场景进行扩展和优化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^