Trabalhando com Imagens ( Carregar, criar graphics2D e mostrar na tela)

22 respostas
SirDominque

Oi gente,
Então, com a ajuda dos amigos do fórum consegui criar linhas 2D na tela, Curvas, retangulo, consegui pintar meu retangulo o.o !!!

Agora estou querendo pegar uma imagem e desenhar ela na tela!
Não sei se devo usar o jFrame novamente ,ou se tem um outro jeito mas fácil sem override e supress warnings.

Enfim,Vou postar aqui o código, e voces me falam se tem jeito ou se é um caso perdido rsrsrsrsr

package Java2D;

import java.*;
import java.awt.Image;
import java.awt.*;
import java.awt.geom.Line2D;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;



public class Drawn_2D {
    
        public static Image img;
         public static Graphics2D g2;
         private static javax.swing.JFrame j;
         protected static int iii;
    
    public static void main(String args[])
    {
        CarregImg();
        DesenhandoIMG();
        
    }
    
public static void CarregImg()
{
   try {
        BufferedImage image = ImageIO.read(new File("ace.png"));
        
        } 
   
   catch (IOException e) 
   {
       
       System.out.println("Erro:" + e.getMessage());
       iii = iii + 1;
   }
   if ( iii > 0 )
   {
       System.out.println("Erro Desconhecido ao carregar Imagem");
   }
    
}

public static void DesenhandoIMG()
{
   
    //Criamos uma imagem de 640x480 pixels?
    BufferedImage aceimg = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);
  
    //Cria o G2D da imagem!
    Graphics2D g2d = aceimg.createGraphics();
    
   //Libera da memória ?
    g2d.dispose();
}


    
    
    
}

Foi o máximo que consegui fazer.

Estou seguindo o tutorial : http://www.pontov.com.br/site/java/48-java2d/111-trabalhando-com-imagens

Aguardo voces o.o

22 Respostas

ViniGodoy

Se você quer desenhar uma imagem na tela, você deve usar o método drawImage, do Graphics2D do JFrame.

O Graphics da imagem serve para se desenhar em cima da imagem.

PS: Esqueça códigos estáticos. COmo já te falei, para desenhar na tela, tem que ter uma tela! (JFrame)

SirDominque

OK, vou copiar o código de antes e tentar desenhar a partir dele!

Viny, deixa eu te perguntar tbm, Eu posso desenhar essas coisas em jInternalFrame ?

ViniGodoy

Sim, mas no caso dele, sobrescreve-se o método paintComponent. Em outros componentes, como o JPanel, também.

SirDominque

Viny, deu um erro cabulosooooo aqui xD , o programa comecou a retornar um spam de JOptionpane : erro, erro, erro

O que estou fazendo de errado ?
package Java2D;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;  
import javax.swing.JOptionPane;

/**
 *
 * @author André Vinícius Lopes
 */

@SuppressWarnings("serial")  
public class DrawningSpriteVG extends JFrame   
{  
    
    public DrawningSpriteVG() 
    {  
        super("DrawningSpriteVG");
        setSize(800,600);  
        setLocationRelativeTo(null);  
    }  
      
    @Override  
    public void paint(Graphics g) 
    {  
        Graphics2D g2d = (Graphics2D) g.create();  
        
        
        try {
            //Desenhar e pintar aqui!
            BufferedImage image = ImageIO.read(new File("ace.png"));
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null,"Error I/O \n Erro:" + ex.getMessage());
            System.out.println("Erro de I/O ao carregar Imagem");
        }
        
        BufferedImage aceimg = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);
        
        
        //Cria o G2D da imagem!
        Graphics2D g2i = aceimg.createGraphics();
        
        g2i.draw(null);
        
        
     }  
      
    
    
    public static void main(String[] args) 
    {  
        DrawningSpriteVG janela = new DrawningSpriteVG();  
        janela.setVisible(true); 
    }  
    
    
    
    
}
ViniGodoy
  1. Não se carrega coisas dentro do método paint. Ele é chamado sempre que sua janela for repintada;
  2. Você ainda não está usando o método drawImage para desenhar a imagem no frame;
  3. Provavelmente ele não encontrou o arquivo da imagem.
  4. Você não precisa criar um BufferedImage com new, nem chamar o método createGraphics() das imagens. O processo para pintar imagem é o mesmo do que para pintar linha.

Mas ao invés do drawLine, você vai chamar o drawImage, e passar a imagem como parâmetro:

g2d.drawImage(imagem, 0, 0, null); //Desenha uma imagem na posição 0,0
ViniGodoy

Fiz um exemplo. Veja como ficou parecido com o da linha, que postei para você.

SirDominque

valeu Viny! Acho que agora estou conseguindo... ele realmente não estava achando a imagem, agora ele acha mas nao sai nada na tela:

package Java2D;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;  
import javax.swing.JOptionPane;

/**
 *
 * 
 */

@SuppressWarnings("serial")  
public class DrawningSpriteVG extends JFrame   
{  
    public static int ioe;
    
    public DrawningSpriteVG() 
    {  
        super("DrawningSpriteVG");
        setSize(800,600);  
        setLocationRelativeTo(null);  
    }  
      
    @Override  
    public void paint(Graphics g) 
    {  
        Graphics2D g2d = (Graphics2D) g.create();  
      
        
        
    }
      
    
    
    public static void main(String[] args) 
    {  
        DrawningSpriteVG janela = new DrawningSpriteVG();  
        janela.setVisible(true); 
        VGLoading();
    }  
    
    
    public static void VGLoading()
    {
        try 
        {
            BufferedImage image = ImageIO.read(new File("ace.png"));
            BufferedImage aceimg = new BufferedImage(640, 480, Image.SCALE_AREA_AVERAGING); 
            Graphics2D g2i = aceimg.createGraphics(); 
        
            g2i.drawImage(image, 640, 200, null);       
                    
        } 
        
        catch (IOException ex)
        { System.out.println("I/O Error:" + ex.getMessage());}
       
       
        
        
        
        
    }
    
    
    
    
}
ViniGodoy

Veja o exemplo que postei para você…

O draw, como já te falei antes, deve ficar dentro do método paint.
E, como já repeti duas vezes, você não vai usar o método createGraphics() da imagem.

SirDominque

Ahh Desculpa. Eu vi o Exemplo, agora estou entendendo! Vou mexer no código , qualquer coisa eu posto aqui

vlw Viny

SirDominque

Blz Viny, agora essa parte de salvar uma imagem em cima de outra imagem… como eu faria?
Pra salvar é sussegado, o problema é entender essa parte… o resto ja entendi!

Agora vou seguir o resto do tutorial :

Só falar Viny, antes de eu ir pro tópico de animação, seria melhor eu fazer a imagem se mover na tela né? Ao apertar cada seta, a imagem se mover pra cima,direita ,esquerda.

O que voce me recomenda ?

ViniGodoy

A imagem se mover é animação.

Vc está mexendo com imagens para fazer algum game? Se for, recomendo que não use Java.

SirDominque

Não tem problema, o game é só uma desculpa pra aprender mais com java!

Antes de eu ir pra animação, eu tenho que aprender a inserir imagens em qualquer janela… e sobrepor elas… Igual dito no tutorial…

Fora o jFrame, aonde mais posso criar imagens ? Qual o mais simples e o mais complexo ?

Vlw Viny… só vc mesmo auhasuhusahuashuash

ViniGodoy

Em qualquer componente, inclusive Applets.

O processo é basicamente o mesmo. Então, não dá para dizer que nada é mais complexo.

Um tutorial legal de seguir é esse aqui:
http://www.cokeandcode.com/info/tut2d.html

SirDominque

Vou seguir ele e usar outros também… Só uma duvida… o netbeans tem varios itens pra colocar na interface,por exemplo, jButton,jTextArea,etc… tem algum aplicativo que traz mais items?

Acho que por hoje é só uahuashuasha

ViniGodoy

Não faço idéia. Geralmente uso o eclipse para programar. E também não dependo tanto do construtor visual assim.

SirDominque

Viny, como faco pra mudar a posição x,y da imagem? Estou procurando métodos aqui no netbeans mas não há!

O código que eu estou usando é o mesmo que voce me passou.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Java2D;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class JFrameComImagem extends JFrame
{
	private BufferedImage img; 
	public JFrameComImagem(BufferedImage img) 
        {
		super("JFrame com imagem");
		setSize(800,600);
		setLocationRelativeTo(null);
		this.img = img;		
	}
	
	@Override
	public void paint(Graphics g) {
		Graphics2D g2d = (Graphics2D) g.create();		
		g2d.drawImage(img, 100, 100, null);
		g.dispose();
	}
	
	public static void main(String[] args) 
        {		 
		try {
			BufferedImage img = ImageIO.read(JFrameComImagem.class.getResourceAsStream("ace.png"));
			new JFrameComImagem(img).setVisible(true);
		} catch (IOException e) {
			System.out.println("Não foi possível carregar a imagem.");
		} catch (IllegalArgumentException e) {
			System.out.println("Imagem não encontrada!");
		}
	}
        
        public void getXYZ()
        {
          
        }
        
        
        
}

Pode me ajudar?

ViniGodoy

Aquele 100,100 no comando drawImage é a posição x e y da imagem.

SirDominque

Eu sei, mas eu quero mudar ela de lugar... consegui fazer uma coisa aqui... mas eu preciso instanciar meu método no Main e nao estou conseguindo.... Estou lendo uns tutoriais mas nada ainda....

da uma olhada :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Java2D;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import org.ietf.jgss.GSSContext;

@SuppressWarnings("serial")
public class JFrameComImagem extends JFrame
{
        
	private BufferedImage img; 
	public JFrameComImagem(BufferedImage img) 
        {
		super("JFrame com imagem");
		setSize(800,600);
		setLocationRelativeTo(null);
		this.img = img;		
	}
	
	@Override
	public void paint(Graphics g) {
		Graphics2D g2d = (Graphics2D) g.create();		
		g2d.drawImage(img, 100, 100, null);
		g.dispose();
                
	}
        
        
        public void gXYZ()
        {
        Graphics2D g = img.createGraphics();
              g.drawLine(50, 25, 30, 40);      
            
            
          
        }
	
	public static void main(String[] args) 
        {		 
		try {
			BufferedImage img = ImageIO.read(JFrameComImagem.class.getResourceAsStream("ace.png"));
			new JFrameComImagem(img).setVisible(true);
		} catch (IOException e) {
			System.out.println("Não foi possível carregar a imagem.");
		} catch (IllegalArgumentException e) {
			System.out.println("Imagem não encontrada!");
		}
             
                gXYZ gx = new gXYZ();
                //Erro....
            
	}
        
        
        
        
        
}
ViniGodoy

Então, é só trocar o 100,100 por outro valor.

Se quiser mudar ao pressionar um botão, terá que criar uma variável para os valores de x e y, e usa-la.

SirDominque

Entendi!

E se eu quiser desenhar algo sobre a tela , sobre a imagem ja feita?

Aí eu posso usar isto : ?
public void gXYZ()  
        {  
        Graphics2D g = img.createGraphics();  
              g.drawLine(50, 25, 30, 40);        
              
              
            
        }
ViniGodoy

É só colocar o drawLine embaixo do drawImage. Todo desenho deve, necessariamente, ficar no método paint.

SirDominque

Entendi!Vlw Viny!

Criado 12 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 22
Participantes 2