Exibir imagem, gravar no banco (MySql) e recuperá-la? Tentei usar classe de ViniGodoy

8 respostas
alexandre.ribeiro

Boa tarde pessoal,
Estou desenvolvendo uma aplicação em que preciso exibir na tela a imagem da pessoa (que busco usando JFileChooser) e de sua impressão didital captada pelo leitor biométrico e armazená-las no banco. Porém, NÃO consegui nem exibila na tela ainda, então, será que poderiam me ajudar??

Dei uma olhada no Post indicado por ViniGodoy ([url]http://intelectolivre.blogspot.com/2008/07/exibindo-gravando-e-recuperando-imagens.html[/url]) mas não consegui fazer funcionar, se vc, Vini, ou qualquer outro puder me ajudar ficarei muito agradecido, pois é para o meu TCC.

Para a exibição da Imagem tenho a seguinte classe:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.TexturePaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private BufferedImage image = null;
    // Abaixo você define como a imagem será pintada no JPanel...
    // Nesse caso, o padrão é o redimensionamento da imagem calculando
    // o ASPECT RATIO da mesma e centralizando-a no JPanel...
    private FillType fillType = FillType.RESIZE;
    //private FillType fillType = FillType.ASPECT_RATIO_CENTER;

    public ImagePanel() {
    }

    public ImagePanel(BufferedImage img) {
        setImage(img);
    }

    public ImagePanel(File imgSrc) throws IOException {
        this(ImageIO.read(imgSrc));
    }

    public ImagePanel(String fileName) throws IOException {
        this(new File(fileName));
    }

    public final void setImage(BufferedImage img) {
        if (img == null) JOptionPane.showMessageDialog(null,"Sem imagem para processar!");
        this.image = img;
        invalidate();
    }

    public void setImage(File img) throws IOException {
        setImage(ImageIO.read(img));
    }

    public void setImage(String fileName) throws IOException {
        setImage(new File(fileName));
    }

    public BufferedImage getImage() {
        return image;
    }

        @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        fillType.drawImage(this, g2d, image);
        g2d.dispose();
    }

    public FillType getFillType() {
        return fillType;
    }

    public void setFillType(FillType fillType) {
        if (fillType == null) JOptionPane.showMessageDialog(null,"Saída inválida!");
        this.fillType = fillType;
        invalidate();
    }

    public static enum FillType {
        // redimensiona a imagem para a dimensão do JPanel...
        RESIZE {
            public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
                g2d.drawImage(image, 0, 0, panel.getWidth(), panel.getHeight(), null);
            }
        },
        // mantém o tamanho natural da imagem e a centraliza no JPanel...
        CENTER {
            public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
                int left = (panel.getHeight() - image.getHeight()) / 2;
                int top = (panel.getWidth() - image.getWidth()) / 2;
                g2d.drawImage(image, top, left, null);
            }
        },
        // caso a imagem seja menor que o JPanel, a coloca lado a lado...
        SIDE_BY_SIDE {
            public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
                Paint p = new TexturePaint(
                image, new Rectangle2D.Float(0, 0, image.getWidth(), image.getHeight()));
                g2d.setPaint(p);
                g2d.fillRect(0, 0, panel.getWidth(), panel.getHeight());
            }
        },
        // calcula o aspect ratio da imagem e a pinta no JPanel no eixo (0,0)...
        ASPECT_RATIO {
            public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
                int larguraImg = image.getWidth();
                int alturaImg = image.getHeight();
                int largura = 0, altura = 0;
                double aspectoImg =
                (double) larguraImg / (double) alturaImg;
                double aspectoPanel =
                (double) panel.getWidth() / (double) panel.getHeight();

                if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
                    if (aspectoImg == aspectoPanel) {
                        largura = panel.getWidth();
                        altura = panel.getHeight();
                    }
                    if (aspectoImg > aspectoPanel) {
                    largura = panel.getWidth();
                    altura = (largura * alturaImg) / larguraImg;
                    }
                    if (aspectoImg != aspectoPanel) {
                        altura = panel.getHeight();
                        largura = (altura * larguraImg) / alturaImg;
                    }
                } else {
                    largura = image.getWidth();
                    altura = image.getHeight();
                }
                g2d.drawImage(image, 0, 0, largura, altura, null);
            }
        },
        // calcula o aspect ratio da imagem e a pinta no JPanel, centralizando-a...
        ASPECT_RATIO_CENTER {
            public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
                int larguraImg = image.getWidth();
                int alturaImg  = image.getHeight();
                int largura    = 0, altura = 0;
                double aspectoImg   = (double) larguraImg / (double) alturaImg;
                double aspectoPanel = (double) panel.getWidth() / (double) panel.getHeight();

                if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
                    if (aspectoImg == aspectoPanel) {
                        largura = panel.getWidth();
                        altura  = panel.getHeight();
                    }
                    if (aspectoImg > aspectoPanel) {
                        largura = panel.getWidth();
                        altura  = (largura * alturaImg) / larguraImg;
                    }
                    if (aspectoImg != aspectoPanel) {
                        altura  = panel.getHeight();
                        largura = (altura * larguraImg) / alturaImg;
                    }
                } else {
                   largura = image.getWidth();
                   altura = image.getHeight();
                }
                int left = (panel.getHeight() - altura) / 2;
                int top = (panel.getWidth() - largura) / 2;

                g2d.drawImage(image, top, left, largura, altura, null);
            }
        };

        public abstract void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image);
    }
}
na minha classe principal tenho as variáveis globais:
private ImageFileChooser imagePrev = null;
private JFileChooser fc = new JFileChooser();
private ImagePanel quadroImagem = null;
private BufferedImage img;
e no evento do botão de capturar tenho:
private void jbCapturar1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        if (imagePrev == null)
            imagePrev = new ImageFileChooser(fc);
        // adiciona a nova funcionalidade de preview...
        fc.setAccessory(imagePrev);
        if (fc.showOpenDialog(this) == JFileChooser.CANCEL_OPTION)
            return;
        try{
            // cria um objeto do tipo BufferedImage do arquivo selecionado...
            img = ImageIO.read(new File(fc.getSelectedFile().getAbsolutePath()));
            // inicia o processo para reescrever o método paintComponent do JPanel...
            if (quadroImagem == null)
                quadroImagem = new ImagePanel(img);
            quadroImagem.setImage(img);
            
            painelImagem.add(quadroImagem); // painelImagem é do tipo JPanel
            painelImagem.repaint();
            painelImagem.validate();
        } catch (IOException e) {
            javax.swing.JOptionPane.showMessageDialog(this, "Não foi possível ler a imagem!");
        }
    }
MAS NÃO ACONTECE NADA quando abro a Imagem pelo JFileChooser.

Poderiam me ajudar??? Uso NetBeans 6.9.1
Obrigado!!

8 Respostas

ViniGodoy

Em que local da sua tela o painelImagem está inserido? Tem certeza que tem espaço o suficiente?

alexandre.ribeiro

Tem sim, segue abaixo a imagem de onde ele está inserido (segue o link pq não consegui colocá-la aki):

http://www.flickr.com/photos/59260274@N05/[telefone removido]/

e quando clico em OK no JFileChooser não apareece nada.

ViniGodoy

O add da linha 16 não deveria estar sendo dado novamente. Você só deve colocar o quadroImagem na tela na hora que ela é criada. Depois, só altere sua imagem.
O JImagePanel correto está no projeto Tower (link na minha assinatura).

alexandre.ribeiro

ViniGodoy:
O add da linha 16 não deveria estar sendo dado novamente. Você só deve colocar o quadroImagem na tela na hora que ela é criada. Depois, só altere sua imagem.
O JImagePanel correto está no projeto Tower (link na minha assinatura).

Vini, me desculpe tamanha ignorância, mas como assim o add deveria estar sendo dado novamente? a cada vez que o usuário clicar em Capturar ele dará o add.
Poderia detalhar melhor o que disse a respeito de colocar o quadroImagem na tela na hora que ela é criada, e depois alterar, porque não foi o que fiz não?

if (quadroImagem == null) quadroImagem = new ImagePanel(img); quadroImagem.setImage(img);

Obrigado pela atenção! Baixei o towel-v1.0.jar e vou começar a usar a classe JImagePanel.

ViniGodoy

Eu não disse que teria que ser dado. Falei justamente ao contrário, que ele não deveria ser dado duas vezes. A linha 16 deveria estar dentro daquele seu if ali em cima, logo abaixo da linha 13.

Também não é necessário chamar repaint() e revalidate().

Qual é o gerenciador de layout do painelImagem? Tente cria-lo como BorderLayout e colocar a imagem no center:

Na hora de criar:

Na hora de usar:

alexandre.ribeiro
Continuo sem sucesso. Alterei como disse, Vini, mas continua não aparecendo a imagem. Segue o código alterado:
try{
            // cria um objeto do tipo BufferedImage do arquivo selecionado...
            img = ImageIO.read(new File(fc.getSelectedFile().getAbsolutePath()));
            // inicia o processo para reescrever o método paintComponent do JPanel...
            if (quadroImagem == null) {
                quadroImagem = new ImagePanel(img);
                painelImagem.add(quadroImagem, BorderLayout.CENTER);
            }
            quadroImagem.setImage(img);

        } catch (IOException e) {
            javax.swing.JOptionPane.showMessageDialog(this, "Não foi possível ler a imagem!");
        }
E também fiz como disse:
JPanel painelImagem = new JPanel(new BorderLayout());

Fiquei sabendo que um colega que estuda comigo (adriano kahn - membro do Fórum) conseguiu fazer isso com JLabel. Se não conseguir com JPanel vou ver com ele hj à noite como fez.

ViniGodoy

Para fazer com label, é só usar o método setIcon.

Muito estranho, deveria estar funcionando. Tem certeza que a imagem está sendo carregada corretamente?

alexandre.ribeiro

ViniGodoy:
Para fazer com label, é só usar o método setIcon.

Muito estranho, deveria estar funcionando. Tem certeza que a imagem está sendo carregada corretamente?


Está sim! também achei muito estranho. Vou ver se faço com Jlabel mesmo.
Obrigado pela atenção, Vini.

Criado 8 de fevereiro de 2011
Ultima resposta 9 de fev. de 2011
Respostas 8
Participantes 2