Aplicar Efecto Sepia

Aplicar Efecto Sepia

Hace ya unos dias que he estado jugando con los filtros y efectos sobre imagenes desde java, en la mayoria de los casos manipulando los valores RGB de cada pixel, espero les sea de interes, pueden ver mas de 15 filtros que he publicado en My Java Zone

Imagenes

Codigo

Clase Principal

package clases;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;

public class Principal extends JFrame {

 ImageIcon imagenSeleccionada;
 JLabel limgOriginal, limgGrises;
 JTextField txtNombreImg;
 BufferedImage imgsel;

 public Principal() {

  JPanel pprincipal = new JPanel();
  pprincipal.setLayout(new BorderLayout());

  JPanel ptitulo = new JPanel();
  JLabel ltitulo = new JLabel("Sepia");
  ptitulo.add(ltitulo);

  JPanel pimagenes = new JPanel(new BorderLayout());
  JSplitPane split = new JSplitPane();
  split.setResizeWeight(0.5);
  JPanel pimagenoriginal = new JPanel();
  limgOriginal = new JLabel();
  pimagenoriginal.add(limgOriginal);
  JScrollPane spimgoriginal = new JScrollPane(pimagenoriginal);
  split.setLeftComponent(spimgoriginal);
  JPanel pimagengrises = new JPanel();
  limgGrises = new JLabel();
  pimagengrises.add(limgGrises);
  JScrollPane spimggrises = new JScrollPane(pimagengrises);
  split.setRightComponent(spimggrises);

  pimagenes.add(split);

  JPanel pselector = new JPanel();
  txtNombreImg = new JTextField(30);
  JButton btn = new JButton("Seleccionar");
  btn.addActionListener(new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent arg0) {
    JFileChooser selector = new JFileChooser();
    int r = selector.showOpenDialog(null);
    if (r == JFileChooser.APPROVE_OPTION) {
     try {
      imgsel = ImageIO.read(selector.getSelectedFile());
      imagenSeleccionada = new ImageIcon(imgsel);
      limgOriginal.setIcon(imagenSeleccionada);
      limgGrises.setIcon(new ImageIcon(aplicarFiltro()));
      txtNombreImg.setText(selector.getSelectedFile()
        .getName());
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
  });
  pselector.add(txtNombreImg);
  pselector.add(btn);

  pprincipal.add(ptitulo, BorderLayout.NORTH);
  pprincipal.add(pimagenes, BorderLayout.CENTER);
  pprincipal.add(pselector, BorderLayout.SOUTH);

  add(pprincipal);

  setVisible(true);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setBounds(0, 0, 800, 600);
  setLocationRelativeTo(null);

 }
 
 public BufferedImage aplicarFiltro() {
        BufferedImage bi = null;
        if(imgsel != null ) {
            bi = new BufferedImage(imgsel.getWidth(), imgsel.getHeight(),
imgsel.getType());
            Color colorImagen = null; int red = 0, green = 0, blue = 0;
            for(int i = 0; i < imgsel.getWidth(); i++) {
                for (int j = 1; j < (imgsel.getHeight()-1); j++) {
                    colorImagen = new Color(imgsel.getRGB(i, j));
                    try {
                    red = (int)(colorImagen.getRed() * 0.393 +
colorImagen.getGreen() * 0.769 + colorImagen.getBlue() * 0.189);
                    green = (int)(colorImagen.getRed() * 0.349 +
colorImagen.getGreen() * 0.686 + colorImagen.getBlue() * 0.168);
                    blue = (int)(colorImagen.getRed() * 0.272 +
colorImagen.getGreen() * 0.534 + colorImagen.getBlue() * 0.131);
                    colorImagen = new Color((red>255)?255:red,
(green>255)?255:green, (blue>255)?255:blue);
                    } catch (Exception e) {}                    
                    bi.setRGB(i, j, colorImagen.getRGB());
                }
            }
        }
        return bi;
    }

 public static void main(String[] args) {
  new Principal();
 }

}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de paranoid_android

Esta buena la aportación

Esta buena la aportación, imagino que algo asi se puede usar para aplicar la famosa pantalla azul de efectos especiales.