domingo, 24 de junio de 2012

Propuesta ASCII Art en Processing pt3


Listo! Ya tenemos el primer acercamiento con el video y el ASCII Art. Para este programa se necesitan las librerías GStreamer (debido a que el desarrollo fue en Linux), pero bien se puede llevar en Windows o Mac utilizando las librerías QuickTime (de hecho con esto sería mucho mas fácil, pues las librerías vienen con Processing).

Pensaba si tal vez se pueda colocar algo muy interesante con sonido, o efectos 3d (por ejemplo que la imagen rote desde el centro según el movimiento del ratón, si fuera así, tendríamos que generar un arreglo de objetos tipo caracter, para dibujarlos en una posición Z).

Si me dan alguna sugerencia o idea se podría hacer algo aún más interesante.

Como no se si es posible hacer subidas en Blogger, voy a dejar escrito el código a continuación.

----------------------------------------------------------------------------------------------------------------------

import processing.opengl.*;
import codeanticode.gsvideo.*;

// Constantes
int altoAscii = 24; //Tamaño de la letra
// Variables
int cols, rows; //Filas y columnas de la imagen
float cellw, cellh; //Ancho y alto de cada celda del dibujo
PFont font; //Letra de gráfico
GSCapture video; //Captura del video
String ordenCaracteres = "@%#*+=-:."; // Los caracteres en pantalla
//String ordenCaracteres = ".:-=+*#%@"; // Los caracteres en pantalla (orden invertido en el caso de que se quiera en fondo negro)
char[] caracteres; // El arreglo de caracteres

void setup() {
  //size(screen.width, screen.height, P3D);
  size(800, 600, P2D);
  colorMode(HSB);

  // Inicializa el video
  video = new GSCapture(this, 160, 120);
  video.start(); 

  //cargar tipografía
  font = loadFont("Ubuntu-48.vlw");

  // for the 256 levels of brightness, distribute the letters across
  // the an array of 256 elements to use for the lookup
  caracteres = new char[256];
  for (int i = 0; i < 256; i++) {
    int indice = int(map(i, 0, 256, 0, ordenCaracteres.length()));
    caracteres[i] = ordenCaracteres.charAt(indice);
  }
}

void draw() {
  background(255);
 
  textFont(font, altoAscii);

  cols = int(this.width/(altoAscii));
  rows = int(cols*video.height/video.width);
 
  cellw = video.width/float(cols);
  cellh = video.height/float(rows);

  for(int i=0; i<cols; i++) {
    for(int j=0; j<rows; j++) {
     
      float x = i*cellw;
      float y = j*cellh;

      int k = int(x+(cellw*0.5)) + int(y+(cellh*0.5)) * video.width;
         
      int rojo = int(red(video.pixels[k]));
      int verde = int(green(video.pixels[k]));
      int azul = int(blue(video.pixels[k]));

      int gris = max(rojo,verde,azul);

      fill(0);
      text(caracteres[gris], map(x,0,video.width,0,this.width), map(y,0,video.height,0,this.height));
    }
  }
}

// Necesario para que el video funcione
public void captureEvent(GSCapture c) {
  c.read();
}

void keyPressed(){
  switch(keyCode){
    case 38:
      altoAscii++;
      if(altoAscii>40)altoAscii=40;
      break;
    case 40:
      altoAscii--;
      if(altoAscii<2)altoAscii=2;
      break;
  }
}

----------------------------------------------------------------------------------------------------------------------

No hay comentarios:

Publicar un comentario