Javascript:固定大小画布中的可变大小图像

Javascript:固定大小画布中的可变大小图像,javascript,html,canvas,image-scaling,Javascript,Html,Canvas,Image Scaling,我有一个固定的HTML5画布,尺寸为300x300。我正在通过Javascript调整页面上其他图像的大小,使其最大宽度/高度为300px(取决于哪个维度更大) 不过,这实际上并没有调整源图像的大小,当我在画布上绘制它们时,会使用原始大小 有没有办法: 使用Javascript调整这些图像的大小,使它们以300px的最大高度或宽度绘制到画布上 及 画布是否保留其300x300尺寸,其中包含已调整大小的图像,以便创建一个300x300正方形,其中完全包含可变大小的图像 (想象一下制作一个300x3

我有一个固定的HTML5画布,尺寸为300x300。我正在通过Javascript调整页面上其他图像的大小,使其最大宽度/高度为300px(取决于哪个维度更大)

不过,这实际上并没有调整源图像的大小,当我在画布上绘制它们时,会使用原始大小

有没有办法:

  • 使用Javascript调整这些图像的大小,使它们以300px的最大高度或宽度绘制到画布上
  • 画布是否保留其300x300尺寸,其中包含已调整大小的图像,以便创建一个300x300正方形,其中完全包含可变大小的图像
  • (想象一下制作一个300x300的Photoshop文件,在其中放入各种图像,并根据需要调整大小)

    这在Javascript/canvas中是可能的吗

    编辑

    以下是我最终使用的基于公认答案的代码:

    var ssItems = [exampleUrls], //array of image paths
    imgHolder = document.getElementById("img-holder");
    
    for (var i = 0; i < ssItems.length; i++) {
              var img = new Image(),
                imgSrc = "/ItemImages/Large/" + ssItems[i] + ".jpg",
                imgW,
                imgH;
              img.src = imgSrc;
              img.onload = function () {
                  var canvas = document.createElement("canvas"),
                    ctx = canvas.getContext("2d");
                  canvas.setAttribute("class", "img-canvas");
                  canvas.setAttribute("width", "300");
                  canvas.setAttribute("height", "300");
                  imgHolder.appendChild(canvas);
                  imgW = (canvas.height * this.width) / this.height;
                  imgH = (canvas.width * this.height) / this.width;
                  if (this.height > this.width) {
                    ctx.drawImage(this, canvas.width / 2 - imgW / 2, 0, imgW, canvas.height);
                  } else {
                    ctx.drawImage(this, 0, canvas.height / 2 - imgH / 2, canvas.width, imgH);
                  }
                }
    
    var ssItems=[exampleUrls],//图像路径数组
    imgHolder=document.getElementById(“img持有者”);
    对于(变量i=0;ithis.width){
    ctx.drawImage(这个,canvas.width/2-imgW/2,0,imgW,canvas.height);
    }否则{
    ctx.drawImage(this,0,canvas.height/2-imgH/2,canvas.width,imgH);
    }
    }
    
    我创建了一把小提琴,试图与上面解释的场景相匹配

    var canvas = document.getElementById('myCanvas');
    var ctx = canvas.getContext("2d");
    
    var image = new Image();
    image.src = 'http://www.menucool.com/slider/jsImgSlider/images/image-slider-2.jpg';
    
    // calculates width and height with respect to canvas
    var width = (canvas.height * image.width) / image.height;
    var height = (canvas.width * image.height) / image.width;
    
    // takes width or height full choosing the larger value and centers the image
    if(image.height > image.width){
      ctx.drawImage(image, canvas.width / 2 - width / 2, 0, width, canvas.height);
    }else{
      ctx.drawImage(image, 0, canvas.height / 2 - height / 2, canvas.width, height);
    }
    

    您可以查看一下:

    我已经创建了一个小提琴,试图与上面解释的场景相匹配

    var canvas = document.getElementById('myCanvas');
    var ctx = canvas.getContext("2d");
    
    var image = new Image();
    image.src = 'http://www.menucool.com/slider/jsImgSlider/images/image-slider-2.jpg';
    
    // calculates width and height with respect to canvas
    var width = (canvas.height * image.width) / image.height;
    var height = (canvas.width * image.height) / image.width;
    
    // takes width or height full choosing the larger value and centers the image
    if(image.height > image.width){
      ctx.drawImage(image, canvas.width / 2 - width / 2, 0, width, canvas.height);
    }else{
      ctx.drawImage(image, 0, canvas.height / 2 - height / 2, canvas.width, height);
    }
    

    你可以看看它:

    你是说喜欢,还是什么?或者甚至?@K3N类似,是的,尽管它看起来像是模仿
    背景大小:封面
    或“缩放”效果。虽然这篇博文很有帮助。@Kaido老实说,我甚至没有考虑将SVG作为一个选项,因为我还没有充分地使用它来理解这个问题的答案,但我将进一步研究它,谢谢你。@Tier,这个答案是针对canvas API的,但是实现SVG的PreserveSpectRatio语法,在这里你可以指定你是否想要保存图像切片或覆盖,x和y的位置为min mid或max。你是说like,还是类似的?甚至@K3N类似,是的,尽管它看起来像是模仿
    背景大小:覆盖
    或“缩放”效果。虽然这篇博文很有帮助。@Kaido老实说,我甚至没有考虑将SVG作为一个选项,因为我还没有充分地使用它来理解这个问题的答案,但我将进一步研究它,谢谢你。@Tier,这个答案是针对canvas API的,但是实现SVG的PreserveSpectRatio语法,在这里你可以指定你是否想要保存图像切片或覆盖,x和y的位置为min mid或max。必须稍微修改代码以适合我的特定项目(将宽度/高度声明和if/else语句移动到
    image.onload
    ),但它按预期工作,谢谢!必须稍微修改代码以适合我的特定项目(将宽度/高度声明和if/else语句移动到
    image.onload
    ),但它按预期工作,谢谢!