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

HTML 5画布]调整大小时的图像质量

公冶鸣
2023-03-14

谢谢你看。

我在这里尝试做的是...从计算机加载图像(通过使用FileReader),将img标签的src放入文件。然后用那个图像画画布。

function previewFile(){
   var preview = document.querySelector('img'); //selects the query named img
   var file    = document.querySelector('input[type=file]').files[0]; //sames as here
   var reader  = new FileReader();

   reader.onload = function () {
       preview.src = reader.result;
       drawCanvas();
   }

   if (file) {
       reader.readAsDataURL(file); //reads the data as a URL
   } else {
       preview.src = "sample.jpg";
   }
}

previewFile();  //calls the function named previewFile

window.onload = function () {drawCanvas(); };

function drawCanvas() {
var img = document.querySelector("img");
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext('2d');
ctx.filter = window.getComputedStyle(document.querySelector("img")).filter;
ctx.drawImage(img, 0, 0);
}

问题是当我加载另一个图像文件时。它在画布中加载,但不适合画布大小。它保持原始图像大小,图像的“部分”显示在画布中。

为了解决这个问题,我尝试了以下方法:ctx。drawImage(img,0,0,document.getElementById('canvas')。宽度,
document.getElementById('canvas')。高度);

它可以工作,但是图像质量变得很差。。。因为它不是原始图像的大小。将其调整到特定高度并强制调整大小。

我想做的就是。。。保持原始画布大小(宽度:some px;高度:auto),因此当我加载图像时,它适合画布宽度和调整后的高度。

你能帮帮我吗?非常感谢。

我研究了一下自己,发现如下:我想出了一个主意——首先根据画布的当前宽度更改图像大小。

var img = document.querySelector("img");
var canvas = document.getElementById("image");

var ratio = img.height / img.width;
img.width = canvas.offsetWidth;
img.height = img.width * ratio;

然后用编辑好的图像绘制。

var ctx = canvas.getContext('2d');
ctx.filter = window.getComputedStyle(img).filter;
ctx.drawImage(img, 0, 0, img.width, img.height);

然后我发现了问题。我检查了“img.height”变量是199px。但画布的高度不知怎的变成了150像素。我检查了一下,没有css应用到画布上。

所以这次,我在drawImage()之前设置画布宽度。

ctx.canvas.width = img.width;
ctx.canvas.height = img.height;
ctx.filter = window.getComputedStyle(img).filter;
ctx.drawImage(img, 0, 0);

同样,原始图像回来了...图像的“一部分”显示在画布上。画布的尺寸是我想要的...

共有2个答案

令狐跃
2023-03-14

这很简单!试试这个。获取比例,设置高度,绘制图像

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

这对我有用,试试这个<看到那条线了吗

var width = canvas.width;

您可以替换画布。宽度乘以任何其他值。

毛成济
2023-03-14

非常感谢你看了这个问题。尤其是@试图帮忙的凯伊多。谢谢你。我对这个堆栈溢出真的很陌生...所以我不知道如何创建演示。

我找到了解决办法。这真的是画布的基本知识,,,但我想很多人会忘记/错过以下内容:

var ctx = canvas.getContext('2d');
ctx.canvas.width = 1000;
ctx.canvas.height = 1000;
ctx.drawImage(img, 0, 0, 800, 800);

ctx.canvas.width是画布的宽度,ctx.canvas.height是画布的高度。在绘制图像中,那些800是图像的宽度和高度,而不是画布的大小!!所以如果你设置...假设1000,1000在绘图图像中,图像将被调整到大小,并被绘制到画布中。如果它比画布尺寸大,它只会显示你图像的“一部分”。

所以我所做的是...获取我想要放置画布的div宽度大小。然后首先计算图像的比率(比率=图像的高度/图像的宽度)。然后将画布大小设置为以下(ctx.canvas.width=div宽度大小,ctx.canvas.height=div宽度大小*比率)。然后用canva的宽度和高度绘制画布(ctx.drawImage(img,0,0,ctx.canvas.width,ctx.canvas.height))。

希望这能帮助像我这样的新人:)谢谢。

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

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

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

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

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我有一个开源应用程序,可以将照片上传到Facebook。为了节省带宽,照片在上传之前会自动调整大小(Facebook设置了最大大小限制)。少数人抱怨照片质量,实际上您可以看到其中的区别(有关某些演示图像,请参阅此问题)。 所以我的问题

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