【问题标题】:Javascript: Variable-sized image in fixed-sized canvasJavascript:固定大小画布中的可变大小图像
【发布时间】:2017-04-29 04:26:04
【问题描述】:

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

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

有没有办法:

  1. 使用 Javascript 调整这些图像的大小,以便将它们绘制到最大高度或宽度为 300 像素的画布上。

  1. 是否让画布保留其 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);
              }
            }

【问题讨论】:

  • 你的意思是像this,还是像this
  • 甚至SVG style ?
  • @K3N 类似,是的,尽管看起来该示例模仿了background-size: cover 或“缩放”效果。不过,这篇博文很有帮助。
  • @Kaiido 老实说,我什至没有考虑将 SVG 作为一个选项,因为我没有充分使用它来完全理解该问题的答案,但我会更多地研究它,谢谢。
  • @Tier,这个答案适用于画布 API,但实现了 svg 的 preserveAspectRatio 语法,您可以在其中指定是否要对图像进行切片或覆盖,以及 x 和 y 的位置为 min mid 或 max。

标签: javascript html canvas image-scaling


【解决方案1】:

我已经创建了试图匹配上述场景的小提琴。

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);
}

你可以看看:https://jsfiddle.net/q8qodgmn/1/

【讨论】:

  • 不得不稍微修改代码以适应我的特定项目(将宽度/高度声明和 if/else 语句移动到image.onload),但它按预期工作,谢谢!
猜你喜欢
  • 2021-02-27
  • 2012-02-11
  • 1970-01-01
  • 2013-12-31
  • 2015-04-21
  • 1970-01-01
  • 2011-03-24
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多