/*
 * exampleJAI1.java
 *
 */

/**
 *
 * @author  hitoshi
 *
 * Comentários: esse é um exemplo bem simples para mostrar a criação
 *de uma imagem a partir de uma arquivo e a sua exibição em uma janela,
 *usando AWT/Swing.
 *
 * Instruções para uso: a imagem de entrada é passada pela linha de
 *comando. Eu estou usando o NetBeans IDE 3.6, que você pode baixar do
 *site da Sun. Para rodar de dentro do IDE, você precisa especificar os
 *argumentos.
 *
 */


import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.media.jai.*;
import javax.swing.*;
import javax.swing.event.*;
import com.sun.media.jai.widget.DisplayJAI;
import java.awt.image.*;
import java.awt.image.renderable.*;

public class exampleJAI1 {
    
    private static Frame frame; // frame será a janela da aplicação

    // IMAGENS
    // se voce precisa de uma imagem, use a classe PlanarImage.
    // nesse exemplo vamos usar 2 imagens, para ver a entrada e saída
    // ao mesmo tempo.
    private static PlanarImage imageIn;
    private static PlanarImage imageOut;
    
    // Display image é uma extensão da classe JPanel
    // e serve para exibirmos
    private static DisplayJAI imagePanelIn;
    private static DisplayJAI imagePanelOut;
    
    // variáveis utilizadas na operacão de threshold
    private static double low[];
    private static double high[];
    private static double map[];
    
    // listener's é a forma do Java poder tratar os eventos que
    // ocorrem na interface. No caso, quando o usuário clica no
    // slider, a seguinte classe é chamada (veja o addlistener na
    // criação do slider
    private static class SliderListener implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
            JSlider slider = (JSlider)e.getSource();
            high[0] = (double) slider.getValue();
            
            ParameterBlock pb = new ParameterBlock();
            pb.addSource(imageIn);
            pb.add(low);
            pb.add(high);
            pb.add(map);
            // aqui a imagem vai ser limiarizada, usando os parâmetros
            // definidos em pb. De uma olhada na documentação do JAI
            // para ver as demais operações
            imageOut = JAI.create("threshold", pb, null);
            imagePanelOut.set(imageOut);
        }
    }
    
    private static void criaInterface(String nome, String filename) {
        frame = new Frame(nome);
        frame.setLayout(new BorderLayout());
        
        // carrega a imagem de entrada
        PlanarImage source = JAI.create("fileload", filename);
        float scale = 320.0F/Math.max(source.getWidth(),
        source.getHeight());
        ParameterBlock pbs = new ParameterBlock();
        pbs.addSource(source);
        pbs.add(scale);
        pbs.add(scale);
        pbs.add(0.0F);
        pbs.add(0.0F);
        pbs.add(new InterpolationNearest());
        
        imageIn = JAI.create("scale", pbs, null);
        
        // cria a primeira imagem limiarizada
        ParameterBlock pb = new ParameterBlock();
        pb.addSource(imageIn);
        pb.add(low);
        pb.add(high);
        pb.add(map);
        imageOut = JAI.create("threshold", pb, null);
        
        // DisplayJAI é uma extensão da classe JPanel
        // e serve para exibirmos a imagem
        imagePanelIn = new DisplayJAI(imageIn);
        imagePanelOut = new DisplayJAI(imageOut);
        
        // vou colocar as imagens em um painel com scroll
        JScrollPane scrollPaneIn = new JScrollPane(imagePanelIn);
        scrollPaneIn.setPreferredSize(new Dimension(320, 240));
        // agora vou colocar esse painel com scroll na Frame-janela da app
        frame.add(scrollPaneIn, BorderLayout.WEST);
        
        JScrollPane scrollPaneOut = new JScrollPane(imagePanelOut);
        scrollPaneOut.setPreferredSize(new Dimension(320, 240));
        frame.add(scrollPaneOut, BorderLayout.CENTER);
        
        JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
        Hashtable labels = new Hashtable();
        labels.put(new Integer(0), new JLabel("0"));
        labels.put(new Integer(255), new JLabel("255"));
        slider.setLabelTable(labels);
        slider.setPaintLabels(true);
        slider.addChangeListener(new SliderListener());
        slider.setEnabled(true);
        
        JPanel borderedPane = new JPanel();
        borderedPane.setLayout(new BorderLayout());
        borderedPane.setBorder(BorderFactory.createTitledBorder("Threshold"));
        borderedPane.add(slider, BorderLayout.NORTH);
        
        frame.add(borderedPane, BorderLayout.SOUTH);
        
        // apenas certificando que a janela morre ao se clicar no botao x
        frame.addWindowListener(
        new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            };
        });
        
        frame.pack();
        frame.show();
    }
    
    // inicializa variáveis
    private static void init() {
        low  = new double[1];
        high = new double[1];
        map  = new double[1];
        low[0]  = 0.0F;
        high[0] = 0.0F;
        map[0]  = 255.0F;
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if(args.length <1) {
            System.out.println("Enter a valid image file name");
            System.exit(0);
        } else {
            init();
            criaInterface("JAI Hello World", args[0]);
        }
    }
}
