使用处理随机重新排列图像的部分

问题描述

我正在尝试将图像切割成四个正方形部分的网格,然后随机重新排列它们。我以为我可以使用 copy();实现这一目标的函数 - 将图像切成四部分 - 然后将这些部分加载到 PGraphics 数组中。下一步是将它们从阵列中取出并随机分布到网格中。为此,我认为网格应该由二维数组构建......

这是我目前想到的:

{{1}}

所以我设法通过不同的步骤从头开始构建代码 - 但替换太疯狂了 - 我不再确定我是否在正确的轨道上!是否可以将复制功能中复制的部分作为单个 PGraphics 加载到数组中?

感谢您的任何提示或帮助!

解决方法

这是使用 PGraphics 的一种方式:

PImage src;

PGraphics[] pgs = new PGraphics[4];

void setup() {
  size(1080,1080);
  frameRate(5);
  src = loadImage("dog.jpg");
  src.resize(width,height);

  for (int i = 0; i < imgs.length; i++) {
    pgs[i] = createGraphics(width/2,height/2);
    pgs[i].beginDraw();
    pgs[i].copy(src,(i % 2) * width/2,floor(i/2) * height/2,width/2,height/2,height/2);
    pgs[i].endDraw();
  }
}

void draw() {
  background(255);
  for (int i = 0; i < pgs.length; i++) {
    image(pgs[int(random(pgs.length))],floor(i / 2) * height/2);
  }
}

您也可以使用 PImage

PImage src;
PImage[] imgs = new PImage[4];

void setup() {
  size(1080,height);

  for (int i = 0; i < imgs.length; i++) {
    imgs[i] = createImage(width/2,RGB);
    imgs[i].copy(src,height/2);
  }
}

void draw() {
  background(255);
  for (int i = 0; i < imgs.length; i++) {
    image(imgs[int(random(imgs.length))],floor(i / 2) * height/2);
  }
}

您也可以在没有图像数组的情况下执行此操作,只需在每一帧直接从源复制:

PImage src;

void setup() {
  size(1080,height);
}

void draw() {
  background(255);
  for (int i = 0; i < 4; i++) {
    int j = int(random(4));
    copy(src,(j % 2) * width/2,floor(j / 2) * height/2,floor(i / 2) * height/2,height/2);
  }
}

尽管这最后一种方法会占用更多资源,而且事后更难操作。