Como redimensionar uma imagem importada do JFileChooser para um JLabel

7 respostas
D

Bom dia pessoal, minha dúvida é a seguinte, preciso de redimensionar a imagem sem que aumente o JFrame ou desloque os componentes próximos!
Consegui redimensionar automaticamente do tamanho que eu quiser, mas mesmo em tamanhos menores o meu JFRame acaba alterando seu tamanho.

JFileChooser fileChooser = new JFileChooser();  
        fileChooser.setDialogTitle("Escolha a Imagem"); 
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
  
        LFoto.setVisible(true);  
        
            if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)  
        {  
             File arquivo = fileChooser.getSelectedFile();//arquivo  
           BufferedImage bi = null;

                bi = ImageIO.read(arquivo);

            BufferedImage aux = new BufferedImage(100, 80, bi.getType());
            Graphics2D g = aux.createGraphics();
            AffineTransform at = AffineTransform.getScaleInstance((double) 100 / bi.getWidth(), (double) 80 / bi.getHeight());
            g.drawRenderedImage(bi, at);
            LFoto.setIcon(new ImageIcon(aux));  
            LFoto.setText(null);
         }

Desde já agradeço a todos pelas ajudas!

7 Respostas

Ironlynx

Vc tá fazendo isso dinamicamente?Tipo escolhe-e-muda toda hora?

Pode fazer algo + ou - assim:

File file = fc.getSelectedFile();//
                	 imagem=new ImageIcon(file.getPath());//pega o caminho da imagem
               	     novaImagem=new ImageIcon(imagem.getImage().//pega a imagem com novo tam
                                          getScaledInstance(90, -1, Image.SCALE_DEFAULT));
                      
                        atualizaLabel(novaImagem);//método que atualiza sua IMG no JLabel
                        repaint();   //atualiza o JLabel com a img selecionada
   //Limpa o File Chooser para a próxima vez que for mostrado .
                fc.setSelectedFile(null);

seu atualizaLabel:

//método responsável por atualizar a imagem q é mostrada no rótulo private void atualizaLabel(ImageIcon icon){ img.setIcon(icon); //img é seu JLabel if (icon != null) { img.setText(null); //img é seu JLabel } else { img.setText("Imagem não disponível!"); } }
E não se esqueça do paintComponent:

<blockquote>

protected void paintComponent(Graphics g) {

//novaImagem é um ImageIcon

if (novaImagem != null) {

int x = getWidth()/2 - novaImagem.getIconWidth()/2;

int y = getHeight()/2 - novaImagem.getIconHeight()/2;
if (y &lt; 0) {
            y = 0;
        }

        if (x &lt; 5) {
            x = 5;
        }
        novaImagem.paintIcon(this, g, x, y);
    }
} </blockquote>

Recomendo uma olhada no ImageIcon do ViniGodoy aqui:
http://www.guj.com.br/java/56248-jimagepanel---funciona-uma-unica-vez-pq-resolvido
:wink:

ViniGodoy

Tópico movido para o fórum de interface gráfica.

D

Desculpem, mas acho que não me expressei corretamente; seria assim o que preciso, é que estou construindo um cadastro com vários dados e também gostaria de armazenar a foto do individuo cadastrado, mas ao selecionar pelo JFilechooser, e setá-lo por um JLabel dentro de um JPanel este que está alterando o tamanho de seu layout, queria que ao setar a foto no JLabel, o JPanel pudesse permanecer do seu tamanho original.

Desculpem, mas é que iniciei faz pouco tempo em Java! Mas valeu a todos que continuam a me ajudar!

Ironlynx

Diego_Microfenix,
o código que eu postei acima ajuda a redimensionar a imagem de JLabel.Mas se vc quer controle mesmo sobre o redimensionamento, use o código do JImagePanel do ViniGodoy no link que eu postei acima(chamei errôneamente de ImageIcon) :wink:

Wesllen

Testa esse código:

public void imagemLabel() {
    ...
    String arquivo = fileChooser.getSelectedFile().getAbsolutePath();
    BufferedImage imagem = ImageIO.read(arquivo);
    label.setIcon(new ImageIcon(redimencionar(imagem, 64, 64)));
    ...
}

public Image redimencionar(Image imagem, Integer width, Integer heigth) {
    return imagem.getScaledInstance(width, heigth, Image.SCALE_DEFAULT);
}
D

Bom dia pessoa, estou agora tentando usar esta classe do JImagePanel, tentei implementar no meu evento, compila mas ainda não exibe a imagem no JPanel que já está no JFrame;
segue meu código no evento:

JFileChooser fileChooser = new JFileChooser(); 
        fileChooser.setDialogTitle("Escolha a Foto"); 
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
   
         
            if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)  
        
            {  
             File arquivo = fileChooser.getSelectedFile();
             BufferedImage bi =ImageIO.read(arquivo);
             BufferedImage aux = new BufferedImage(100, 80, bi.getType());
             Graphics2D g = aux.createGraphics();
             AffineTransform at = AffineTransform.getScaleInstance(WIDTH, WIDTH);
           
             JImagePanel PFoto = new JImagePanel (aux);
             g.drawRenderedImage(bi, at);
             PFoto.setImage(aux);

            }
D

Bom, modifiquei meu código novamente, acho que agora estou no caminho certo! Mas ainda não consigo apresentar a imagem selecionada no JImagePanel dentro do meu JPanel!!!
Segue meu código:

JFileChooser fileChooser = new JFileChooser();  
        fileChooser.setDialogTitle("Escolha a Foto"); 
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
 
             if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)  
            {  
               File arquivo = fileChooser.getSelectedFile();
               BufferedImage bi =ImageIO.read(arquivo); 


               JImagePanel PainelFoto = new JImagePanel(bi);
               PFoto.add(PainelFoto, BorderLayout.CENTER);
Criado 1 de setembro de 2012
Ultima resposta 4 de set. de 2012
Respostas 7
Participantes 4