Trabalhando com Imagens ( Carregar, criar graphics2D e mostrar na tela)
22 respostas
S
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
packageJava2D;importjava.*;importjava.awt.Image;importjava.awt.*;importjava.awt.geom.Line2D;importjava.awt.*;importjava.awt.event.*;importjava.awt.geom.*;importjava.awt.font.*;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio.ImageIO;publicclassDrawn_2D{publicstaticImageimg;publicstaticGraphics2Dg2;privatestaticjavax.swing.JFramej;protectedstaticintiii;publicstaticvoidmain(Stringargs[]){CarregImg();DesenhandoIMG();}publicstaticvoidCarregImg(){try{BufferedImageimage=ImageIO.read(newFile("ace.png"));}catch(IOExceptione){System.out.println("Erro:"+e.getMessage());iii=iii+1;}if(iii>0){System.out.println("Erro Desconhecido ao carregar Imagem");}}publicstaticvoidDesenhandoIMG(){//Criamos uma imagem de 640x480 pixels?BufferedImageaceimg=newBufferedImage(640,480,BufferedImage.TYPE_INT_ARGB);//Cria o G2D da imagem!Graphics2Dg2d=aceimg.createGraphics();//Libera da memória ?g2d.dispose();}}
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)
S
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 ?
V
ViniGodoy
Sim, mas no caso dele, sobrescreve-se o método paintComponent. Em outros componentes, como o JPanel, também.
S
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 ?
packageJava2D;importjava.awt.Color;importjava.awt.GradientPaint;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.geom.Ellipse2D;importjava.awt.geom.Rectangle2D;importjavax.swing.JFrame;importjava.awt.*;importjava.awt.geom.Ellipse2D;importjava.awt.geom.QuadCurve2D;importjava.awt.geom.Rectangle2D;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.util.logging.Level;importjava.util.logging.Logger;importjavax.imageio.ImageIO;importjavax.swing.JFrame;importjavax.swing.JOptionPane;/** * * @author André Vinícius Lopes */@SuppressWarnings("serial")publicclassDrawningSpriteVGextendsJFrame{publicDrawningSpriteVG(){super("DrawningSpriteVG");setSize(800,600);setLocationRelativeTo(null);}@Overridepublicvoidpaint(Graphicsg){Graphics2Dg2d=(Graphics2D)g.create();try{//Desenhar e pintar aqui!BufferedImageimage=ImageIO.read(newFile("ace.png"));}catch(IOExceptionex){JOptionPane.showMessageDialog(null,"Error I/O \n Erro:"+ex.getMessage());System.out.println("Erro de I/O ao carregar Imagem");}BufferedImageaceimg=newBufferedImage(640,480,BufferedImage.TYPE_INT_ARGB);//Cria o G2D da imagem!Graphics2Dg2i=aceimg.createGraphics();g2i.draw(null);}publicstaticvoidmain(String[]args){DrawningSpriteVGjanela=newDrawningSpriteVG();janela.setVisible(true);}}
V
ViniGodoy
Não se carrega coisas dentro do método paint. Ele é chamado sempre que sua janela for repintada;
Você ainda não está usando o método drawImage para desenhar a imagem no frame;
Provavelmente ele não encontrou o arquivo da imagem.
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
V
ViniGodoy
Fiz um exemplo. Veja como ficou parecido com o da linha, que postei para você.
S
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:
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.
S
SirDominque
Ahh Desculpa. Eu vi o Exemplo, agora estou entendendo! Vou mexer no código , qualquer coisa eu posto aqui
vlw Viny
S
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 ?
V
ViniGodoy
A imagem se mover é animação.
Vc está mexendo com imagens para fazer algum game? Se for, recomendo que não use Java.
S
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
V
ViniGodoy
Em qualquer componente, inclusive Applets.
O processo é basicamente o mesmo. Então, não dá para dizer que nada é mais complexo.
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
V
ViniGodoy
Não faço idéia. Geralmente uso o eclipse para programar. E também não dependo tanto do construtor visual assim.
S
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. */packageJava2D;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjavax.imageio.ImageIO;importjavax.swing.JFrame;@SuppressWarnings("serial")publicclassJFrameComImagemextendsJFrame{privateBufferedImageimg;publicJFrameComImagem(BufferedImageimg){super("JFrame com imagem");setSize(800,600);setLocationRelativeTo(null);this.img=img;}@Overridepublicvoidpaint(Graphicsg){Graphics2Dg2d=(Graphics2D)g.create();g2d.drawImage(img,100,100,null);g.dispose();}publicstaticvoidmain(String[]args){try{BufferedImageimg=ImageIO.read(JFrameComImagem.class.getResourceAsStream("ace.png"));newJFrameComImagem(img).setVisible(true);}catch(IOExceptione){System.out.println("Não foi possível carregar a imagem.");}catch(IllegalArgumentExceptione){System.out.println("Imagem não encontrada!");}}publicvoidgetXYZ(){}}
Pode me ajudar?
V
ViniGodoy
Aquele 100,100 no comando drawImage é a posição x e y da imagem.
S
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. */packageJava2D;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjavax.imageio.ImageIO;importjavax.swing.JFrame;importorg.ietf.jgss.GSSContext;@SuppressWarnings("serial")publicclassJFrameComImagemextendsJFrame{privateBufferedImageimg;publicJFrameComImagem(BufferedImageimg){super("JFrame com imagem");setSize(800,600);setLocationRelativeTo(null);this.img=img;}@Overridepublicvoidpaint(Graphicsg){Graphics2Dg2d=(Graphics2D)g.create();g2d.drawImage(img,100,100,null);g.dispose();}publicvoidgXYZ(){Graphics2Dg=img.createGraphics();g.drawLine(50,25,30,40);}publicstaticvoidmain(String[]args){try{BufferedImageimg=ImageIO.read(JFrameComImagem.class.getResourceAsStream("ace.png"));newJFrameComImagem(img).setVisible(true);}catch(IOExceptione){System.out.println("Não foi possível carregar a imagem.");}catch(IllegalArgumentExceptione){System.out.println("Imagem não encontrada!");}gXYZgx=newgXYZ();//Erro....}}
V
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.
S
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);
}
V
ViniGodoy
É só colocar o drawLine embaixo do drawImage. Todo desenho deve, necessariamente, ficar no método paint.