Archive for the ‘Uncategorized’ Category

Ejemplo recorrer pixeles de una imagen

Lo que este código hace es recibir una fotografía de un rostro y devolver una imagen con la silueta del mismo. Para obtener solo la silueta me di cuenta que en las fotografías por lo regular los contornos de las cosas son mas oscuros que los fondos, entonces recorro la imagen pixel por pixel obtengo la escala RGB de cada pixel y lo comparo con un rango de oscuridad que previamente establecí (en este caso un pixel oscuro va a ser aquel que en su niveles de los colores  rojo, verde y azul se encuentre dentro del rango 0 a 100 ), si el pixel es oscuro se imprime como tal y si no cumple con la condición se pinta de blanco. Y es así como obtengo el efecto de devolver solo la silueta.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
/*
 *
 *@author DiabloGuardian
 *dennysoliver@msn.com
 *
 */
class SiluetasImg extends JFrame { 
  Image imagenFuente; 
  int iniAncho;
  int iniAlto;
  Image imagenNueva;
  int insetArriba;
  int insetIzqda;
  
  public static void main( String[] DiabloGuardian ) {
    SiluetasImg obj = new SiluetasImg();
    obj.repaint();
    }
  public SiluetasImg() {
    imagenFuente = Toolkit.getDefaultToolkit().getImage( "jennifer1.jpg" );
    
    MediaTracker tracker = new MediaTracker( this );
    tracker.addImage( imagenFuente,1 );
        
    try {
      if( !tracker.waitForID( 1,10000 ) ) {
        System.out.println( "Error en la carga de la imagen" );
        System.exit( 1 );        
      }
    } catch( InterruptedException e ) {
      System.out.println( e );
      }
    
    iniAncho = imagenFuente.getWidth( this );
    iniAlto = imagenFuente.getHeight( this );
    this.setVisible( true );
    
     insetArriba = this.getInsets().top;
    insetIzqda = this.getInsets().left;
    this.setSize( insetIzqda+iniAncho,insetArriba+iniAlto );
    this.setTitle( "By DiabloGuardian" );
    this.setBackground( Color.white );
    
    int[] pix = new int[iniAncho * iniAlto];
    try {
      PixelGrabber pgObj = new PixelGrabber( imagenFuente,
        0,0,iniAncho,iniAlto,pix,0,iniAncho );
            
      if( pgObj.grabPixels() && 
        ( (pgObj.getStatus() & ImageObserver.ALLBITS ) != 0 ) ) {
        for( int i=0; i < (iniAncho*iniAlto); i++ ) {
         if(verPixel(pix[i]))
           pix[i] = 0xFFFFFFFF;
          }
        }
      else {
        System.out.println( "Problemas al descomponer la imagen" );
        }
    } catch( InterruptedException e ) {
      System.out.println( e );
      }
    
    imagenNueva = this.createImage( new MemoryImageSource(
      iniAncho,iniAlto,pix,0,iniAncho ) );
    
    this.addWindowListener(
      new WindowAdapter() {
        public void windowClosing( WindowEvent evt ) {
          System.exit( 0 );
        }
      }
    );
  }
  
  public void paint( Graphics g ) {
    if( imagenNueva != null ) {
       g.drawImage( imagenNueva,insetIzqda,insetArriba,this );    
      }
    }
    
    public boolean verPixel(int pixel) { 
int alpha = (pixel >> 24) & 0xff; 
int red = (pixel >> 16) & 0xff; 
int green = (pixel >> 8 ) & 0xff; 
int blue = (pixel ) & 0xff; 
if((red > -1 && red < 100) && (green > -1 && green < 100) && (blue > -1 && blue < 100))
return false;
else
return true;
}     
 }
En el código especificamos la imagen a procesar, que es la siguiente
mario
y el programa devuelve lo siguiente.
salida
Anuncios