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

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

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)

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 ?

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

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 ?

[code]
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); 
}  

} [/code]

  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

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

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

[code]
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());}
   
   
    
    
    
    
}

}[/code]

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.

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

vlw Viny

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 ?

A imagem se mover é animação.

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

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

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

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

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

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.

[code]/*

  • 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()
    {
      
    }

}
[/code]

Pode me ajudar?

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

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 :

[code]/*

  • 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....
        
}

}
[/code]

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.