Мне нужна помощь в понимании массивов пикселей - PullRequest
1 голос
/ 24 ноября 2011

Я использую Обработка , чтобы разделить большое изображение на серию меньших прямоугольных узлов.

При обработке сохраняется значение цвета для пикселей PImage в массиве pixels, к которому я обращаюсь, чтобы разбить изображение на более мелкие части.По какой-то причине я получаю этот вывод, когда я намеревался показать все изображение, когда узлы расположены в draw().

Вот мой основной класс:

ArrayList node = new ArrayList();
PImage grid;
PVector nodeDimensions = new PVector(210, 185);
PVector gridDimensions = new PVector(2549, 3300);
String name = "gridscan.jpeg";

void setup() {
  size(500, 500); 
  grid = loadImage(name);
  grid.loadPixels(); 
  fillPixels();
  noLoop();
}

void fillPixels() {
  int nodeNum = 0;
  for (int startX = 0; startX < 2549 - nodeDimensions.x; startX += nodeDimensions.x) {
    for (int startY = 0; startY < 3300 - nodeDimensions.y; startY += nodeDimensions.y) {
      node.add(new Node()); 
      sendPixels(new PVector(startX, startY), nodeNum);
      nodeNum++;
    }
  }
}

void sendPixels(PVector start, int nodeNum) {
  for (int x = int(start.x); x < start.x + nodeDimensions.x; x++) {
    for (int y = int(start.y); y < start.x + nodeDimensions.y; y++) {
      Node _node = (Node) node.get(node.size() - 1);
      _node.fillPixel(new PVector(x, y), grid.pixels[int(y*gridDimensions.x+x)]);
    }
  }
}

void draw() {
  drawNodes();
}

void drawNodes() {
  int nodeNum = 0;
  for (int x = 0; x < width; x += nodeDimensions.x) {
    for (int y = 0; y < height; y += nodeDimensions.y) {
      Node _node = (Node) node.get(nodeNum);
      _node.drawMe(new PVector(x - (nodeDimensions.x/2), y - (nodeDimensions.y/2))); 
      nodeNum++;
    }
  }
}

А вот класс Node:

class Node {

color[] pixel;

Node() {
  pixel = new color[int(nodeDimensions.x * nodeDimensions.y)];
}

void fillPixel(PVector pos, color pixelValue) {
  if(int(pos.y * nodeDimensions.y + pos.x) < 38850) pixel[int(pos.y * nodeDimensions.y + pos.x)] = pixelValue;
}

void drawMe(PVector centerPos) {
  pushMatrix();
  translate(centerPos.x, centerPos.y);
  for(int x = 0; x < nodeDimensions.x; x++) {
   for(int y = 0; y < nodeDimensions.y; y++) {
    stroke(getPixelColor(new PVector(x, y)));
    point(x,y);
   } 
  }
  popMatrix();
}


color getPixelColor(PVector pos) {
 return pixel[int(pos.y * nodeDimensions.x + pos.x)];
}

}

Надеюсь, мой код имеет смысл.Я подозреваю, что проблема в методе sendPixels() основного класса.

Я использовал эту эту страницу из справочника по обработке в качестве руководства для создания этой функции, и я не уверен, где моя логика неверна.

Любая помощь будетПожалуйста, дайте мне знать, если я могу уточнить что-то.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Согласно getPixelColor() кажется, что он использует строки.Таким образом, если у вас есть квадратное изображение 5x5, то 2x2 будет 7.Чтобы получить индекс вы используете эту формулу:index = (y - 1) * width + xОбъясняется так, все выглядит довольно просто, не так ли?

1 голос
/ 25 ноября 2011

В качестве альтернативы вы можете использовать getSubimage() для BufferedImage, возвращенного методом getImage для PImage. Здесь есть связанный пример здесь .

...