Category Archives: Processing

Matriz de imagens com Processing

Recentemente participei de uma oficina com as pessoas(Panetone, Ricardo Brazileiro, Jarbas Jacome, Jeraman, Eduardo Nespoli e Ricardo Palmieri) no 4˚ contato promovido pela UFSCar.

Durante a oficina brincamos bastante com o Pd, com o Processing e eletrônica.

Confesso que depois desta oficina fiquei bastante viciado nestas ferramentas.

O Processing trata-se de uma ferramenta de programação de alto nível, projetada inicialmente para artistas, designers e afins. Mas com o tempo, foi assimilada por vários outros entusiastas. A simplicidade da linguagem faz do Processing, uma ótima opção para quem nunca programou mas tem interesse no assunto. Com apenas algumas linhas, já é possível construir pequenas estruturas. Além da ótima documentação e exemplos que facilitam muito a vida dos iniciantes.

Durante o festival, aconteceu uma pequena exposição de arte eletrônica. Dentre os trabalhos expostos estava o trabalho Espelhos Recursivos, de Jeraman. Este trabalho serviu de inspiração para a construção do pequeno programa escrito usando o Processing. Segue abaixo o código do exercício.

import processing.video.*;

int cellSizex = 16;
int cellSizey = 12;
int cols, rows;

Capture video;
PImage smallvideo, tmpimg;

void setup() {
  size(640, 480, P2D);
  frameRate(30);
  cols = width / cellSizex;
  rows = height / cellSizey;
  colorMode(RGB, 255, 255, 255, 80);

  // Uses the default video input, see the reference if this causes an error
  video = new Capture(this, width, height, 12);
  tmpimg = new PImage(width, height);
  smallvideo = new PImage(cellSizex, cellSizey);
  background(0);
}

void draw() {

  if (video.available()) {
    video.read();

    //store smallimage resized and inverted from video variable
    tmpimg = video.get();
    tmpimg.resize(cellSizex, cellSizey);

    //flip image
    for (int i = 0; i < tmpimg.width; i++) {
      // Begin loop for height
      for (int j = 0; j < tmpimg.height; j++) {
        smallvideo.pixels[j*tmpimg.width+i] = tmpimg.pixels[(tmpimg.width - i - 1) + j*tmpimg.width]; // Reversing x to mirror the image
      }
    }

    smallvideo.updatePixels();

    // Paint big image
    // Begin loop for columns
    for (int i = 0; i < cols; i++) {
      // Begin loop for rows
      for (int j = 0; j < rows; j++) {

        //paint smallvideo

        set(smallvideo.width*i, smallvideo.height*j,smallvideo);

        // Where are we, pixel-wise?
        int x = i*cellSizex;
        int y = j*cellSizey;

        int loc = (video.width - x - 1) + y*video.width; // Reversing x to mirror the image

        float r = red(video.pixels[loc]);
        float g = green(video.pixels[loc]);
        float b = blue(video.pixels[loc]);
        // Make a new color with an alpha component
        color c = color(r, g, b, 20);

        // Code for drawing a single rect
        // Using translate in order for rotation to work properly
        pushMatrix();
        translate(x+cellSizex/2, y+cellSizey/2);
        rectMode(CENTER);
        fill(c);
        noStroke();
        rect(0, 0, cellSizex+6, cellSizey+6);
        popMatrix();
      }
    }
  }
}

public void keyPressed() {
  switch (key) {
    case 'g': saveFrame();
    break;
  }
}

Em breve pretendo fazer mais algumas coisas. Publicarei mais conforme for fazendo outros exercícios.