Boa noite a todos,
Encontrei vários tópicos aqui no fórum falando sobre afins, mas nenhum que especifique a minha duvida.
Estou desenvolvendo uma aplicação que possui um campo de imagem; este campo deve possuir opção de zoom e surgiu a idéia de fazer no scrool do mouse, porém não consegui redimensionar a imagem e manter a posição onde o mouse se encontra, como no visualizador de imagens do windows ou adobePDF, deve dar zoom baseado no ponto onde o mouse se encontra
Se alguém puder ajudar com a posição da imagem na tela…
Olá,
Obrigado pela resposta;
Mas é exatamente o calculo para reposicionar a imagem que eu não estou conseguindo fazer, por exemplo, a imagem é de 100X100 e o ponto inicial da imagem está em 0,0, tendo o mouse em 10,20, dou zoom de 2x o início da imagem deve estar em algo em torno de -10,-20 e -5,-10;
e ao voltar o zoom sem mover o mouse o mouse deve estar em 10,20 e o início da imagem em 0,0.
porém ainda não consegui fazer o cálculo para que desse zoomIn e zoomOut corretamente.
É isso mesmo. O pixel (20,40) terá que se manter na posição (10,20). Portanto, o início da imagem estará em (-10, -20).
Agora, existem problemas de arredondamento. Então se você quiser que o zoom out e in sempre voltem no mesmo pixel, guarde a posição do pixel inicial em variáveis. Caso contrário, será impossível restaura-la em pixels ímpares.
Cara encontrei a sua classe JImagePanel e fiz algo mais ou menos como eu queria.
Só não sei se esta é a melhor forma de fazer isto, mas funciona, só falta implementar limite para o zoom e posicionamento no centro da tela quando o zoom for menor do que a janela.
[code]public class JImagePanel extends JPanel {
private BufferedImage background = null;
private int larg;
private int alt;
private int posX;
private int posY;
private final double ESCALA = 1.2;
public JImagePanel(BufferedImage img) {
if (img == null) {
throw new NullPointerException("Buffered image cannot be null!");
}
this.background = img;
this.larg = background.getWidth();
this.alt = background.getHeight();
this.posX = 0;
this.posY = 0;
}
public JImagePanel(File imgSrc) throws IOException {
this(ImageIO.read(imgSrc));
}
public JImagePanel(String fileName) throws IOException {
this(new File(fileName));
}
public void zoomIn(int x, int y) {
int vX = x - posX;
int vL = larg;
int vY = y - posY;
int vA = alt;
larg = (int) (larg * ESCALA);
alt = (int) (alt * ESCALA);
posX = (int) (x - (vX * larg / vL));
posY = (int) (y - (vY * alt / vA));
repaint();
}
public void zoomOut(int x, int y) {
int vX = x - posX;
int vL = larg;
int vY = y - posY;
int vA = alt;
larg = (int) (larg / ESCALA);
alt = (int) (alt / ESCALA);
posX = (int) (x - (vX * larg / vL));
posY = (int) (y - (vY * alt / vA));
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(background, posX, posY, larg, alt, this);
}
Lógico que a melhor forma de fazer o zoom out é armazenando os valores a posição de inicio da imagem;
Dessa forma a imagem não retorna na mesma proporção em função do arredondamento, mas achei interessante fazer assim.