尝试在Processing(PDE)语言中调整图像大小

时间:2014-12-24 00:27:31

标签: java processing

我有节日气氛,我正在考虑为圣诞节写一个倒计时器,但遇到了一些我无法解决的困难。我有2个PImage变量,一个直接从硬盘驱动器上的图像加载,名为" origbkg",而另一个是显示为我程序背景的实际图像。我是这样做的,这样如果用户改变窗口的大小,图像将相应地调整大小。但是,当我使窗口非常小,然后尝试再次最大化它会失去分辨率,尽管它应该被重置为从驱动器加载的原始全分辨率图像。

当我试图显示" origbkg"在屏幕上,当我所做的只是设置bkgimg=origbkg时,它也会因某种原因而被修改。

这是我的代码:

//Christmas Countdown Clock
//by: Ben Templin

//============================================================




//-------------------------Variables-------------------------


boolean bkgsized;
String background;
PImage origbkg;
PImage bkgimg;
int count;
int psize;
int size;


//-------------------------Setup-------------------------


void setup()
{
  frameRate(30);
  smooth();
  size(displayWidth-250, displayHeight-250);
  frame.setResizable(true);
  background="default";
  textSize(20);
  fill(255, 0, 0);
  text("Loading Images...", width/2-100, height/2);
  origbkg=loadImage("Christmas-Tree.png");
  bkgsized=false;
  bkgimg=origbkg;
}


//-------------------------Draw-------------------------


void draw()
{
  size=width+height;
  if(psize!=size){
    bkgsized=false;
  }

  if(bkgsized==false){
    sizebkg();
  }
  psize=width+height;
}


//-------------------------Size the Background-------------------------


void sizebkg()
{
  bkgimg=origbkg;
  bkgimg.resize(width, height);
  image(bkgimg, 0, 0);
  bkgsized=true;
}

有人可以告诉我为什么" origbkg"变了吗?提前致谢,

圣诞快乐!

1 个答案:

答案 0 :(得分:0)

bkgimg=origbkg;
bkgimg.resize(width, height);

变量origbkg包含对PImage对象的引用。首先,此代码将该引用复制到bkgimg中,以便bkgimg和origbkg引用相同的PImage。然后,它调整bkgimg引用的图像的大小 - 这与origbkg引用的图像相同!要使用此技术,您必须使用某种方法来克隆或复制图像,并将bkgimg设置为副本,而不是原始副本。但是,对于这个用例,简单地使用image()方法和其他参数重新缩放图像以适合您的宽度和高度实际上更有效:

image(origbkg, 0, 0, width, height);

这样,您无需在每次调整图像大小时创建图像的新副本。

作为旁注,你的draw()方法检查窗口是否已经调整大小是有缺陷的:它检查宽度+高度的总和是否已经改变,但是这个检查没有考虑到这种可能性窗口调整大小,使其宽度增加与高度收缩相同的距离,反之亦然。要正确检查调整大小,必须同时存储pwidth变量和pheight变量并进行比较。