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

根据图像大小调整P5画布的大小

符学
2023-03-14

请看下面的P5代码
这个小应用程序的目的是在画布上拖放图像,根据“上传”图像的宽度和高度改变其大小。

/**************************************************/
//GENERAL
var canvas;
//IMAGE
var img;//image
var imgW;//image width
var imgH;//image height
/**************************************************/
function setup(){
  canvas = createCanvas(710, 400);//initial canvas size
  canvas.drop(gotFile);
}
/**************************************************/
function draw(){
    background(0);
    if(img){
    image(img, 0, 0);
    imgW = img.width;
    imgH = img.height;
        if(imgW > 0 && imgH > 0){
            resizeCanvas(imgW, imgH);
        }
    }
    fill(255);
    text(imgW + ", " + imgH, 10, 10);
}
/**************************************************/
//
function gotFile(file){
  if (file.type === 'image') {
    img = createImg(file.data).hide();
  }
}
/**************************************************/
function mouseClicked(){
    if(img){
        if(imgW > 0 && imgH > 0){
            resizeCanvas(imgW, imgH);
        }
    }
}

使用draw():成功加载图像(至少显示图像)后,我将其宽度和高度分配给变量imgWimgH。接着是画布大小的变化。。。这会导致一个错误,画布的大小与上传的图像相同(在开发者工具上选中),但不显示任何内容。

使用mouseClick():当禁用绘制()上的画布大小更改并单击画布时,调整大小会完美地显示图像。

应用程序需要在不点击的情况下工作,在删除图像后应该自动更改(画布大小)。

使现代化

这是我在删除控制台上的错误时在控制台上看到的:

Uncaught RangeError: Maximum call stack size exceeded
    at Array.map (<anonymous>)
    at p5.Color._parseInputs (p5.js:44096)
    at new p5.Color (p5.js:43147)
    at p5.color (p5.js:42827)
    at p5.Renderer2D.background (p5.js:50315)
    at p5.background (p5.js:44288)
    at draw (sketch.js:21)
    at p5.redraw (p5.js:52435)
    at p5.resizeCanvas (p5.js:51826)
    at draw (sketch.js:30)

更新2

这就是代码现在的样子,在Drop方法上调用resizeCanvas:

/**************************************************/
//GENERAL
var canvas;
//IMAGE
var img;
var imgW;
var imgH;
var z;
/**************************************************/
function setup(){
  canvas = createCanvas(710, 400);
  canvas.drop(gotFile); 
}
/**************************************************/
function draw(){
    background(0);
    //
    if(img){
        imgUpdate();
    }
    //debug
    fill(255);
    text(imgW + ", " + imgH, 10, 10);
}
/**************************************************/
function gotFile(file){
  if (file.type === 'image') {
    img = createImg(file.data).hide();
  }
  while (!img) {

  }
  createP("Uploaded");

  if(img)
  {
    imgUpdate();
    resizeCanvas(imgW, imgH);
  }
}
/**************************************************/
function mouseClicked(){
    if(img)
    {
        if(imgW > 0 && imgH > 0)
        {
            resizeCanvas(imgW, imgH);
        }
    }
}
/**************************************************/
function imgUpdate()
{
    image(img, 0, 0);
    imgW = img.width;
    imgH = img.height;
}
/**************************************************/

共有2个答案

莘聪
2023-03-14

请记住,绘制()函数每秒调用60次。每当您调用resizeCanvas()函数时,它也会被调用。

你调用resizeCanvas()哪个调用draw()哪个调用resizeCanvas()哪个调用draw(),直到你最终得到错误。

要解决这个问题,您需要停止每帧调用resizeCanvas()。看起来您可能可以从getFile()函数内部调用它?

编辑:修复该问题后,下一个问题是由JavaScript异步加载图像引起的。想想这条线上发生了什么:

img = createImg(file.data).hide();

createImg()文件获取一个URL,并在代码继续执行时开始在后台加载图像。然后您使用img调整画布的大小,但图像实际上尚未完成加载,因此宽度和高度未定义。尝试向控制台打印一些值以了解我的意思。

要解决此问题,需要等待图像实际加载。我认为您正试图用while循环来实现这一点,但请注意,您的循环没有做太多,因为img总是在第一次定义的。在使用之前,你需要更深一层,检查图像的宽度和高度。

您还可以使用p5。文件引用在继续之前检查文件类型,并在图像加载时显示进度条等操作。

须原
2023-03-14

问题在于图像数据的异步加载。您可以使用loadImage()方法,利用成功回调并像这样编写gotFile:

function gotFile(file){
  if (file.type === 'image') {
    img = loadImage(file.data, 
                    function(){
                      imgUpdate();
                      resizeCanvas(imgW, imgH);
                    });
  }

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

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

  • 我使用数组/循环从一个名为gallery(Wordpress)的自定义字段获取图像。检索到的图像未调整大小,这意味着它们的最大宽度为150px,最大高度为150px。现在我想知道如何自动让这些图像适应浏览器的大小。Chrome做得很好,但IE和FF做不到。当我设置img{width:100%;}调整大小是可行的,但是图像本身的大小是错误的,你可以想象得到。 是否有其他可能让图像自动调整到浏览器大小

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

  • 问题内容: 我正在尝试使用画布调整某些图像的大小,但是我对如何使其平滑一无所知。在Photoshop,浏览器等上。它们使用一些算法(例如双三次,双线性),但我不知道这些算法是否内置在画布中。 第一个是正常尺寸调整后的图片标签,第二个是画布。请注意,画布如何不那么光滑。如何获得“顺滑度”? 问题答案: 您可以使用降级以获得更好的结果。调整图像大小时,大多数浏览器似乎使用线性插值而不是双三次插值。 (

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