【问题标题】:Processing -- moving image leaving trail处理——运动图像留下痕迹
【发布时间】:2014-02-17 05:34:05
【问题描述】:

我正在尝试使图像在处理过程中移动,但图像会留下痕迹。让我感到困惑的重要部分是我无法在 draw() 中声明背景,因为我还有其他放置图像的函数。以下是相关代码:

    void setup()
{
  size(752,500);
  background = loadImage("prairie.jpg");
  background(background);
  noStroke();

  animal = loadImage("squirrel.png");
  bird = loadImage("bird.gif");
  rock = loadImage("rock.png");
  cloud = loadImage("cloud.png");
  jeep = loadImage("jeep.png");
  flower = loadImage("flower.png");
}

  float jeepX = 752;
  float jeepY = 250;
  float size = 100;

void draw()
{
  image(jeep,150,350,125,125);

  image(jeep,jeepX,jeepY,size,size);

  jeepX--;
  jeepY = jeepY + .25;
  size += .25;
  image(jeep,jeepX + 1,jeepY - .25, size -.25, size - .25, 0,0,0,0);


  if(jeepY > height)
  {
    jeepX = 752;
    jeepY = 250;
    size = 100;
  }
        }

这是实验室的,TA不知道怎么做,我还没有机会问教授。

如果没有人知道答案和/或它与其他功能(放置图像)有关,我将发布相关代码。

【问题讨论】:

  • 我觉得有点难以理解。据我了解,您想要一张图片作为背景,但您绘制的第一张图片设置为仅在草图跨越 752x500 时采用 125x125,因此除非您清除背景,否则会有痕迹。您能否为您要实现的目标添加视觉提示?

标签: java image processing


【解决方案1】:

为了让移动的物体不留下痕迹,重绘前必须先清框。(没有背景的别忘了重置背景)

事实上,它会先拉一辆吉普车,然后再拉另一辆。

【讨论】:

  • 很遗憾,我无法重置背景,“因为我还有其他放置图像的功能”。我需要一种方法来简单地擦除我放置的图像。
  • 也许您可以在图像上绘制一个空白图像的背景颜色?有点hackish,但应该可以。
  • 背景是一张图片,尽管我可以尝试将它拼凑在一起,因为它占用了我要擦除的图片大小的背景部分。不过,我不知道如何在 Processing 中处理图像。
【解决方案2】:

如果您不想要踪迹,则可以清除背景。如果不完全,至少部分,或者重绘每个不应该移动每一帧的图像。 像这样:

示例代码

PImage bg, still, moving;

void setup() {
  while ( bg == null) {// got wait as size depends on this...
    println("loading bg image...");
    bg = loadImage("http://dc489.4shared.com/img/f9EaWk5w/s3/13757197c08/Black_Background_Metal_Hole_-_.jpg");
  }
  size(bg.width, bg.height);
  still = loadImage("http://www.renderosity.com/mod/bcs/photos/Thumb85619.jpg");
  moving = loadImage("https://cdn1.iconfinder.com/data/icons/humano2/128x128/apps/alienblaster.png");



}

void draw() {

  background(bg);
  image(still, 100, 100);
  image(moving, 200,  frameCount%height);

}

【讨论】:

  • 嗯,好的。我正在考虑对其进行设置,以便函数为图像放置采用变量,并且每次 draw() 运行时都会重绘。我觉得对于程序应该多么简单来说,这将是一种 cpu 密集型。
  • 我突然想到了另外一条路,用PGraphics做图层,所以你只重绘动态图像...不过如果程序那么简单,性能可能就不是那么重要了...
  • PGraphics 听起来是个不错的建议。此外,您可以使用 requestImage 代替 while 循环,它在幕后启动一个新线程并且不会“锁定”主动画线程。
  • @GeorgeProfenza 感谢 requestImage 的事情。我经常绕过新功能...但是在这种情况下,由于我需要设置图像大小,那不会破坏程序吗?
  • @v.k.哦,是的,你是对的,你仍然需要等待图像加载和初始化。不幸的是isLoaded() 对我不起作用,但检查图像宽度和高度是否有效。在你的情况下,因为 size() 重置了很多东西(不仅仅是框架的大小),while循环更好:)我的错
【解决方案3】:

您需要在 'draw' 方法中重绘背景。为此,只需将以下代码行添加到您的 'draw' 方法:

background(red,green,blue);

您可以使用处理中的颜色选择器(位于工具下)找到所需颜色的正确 rgb 代码。

这样做的原因是 draw 方法每秒运行 60 次,而 'setup' 方法仅在程序执行时运行一次。这样,当你移动图片时,如果背景颜色不在'draw'方法中,那么在图片移动时不会重绘,从而留下痕迹。

【讨论】:

  • “让我感到困惑的重要部分是我无法在 draw() 中声明背景,因为我还有其他放置图像的函数。”
  • @user3303354 您需要在draw函数中调用这些方法,以便它们与背景一起重绘。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 2023-04-05
  • 1970-01-01
  • 2021-05-20
  • 2018-05-13
  • 2011-09-09
  • 2021-07-07
  • 1970-01-01
相关资源
最近更新 更多