Tabalhando com imagens - Swing

Olá galera,

Estou precisando trabalhar com imagens em swing, fazer coisas simples, apenas de visualização, nada de edição, basicamente dar zoom e rotacionar. Gostaria de saber se alguém já precisou disso e o que fez? Procurou um framework de visualização que já tinha tudo pronto ou desenvolveu seus próprios métodos para dar zoom e rotacionar a imagem?? Alguém conhece alguma biblioteca que tipo eu passo o objeto Image pra ela e digo pra ela dar “Zoom in” e ela se vire??

Desde já agradeço…

Abraços…

Danilo

Já precisei reduzir o tamanho de imagens e achei um código legal na internet. Mas o código está em casa, depois eu te passo. Isso vai resolver a parte do zoom…

Se por acaso vc for utilizar a imagem sendo desenhada diretamente em um panel, da uma olhada que esse tópico pode te ajudar: http://www.guj.com.br/posts/list/106137.java#575204

eu ainda não estou utilizando nada, estou dando uma pesquisada primeiro antes de começar a fazer alguma coisa… mas se fosse fazer acho q utilizaria a imagem dentro de um JLabel mesmo, será que não é melhor??

Abração…

Danilo

O Java2D já tem suporte a redimensionamento e rotação de imagens.

Isso pode ser feito de 2 formas:

  1. Alterando a matriz de transformação, na hora de desenhar a imagem. Nesse caso, veja o método setTransform da classe Graphics e os métodos estáticos da classe AffineTransform;
  2. Usando o método draw, também da classe Graphics, que recebe como parâmetro o tamanho da imagem no destino. Esse método é muito prático para redimensionar a imagem, ou desenhar apenas uma parte dela.

[quote=ViniGodoy]O Java2D já tem suporte a redimensionamento e rotação de imagens.

Isso pode ser feito de 2 formas:

  1. Alterando a matriz de transformação, na hora de desenhar a imagem. Nesse caso, veja o método setTransform da classe Graphics e os métodos estáticos da classe AffineTransform;
  2. Usando o método draw, também da classe Graphics, que recebe como parâmetro o tamanho da imagem no destino. Esse método é muito prático para redimensionar a imagem, ou desenhar apenas uma parte dela.[/quote]

Valeu ViniGodoy, vou estudar essas classes…

Danilo

Dá uma olhadinha aqui no JImagePanel, pq ele faz redimensionamento:
http://www.guj.com.br/posts/list/56248.java#295271

[quote=ViniGodoy]Dá uma olhadinha aqui no JImagePanel, pq ele faz redimensionamento:
http://www.guj.com.br/posts/list/56248.java#295271[/quote]

opa… mto bacana… já vou utilizar… vlw…

Danilo

Galera,

consegui fazer a parte do zoom tranquilo, a questão de girar a imagem 90º eu achei um exemplo só que ele só funciona quando a imagem é quadrada, se pegar uma imagem retângular ele corta a imagem, não sei o que estou fazendo de errado… segue o código…

Esse código é para girar a imagem 90º:

[code]AffineTransform tx = new AffineTransform();
tx.rotate(Math.toRadians(90), img.getWidth(null)/2, img.getHeight(null)/2);

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
bufferedImage = op.filter(bufferedImage, null);[/code]
Abraços…

Crie uma nova imagem, e rotacione sobre ela:

    public BufferedImage rotate90(BufferedImage original)
    {        
        BufferedImage destino = new BufferedImage(original.getHeight(), original.getWidth(), original.getType());
        Graphics2D g2d = destino.createGraphics();        
        g2d.drawImage(original, AffineTransform.getRotateInstance(Math.toRadians(90)), null);
        g2d.dispose();
        return destino;
    }

A nova imagem tem que ter a largura e altura invertidas em relação a imagem original.

[quote=ViniGodoy]Crie uma nova imagem, e rotacione sobre ela:

    public BufferedImage rotate90(BufferedImage original)
    {        
        BufferedImage destino = new BufferedImage(original.getHeight(), original.getWidth(), original.getType());
        Graphics2D g2d = destino.createGraphics();        
        g2d.drawImage(original, AffineTransform.getRotateInstance(Math.toRadians(90)), null);
        g2d.dispose();
        return destino;
    }

A nova imagem tem que ter a largura e altura invertidas em relação a imagem original.[/quote]

ViniGodoy usei o seu método mas a nova imagem ficou toda preta, o tamanho ficou certinho, só que a imagem desaparece e fica tudo preto, tem alguma idéia do q seja?

Abraços…

Ah, desculpe, tem razão.

O problema é que precisamos rotacionar a imagem em torno de seu centro, não de seu canto superior esquerdo.

Isso também gerará uma imagem com espaços pretos de sobra (referentes ao que for maior, altura ou lagura). Por isso, é também necessário desenhar imagem em relação ao seu centro. Você ajusta isso definindo uma translação na imagem, antes do desenho.

Dá uma olhada no método agora:

    public static BufferedImage rotate90(BufferedImage original) {
        if (original == null)
            throw new IllegalArgumentException("Forneça uma imagem original!");

        BufferedImage dest = new BufferedImage(
                original.getHeight(), 
                original.getWidth(), 
                original.getType());
        
        Graphics2D surface = dest.createGraphics();

        AffineTransform rotation = new AffineTransform();
        //Vamos desenhar a imagem em relação ao centro
        rotation.setToTranslation(
                (dest.getWidth() - original.getWidth()) / 2.0,
                (dest.getHeight() - original.getHeight()) / 2.0);
        
        //Também vamos rotacionar em relação ao centro
        rotation.rotate(
                Math.toRadians(90), 
                original.getWidth()/2.0, 
                original.getHeight()/2.0);
        
        //Definimos a matriz de transformação
        surface.transform(rotation);
        
        //Desenhamos a imagem
        surface.drawImage(original, 0, 0, null);
        surface.dispose();

        return dest;
    }

Para entender mais sobre matrizes de transformação dá uma lida em:
http://vinigodoy.wordpress.com/2008/02/17/transformacoes/
http://vinigodoy.wordpress.com/2008/02/26/aplicando-as-transformacoes/

Os artigos tratam de OpenGL, mas o conceito é o mesmo no Java2D e será o mesmo no DirectX também.

valeu cara… brigadão… deu certo… :lol: :lol: :lol: vou dar uma olhada nesses links que você me passou pra mim tentar entender o que foi feito… mas esse negócio de trabalhar com imagem é fróid pra caramba… mto complicado… hehehe… valeu mesmo… quebrou um galhão…

abração…