请看下面的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()
:成功加载图像(至少显示图像)后,我将其宽度和高度分配给变量imgW
和imgH
。接着是画布大小的变化。。。这会导致一个错误,画布的大小与上传的图像相同(在开发者工具
上选中),但不显示任何内容。
使用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;
}
/**************************************************/
请记住,绘制()
函数每秒调用60次。每当您调用resizeCanvas()
函数时,它也会被调用。
你调用resizeCanvas()
哪个调用draw()
哪个调用resizeCanvas()
哪个调用draw()
,直到你最终得到错误。
要解决这个问题,您需要停止每帧调用resizeCanvas()
。看起来您可能可以从getFile()
函数内部调用它?
编辑:修复该问题后,下一个问题是由JavaScript异步加载图像引起的。想想这条线上发生了什么:
img = createImg(file.data).hide();
createImg()
文件获取一个URL,并在代码继续执行时开始在后台加载图像。然后您使用img
调整画布的大小,但图像实际上尚未完成加载,因此宽度和高度未定义。尝试向控制台打印一些值以了解我的意思。
要解决此问题,需要等待图像实际加载。我认为您正试图用while
循环来实现这一点,但请注意,您的循环没有做太多,因为img
总是在第一次定义的。在使用之前,你需要更深一层,检查图像的宽度和高度。
您还可以使用p5。文件引用在继续之前检查文件类型,并在图像加载时显示进度条等操作。
问题在于图像数据的异步加载。您可以使用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'