HTML5 Wysiwyg简单的“图像编辑器”添加文本

时间:2015-02-10 12:31:10

标签: html5 image canvas

我正在搜索代码或Html5 Wysiwyg图像编辑器,它是以下主题:

  • Wysiwyg将叠加文字添加到图片

我认为最简单的方法是使用canvas和html5来处理。源很可能是data_uri,因此可以通过创建画布来创建最终图片。任何编程语言都可以访问转换为真实文件。

我的想法是:

  1. 将画布创建为图片外的data_uri(物理文件)
  2. 能够2a)在绘制的叠加层内写入文本,2b)在创建的画布上放置并调整所需的叠加层
  3. 有什么可以做到这一点,还是可以使用哪些代码?

1 个答案:

答案 0 :(得分:1)

缩放文本图像通常会导致不受欢迎的像素化。

或者,这是一个带注释的示例,让用户:

  1. 在文本输入中输入文本。
  2. 单击按钮将文本填充到文本上。
  3. 使用鼠标事件在画布周围“拖动”文本。
  4. 关于调整大小:

    您可以添加另一组2个html按钮,让用户可以缩放文本。您可以简单地增加或减少字体大小以响应html按钮,而不是缩放文本图像。

    <强>演示:

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    
    // variables used to get mouse position on the canvas
    var $canvas=$("#canvas");
    var canvasOffset=$canvas.offset();
    var offsetX=canvasOffset.left;
    var offsetY=canvasOffset.top;
    var scrollX=$canvas.scrollLeft();
    var scrollY=$canvas.scrollTop();
    
    // variables to save last mouse position
    // used to see how far the user dragged the mouse
    // and then move the text by that distance
    var startX;
    var startY;
    
    // an array to hold text objects
    var texts=[];
    
    // this var will hold the index of the hit-selected text
    var selectedText=-1;
    
    // clear the canvas & redraw all texts
    function draw(){
      ctx.clearRect(0,0,canvas.width,canvas.height);
      for(var i=0;i<texts.length;i++){
        var text=texts[i];
        ctx.fillText(text.text,text.x,text.y);
      }
    }
    
    // test if x,y is inside the bounding box of texts[textIndex]
    function textHittest(x,y,textIndex){
      var text=texts[textIndex];
      return(x>=text.x && 
             x<=text.x+text.width &&
             y>=text.y-text.height && 
             y<=text.y);
    }
    
    // handle mousedown events
    // iterate through texts[] and see if the user
    // mousedown'ed on one of them
    // If yes, set the selectedText to the index of that text
    function handleMouseDown(e){
      e.preventDefault();
      startX=parseInt(e.clientX-offsetX);
      startY=parseInt(e.clientY-offsetY);
      // Put your mousedown stuff here
      for(var i=0;i<texts.length;i++){
        if(textHittest(startX,startY,i)){
          selectedText=i;
        }
      }
    }
    
    // done dragging
    function handleMouseUp(e){
      e.preventDefault();
      selectedText=-1;
    }
    
    // also done dragging
    function handleMouseOut(e){
      e.preventDefault();
      selectedText=-1;
    }
    
    // handle mousemove events
    // calc how far the mouse has been dragged since
    // the last mousemove event and move the selected text
    // by that distance
    function handleMouseMove(e){
      if(selectedText<0){return;}
      e.preventDefault();
      mouseX=parseInt(e.clientX-offsetX);
      mouseY=parseInt(e.clientY-offsetY);
    
      // Put your mousemove stuff here
      var dx=mouseX-startX;
      var dy=mouseY-startY;
      startX=mouseX;
      startY=mouseY;
    
      var text=texts[selectedText];
      text.x+=dx;
      text.y+=dy;
      draw();
    }
    
    // listen for mouse events
    $("#canvas").mousedown(function(e){handleMouseDown(e);});
    $("#canvas").mousemove(function(e){handleMouseMove(e);});
    $("#canvas").mouseup(function(e){handleMouseUp(e);});
    $("#canvas").mouseout(function(e){handleMouseOut(e);});
    
    $("#submit").click(function(){
    
      // calc the y coordinate for this text on the canvas
      var y=texts.length*20+20;
    
      // get the text from the input element
      var text={text:$("#theText").val(),x:20,y:y};
    
      // calc the size of this text for hit-testing purposes
      ctx.font="16px verdana";
      text.width=ctx.measureText(text.text).width;
      text.height=16;
    
      // put this new text in the texts array
      texts.push(text);
    
      // redraw everything
      draw();
    
    });
    body{ background-color: ivory; }
    #canvas{border:1px solid red;}
    #theText{width:10em;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <input id="theText" type="text">
    <button id="submit">Draw text on canvas then drag it</button><br>
    <canvas id="canvas" width=300 height=300></canvas>