代码之家  ›  专栏  ›  技术社区  ›  qadenza

如何在画布元素中获得整个图像?

  •  0
  • qadenza  · 技术社区  · 6 年前

    我有一个画布元素,想加载一个 entire 图像在里面。
    画布的最大宽度应为50%。
    加载的图像有不同的宽度和高度,但在任何情况下,我需要整个图像内,而不仅仅是其中的一部分。
    有可能吗?

    var URL = window.webkitURL || window.URL;
    
    window.onload = function() {
        var input = document.getElementById('input');
        input.addEventListener('change', handleFiles, false);
    }
    
    function handleFiles(e) {
        var ctx = document.getElementById('canvas').getContext('2d');
        var url = URL.createObjectURL(e.target.files[0]);
        var img = new Image();
        img.onload = function() {
            ctx.drawImage(img, 10, 10);    
        }
        img.src = url;
        
    }
    #canvas{
    max-width:50%;
    }
    <input type="file" id="input"/>
    <canvas id="canvas"/>
    1 回复  |  直到 6 年前
        1
  •  1
  •   Eddie    6 年前

    drawImage 的第4和第5个参数是宽度和高度。下面的例子将占据整个画布。

    var URL = window.webkitURL || window.URL;
    
    window.onload = function() {
      var input = document.getElementById('input');
      input.addEventListener('change', handleFiles, false);
    }
    
    function handleFiles(e) {
      var ctx = document.getElementById('canvas').getContext('2d');
      var url = URL.createObjectURL(e.target.files[0]);
      var img = new Image();
      img.onload = function() {
        ctx.drawImage(img, 0, 0, ctx.canvas.width, ctx.canvas.height);
      }
      img.src = url;
    
    
    }
    #canvas {
      background-color: salmon;
      max-width: 50%;
    }
    <input type="file" id="input" />
    <canvas id="canvas" />

    如果你想要成比例的图像,我们可以使用 solution 在这里计算

    var URL = window.webkitURL || window.URL;
    
    window.onload = function() {
      var input = document.getElementById('input');
      input.addEventListener('change', handleFiles, false);
    }
    
    function handleFiles(e) {
      var ctx = document.getElementById('canvas').getContext('2d');
      var url = URL.createObjectURL(e.target.files[0]);
      var img = new Image();
      img.onload = function() {
    
        var newDimen = calculateAspectRatioFit(img.width, img.height, ctx.canvas.width, ctx.canvas.height);
        ctx.drawImage(img, 0, 0, newDimen.width, newDimen.height);
      }
      img.src = url;
    }
    
    function calculateAspectRatioFit(srcWidth, srcHeight, maxWidth, maxHeight) {
      var ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);
      return {
        width: srcWidth * ratio,
        height: srcHeight * ratio
      };
    }
    #画布{
    最大宽度:50%;
    }
    <输入type=“file”id=“input”/>
    <canvas id=“canvas”/>

    集中化 图像,您可以:

    function handleFiles(e) {
        var ctx = document.getElementById('canvas').getContext('2d');
        var url = URL.createObjectURL(e.target.files[0]);
        var img = new Image();
        img.onload = function() {
    
            var newDimen = calculateAspectRatioFit( img.width, img.height, ctx.canvas.width, ctx.canvas.height );
            var tSpace = ( ctx.canvas.height - newDimen.height ) / 2;
            var lSpace = ( ctx.canvas.width - newDimen.width ) / 2;
            ctx.drawImage(img, lSpace, tSpace, newDimen.width, newDimen.height);
        }
        img.src = url;
    }