当前位置: 首页 > 知识库问答 >
问题:

缩放图像以适应画布

司徒俊雄
2023-03-14

我有一个表单,允许用户上传图像。

加载映像后,我们对其执行一些缩放,以便在将其传递回服务器之前减小其文件大小。

为此,我们将其放置在画布上并在画布上进行操作。

这段代码将在画布上呈现缩放后的图像,画布大小为320 x 240px:

ctx.drawImage(img, 0, 0, canvas.width, canvas.height)

... 哪里有帆布。宽度和画布。高度是图像高度和宽度x,是基于原始图像大小的比例因子。

但当我使用代码时:

ctx.drawImage(img, 0, 0, canvas.width, canvas.height, 0, 0, canvas.width, canvas.height

...我只得到画布上图像的一部分,在这种情况下是左上角。我需要整个图像'缩放',以适应在画布上,尽管实际图像尺寸大于320x240画布大小。

对于上面的代码,宽度和高度是1142x856,这是最终的图像大小。我需要保持这个大小,以便在提交表单时将beck传递给服务器,但只希望在画布中为用户显示一个较小的视图。

我错过了什么?谁能告诉我正确的方向?

非常感谢。

共有3个答案

文增
2023-03-14

我猜您希望图像缩放到更小的尺寸,而不丢失尺寸比。我有一个解决办法。

var ratio = image.naturalWidth / image.naturalHeight;
var width = canvas.width;
var height = width / ratio;
ctx.drawImage(image, 0, 0, width, height);

这一比例将保持不变。您可以使用if循环如果图像的高度很长,您可以将canvas.width替换为其他宽度

欧阳智志
2023-03-14

提供源图像(img)大小作为第一个矩形:

ctx.drawImage(img, 0, 0, img.width,    img.height,     // source rectangle
                   0, 0, canvas.width, canvas.height); // destination rectangle

第二个矩形将是目标大小(源矩形将缩放到什么)。

更新2016/6:对于宽高比和定位(ala CSS'封面方法),请查看:
模拟背景大小:画布中的封面

公孙智
2023-03-14

您在第二次调用时出错,将源的大小设置为目标的大小
无论如何,我打赌您希望缩放图像具有相同的纵横比,因此您需要计算它:

var hRatio = canvas.width / img.width    ;
var vRatio = canvas.height / img.height  ;
var ratio  = Math.min ( hRatio, vRatio );
ctx.drawImage(img, 0,0, img.width, img.height, 0,0,img.width*ratio, img.height*ratio);

我还假设您希望将图像居中,因此代码为:

function drawImageScaled(img, ctx) {
   var canvas = ctx.canvas ;
   var hRatio = canvas.width  / img.width    ;
   var vRatio =  canvas.height / img.height  ;
   var ratio  = Math.min ( hRatio, vRatio );
   var centerShift_x = ( canvas.width - img.width*ratio ) / 2;
   var centerShift_y = ( canvas.height - img.height*ratio ) / 2;  
   ctx.clearRect(0,0,canvas.width, canvas.height);
   ctx.drawImage(img, 0,0, img.width, img.height,
                      centerShift_x,centerShift_y,img.width*ratio, img.height*ratio);  
}

您可以在jsbin中看到它:http://jsbin.com/funewofu/1/edit?js输出

 类似资料:
  • 问题内容: 是否有仅css的解决方案将图像缩放到边框(保持纵横比)?如果图像大于容器,则此方法有效: 问题答案: 不,没有唯一的CSS双向方式可以做到这一点。您可以添加 对于一个元素,使其始终具有100%的宽度,并自动将其高度缩放为长宽比, 或 反之: 始终缩放到最大高度和相对宽度。为此,您需要确定纵横比是高于还是低于容器,而CSS无法做到这一点。 原因是CSS不知道页面的外观。它会预先设置规则,

  • 我使用html5画布元素在浏览器中调整图像大小。原来质量很低。我发现:当缩放 时禁用插值,但这无助于提高质量。 下面是我的css和js代码,以及用Photoshop缩放和在画布API中缩放的图像。 当在浏览器中缩放图像时,我必须做什么来获得最佳质量? JS: 使用Photoshop调整图像大小: 在画布上调整了图像大小: 下面是我使用2步缩小尺寸的结果: 下面是我使用三步缩小尺寸的结果: 下面是如

  • 我正在尝试调整缩略图中的图像大小,以固定框的大小。我试过这个: 这是原始图像的外观:http://files.parsetfss.com/12917a88-ac80-4e5e-a009-fc634161b79c/tfss-6c59b59f-8f57-4610-966e-31bbc203707b-samsung-galaxy-note-4-7290-002.jpg 我也试过: 但是没有任何变化,没有

  • 以下是CardView的XML代码: 我尝试对ImageView(和LinearLayout)的属性使用wrap_content,并尝试包含属性android: caleType="fitXY",但它没有帮助,似乎没有任何效果。 谁能帮我一下吗?我非常感谢您的每一句评论,也非常感谢您的帮助。