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);
}
[code]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();
}
}[/code]
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.
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
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:
[code]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
}
}
}[/code]
Abraço.