当前位置: 首页 > 面试题库 >

使用javascript画布调整图像大小(平滑)

娄德运
2023-03-14
问题内容

我正在尝试使用画布调整某些图像的大小,但是我对如何使其平滑一无所知。在Photoshop,浏览器等上。它们使用一些算法(例如双三次,双线性),但我不知道这些算法是否内置在画布中。

var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width=300
canvas.height=234
ctx.drawImage(img, 0, 0, 300, 234);
document.body.appendChild(canvas);

第一个是正常尺寸调整后的图片标签,第二个是画布。请注意,画布如何不那么光滑。如何获得“顺滑度”?


问题答案:

您可以使用降级以获得更好的结果。调整图像大小时,大多数浏览器似乎使用线性插值而不是双三次插值。

更新
在规范中添加了品质属性,该属性imageSmoothingQuality当前仅在Chrome中可用。)

除非没有选择平滑或最接近的邻居,否则浏览器将始终在缩小图像后对图像进行插值,因为此功能用作低通滤波器以避免混叠。

双线性使用2x2像素进行插值,而双三次使用4x4进行插值,因此,通过逐步执行此操作,可以在使用双线性插值时接近双三次结果,如在所得图像中看到的那样。

var canvas = document.getElementById("canvas");

var ctx = canvas.getContext("2d");

var img = new Image();



img.onload = function () {



    // set size proportional to image

    canvas.height = canvas.width * (img.height / img.width);



    // step 1 - resize to 50%

    var oc = document.createElement('canvas'),

        octx = oc.getContext('2d');



    oc.width = img.width * 0.5;

    oc.height = img.height * 0.5;

    octx.drawImage(img, 0, 0, oc.width, oc.height);



    // step 2

    octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);



    // step 3, resize to final size

    ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5,

    0, 0, canvas.width, canvas.height);

}

img.src = "//i.imgur.com/SHo6Fub.jpg";


<img src="//i.imgur.com/SHo6Fub.jpg" width="300" height="234">

<canvas id="canvas" width=300></canvas>

如果差异不大,则取决于您调整大小的激烈程度,您可以跳过第2步。

在演示中,您可以看到新结果现在与image元素非常相似。



 类似资料:
  • 我正在尝试用画布调整一些图像的大小,但我不知道如何平滑它们。在photoshop,浏览器等。有几个算法他们使用(例如双三次,双线性),但我不知道这些是不是内置到画布。 这是我的小提琴:http://jsfidle.net/ewupt/ 第一个是正常的调整大小的图像标签,第二个是画布。注意画布是如何不是平滑的。我怎样才能实现‘平滑’呢?

  • 问题内容: 我正在尝试使用javascript和canvas元素在客户端创建缩略图,但是当我缩小图像时,它看起来很糟糕。看起来好像是在Photoshop中缩小了尺寸,将重采样设置为“最近的邻居”而不是Bicubic。我知道有可能使它看起来正确,因为该站点也可以使用画布来完成它。我已经尝试使用与[[Source]]链接中所示相同的代码,但是看起来仍然很糟糕。是否缺少我需要的设置,需要设置的设置? 编

  • 请看下面的P5代码 这个小应用程序的目的是在画布上拖放图像,根据“上传”图像的宽度和高度改变其大小。 使用:成功加载图像(至少显示图像)后,我将其宽度和高度分配给变量和。接着是画布大小的变化。。。这会导致一个错误,画布的大小与上传的图像相同(在上选中),但不显示任何内容。 使用:当禁用上的画布大小更改并单击画布时,调整大小会完美地显示图像。 应用程序需要在不点击的情况下工作,在删除图像后应该自动更

  • 一直以来,我都在开发一款分辨率为800x480(流行手机分辨率)的应用程序。 我的画布HTML: 现在,为了使其全屏显示其他分辨率,我在调整大小事件后执行以下操作: 这是可行的,但问题是我不能以这种方式保持纵横比。800x480是4:3,但是如果我在5:3的手机上运行这个应用程序,有些东西(尤其是圆圈)看起来会被拉伸。 有没有什么方法可以让它在所有分辨率下看起来都很好,而不必为每个纵横比创建一组独

  • 谢谢你看。 我在这里尝试做的是...从计算机加载图像(通过使用FileReader),将img标签的src放入文件。然后用那个图像画画布。 问题是当我加载另一个图像文件时。它在画布中加载,但不适合画布大小。它保持原始图像大小,图像的“部分”显示在画布中。 为了解决这个问题,我尝试了以下方法:ctx。drawImage(img,0,0,document.getElementById('canvas'

  • 问题内容: 我有一个快速的问题,我不太确定要进行设置。我在其他地方看到过示例,但没有什么比我的情况更具体。我想使用PHP调整图像的大小,以使图像易于阅​​读,而不仅仅是像使用HTML那样随意拉伸。如果它们的宽度不是250像素,也不是160像素,那么如何调整图片的大小,使其成比例但适合该空间? 谢谢! 问题答案: 好的,下面是我在商店中使用的Image对象。保持规模-需要GD 我在请求时调整图像的大