Processamento Lento do Programa

3 respostas
K

olá, estou com um pequeno problema no meu programa, estou desenvolvendo um aplicativo para processamento de imagens, e ao abrir uma imagens, desenvolvi um codigo para redimensionar a mesma caso a imagem seja maior q a tela do programa, mas após isso meu programa esta ficando com um leve delay, eu imagino q seja pelo if e whiles que o codigo possui, segue abaixo o codigo, se alguem souber alguma outra força de redimensionar a imagem proporiconalmente ou otimizar esse meu codigo eu agradeço.

public void paintComponent(Graphics g) {
                super.paintComponent(g);
                desenha(g);
            }
private void desenha(Graphics g){
        /* Função tá muito lenta!!*/
        
        int imgLargura = jPanel1.getWidth();
        int imgAltura = jPanel1.getHeight();
        if(imagem!=null){          
        Double novaImgLargura = (double) imagem.getWidth();  //imagem é a imagem aberta pelo programa
        Double novaImgAltura = (double) imagem.getHeight();  
  
        Double imgProporcao = null;  
        if (novaImgLargura >= imgLargura) {  
            imgProporcao = (novaImgAltura / novaImgLargura);  
            novaImgLargura = (double) imgLargura;  
            novaImgAltura = (novaImgLargura * imgProporcao);  
            while (novaImgAltura > imgAltura) {  
                novaImgLargura = (double) (--imgLargura);  
                novaImgAltura = (novaImgLargura * imgProporcao);  
            }  
        } else if (novaImgAltura >= imgAltura) {  
            imgProporcao = (novaImgLargura / novaImgAltura);  
            novaImgAltura = (double) imgAltura;  
            while (novaImgLargura > imgLargura) {  
                novaImgAltura = (double) (--imgAltura);  
                novaImgLargura = (novaImgAltura * imgProporcao);  
            }  
        }                 
            
            int x = (jPanel1.getWidth() - imagem.getWidth()) / 2;
            int y = (jPanel1.getHeight() - imagem.getHeight()) / 2;
            if(imagem.getWidth() <= jPanel1.getWidth() || imagem.getHeight() <= jPanel1.getHeight() ){
             g.drawImage(imagem.getScaledInstance(novaImgLargura.intValue(), novaImgAltura.intValue(), 100), x, y, imagem.getWidth(), imagem.getHeight(), null);
            }
            else {
             g.drawImage(imagem.getScaledInstance(novaImgLargura.intValue(), novaImgAltura.intValue(), 100), 0, 0, jPanel1.getWidth(), jPanel1.getHeight(), null);
            }
            
           g.dispose();
           jPanel1.repaint();
        }
            
    }

3 Respostas

M

Cara eu entendi. Mas preciso que voce me explique o que voce pensou em fazer, qual foi a formula de redimensão? Pode ser os whiles mas dependendo do que você pensou poderia ser feito de outra forma.
Dependendo nao precisa desses while você pode redimensionar de uma vez.

K

eu pensei da forma que toda vez q o panel onde a imagem ficara for redimensionado a imagem pode ser redimensionada, no codigo ele utilizada a largura e altura do panel como limite e redimensiona a imagem baseado na proporção ( imgProporcao = (novaImgAltura / novaImgLargura); ), e pelo while foi a forma q eu achei de ir redimensionando ate chegar ao ponto certo, essa função fica atualizando o panel toda vez q o mesmo eh redimensionado.

no final de tudo, oq eu procuro eh uma função para redimensionar com proporção a imagem, n perder a resolução, no panel q eu gerei

TerraSkilll
Kileros Se for trabalhar com desenho em cima de componentes Swing (como o JPanel), recomendo o uso de Java2D, que tem muitos mais ferramentas para essa finalidade, inclusive permitindo transformações nos elementos a serem desenhados. Como a alteração de escala, que é o que você precisa. Veja o exemplo:
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.awt.geom.AffineTransform;

public class TesteRed extends JFrame {
    public TesteRed() {
    	this.setPreferredSize(new Dimension(200,200));
    	this.setSize(200,200);
    	this.getContentPane().add(new Painel());
    	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String args[]){
    	new TesteRed().setVisible(true);
    }

	class Painel extends JPanel{
		private BufferedImage imagem;

		public Painel(){
			try{
				imagem = ImageIO.read(new File("fo.png"));
			}catch(IOException e){
				JOptionPane.showMessageDialog(null, "Erro ao carregar imagem");
			}
		}

		protected void paintComponent(Graphics g){
			Graphics2D g2 = (Graphics2D) g.create(); // cria um objeto Graphics2D a partir do Graphics do JPanel

			double fatorw = ((double) this.getWidth()) / ((double) imagem.getWidth()); // fator de conversão para largura (width)
			double fatorh = ((double) this.getHeight()) / ((double) imagem.getHeight());  // fator de conversão para altura (height)
			double fator = fatorh > fatorw ? fatorw : fatorh; // pega o menor fator

			AffineTransform sat = g2.getTransform(); // guarda transformações originais

			AffineTransform at = new AffineTransform(); // cria uma transformação 

			at.scale(fator, fator); // altera a escala na transformação

			g2.transform(at); // aplica a transformação ao desenho

			// desenha a imagem
			g2.drawImage(imagem, (int) 10, (int) 10, (int) imagem.getWidth(), (int) imagem.getHeight(), null);

			g2.setTransform(sat);// restaura transformações originais

			g2.dispose(); // libera o objeto Graphics2D
		}
	}
}
Abraço.
Criado 24 de junho de 2013
Ultima resposta 25 de jun. de 2013
Respostas 3
Participantes 3