Saudações pessoal, preciso da vossa ajuda, como faço para carregar uma imagem no java2d com o VolatileImage?
Como funciona?
Saudações pessoal, preciso da vossa ajuda, como faço para carregar uma imagem no java2d com o VolatileImage?
Como funciona?
Assim deve funcionar:
public VolatileImage createVolatileImage(int width, int height, int transparency) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
VolatileImage image = gc.createCompatibleVolatileImage(width, height, transparency);
int valid = image.validate(gc);
if (valid == VolatileImage.IMAGE_INCOMPATIBLE) {
return createVolatileImage(width, height, transparency);
}
return image;
}
Em que momento no código é que carrega-se a imagem em formato PNG, JPG etc?? Gostaria de Saber?
VolatileImage não é pra carregar arquivos de imagem, é para fazer operações com Graphics de forma mais rápida.
Mas sim, depois de ter criado seu objeto VolatileImage, você pega o Graphics dele e desenha a imagem desejada nele, que aí pode ser qualquer instância de Image que você carregou de algum arquivo.
O que exatamente você quer fazer?
Na verdade era mesmo isso que eu queria saber , como adiciono imagem ou desenho a imagem no volátilImage, podes dar um exemplo ??
E já agora muito obrigada por ajudares-me !!
InputStream in = /* Arquivo que você quer carregar */;
Image image = ImageIO.read(in);
// desenhando no VolatileImage
int width = image.getWidth(null);
int height = image.getHeight(null);
VolatileImage volatileImage = createVolatileImage(width, height, Transparency.TRANSLUCENT);
Graphics graphics = volatileImage.getGraphics();
graphics.drawImage(image, 0, 0, width, height, null);
Posta o código de suas classes, que fica fácil identificar o problema.
Como carrego a imagem com o inputStream?
Eu estou a carregar dessa forma;:
InputStream in = getClass().getResourceAsStream(“imagem.jpg”);
Image imagem = ImageIO.read(in);
Vou postar já já
Quando usa o getResourceAsStream
, o caminho tem que começar com /
pra procurar a partir da raíz do classpath
da sua aplicação.
package BufferedImageVolatilImage;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
*
@author isaura
*/
public class DrawPanel extends JPanel implements ActionListener
{
private Timer tempo;
private BufferedImage roda = null, ball = null;
private BufferedImage yuri;
private Image sempre;
InputStream in ;/* Arquivo que você quer carregar */;
private VolatileImage image;
private int width,height;
public DrawPanel()
{
this.setBackground(Color.gray);
tempo = new Timer(9,this);
tempo.start();
try
{
yuri= ImageIO.read(new File("sara/bola.png"));
}
catch (IOException ex)
{
ex.printStackTrace();
System.out.println("Error"+ex);
}
try
{
in = getClass().getResourceAsStream("imagem.jpg");
sempre = ImageIO.read(in);
}
catch (IOException ex)
{
ex.printStackTrace();
System.out.println("Error"+ex);
}
/* try
{
in =new File("sara/imagem.jpg") ;
sempre = ImageIO.read(in);
}
catch(IOException ex)
{
ex.printStackTrace();
System.out.println("Error:"+ex);
}*/
}
public VolatileImage createVolatileImage( int width,int height,int transparency)
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
VolatileImage image = gc.createCompatibleVolatileImage(width, height, transparency);
int valid = image.validate(gc);
if( valid == VolatileImage.IMAGE_INCOMPATIBLE)
{
return createVolatileImage(width,height,transparency);
}
return image;
}
@Override
public void paintComponent( Graphics g)
{
super.paintComponent(g);
Graphics2D grafico = (Graphics2D)g;
grafico.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// grafico.drawImage(ball, 200,100,100,100,Color.GRAY ,this);
grafico.drawImage(yuri, 0,0, null);
// desenhando no VolatileImage
//int width = sempre.getWidth(null);
//int height = sempre.getHeight(null);
VolatileImage volatileImage = createVolatileImage(100, 200, Transparency.TRANSLUCENT);
Graphics graphics = volatileImage.getGraphics();
graphics.drawImage(sempre, 50, 50, width, height, null);
}
@Override
public void actionPerformed(ActionEvent e)
{
this.repaint();
}
}
Quando postar código no fórum, utilize o botão para formatação de código, assim:
Aparentemente no seu código a VolatileImage
não está tendo utilidade nenhuma, pois você está desenhando diretamente no Graphics
de um JComponent
, neste caso um JPanel
.
Você deve utilizar o VolatileImage
quando deseja “desenhar em memória” de forma mais acelerada para depois efetivamente transferir os pixels dele para o Graphics
do componente.
Abaixo tem o seu código modificado para desenhar usando o VolatileImage
:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
* @author isaura
*/
@SuppressWarnings("serial")
public class DrawPanel extends JPanel {
// main só pra testar
public static void main(String[] args) {
JFrame frame = new JFrame("Teste");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(new Dimension(640, 480));
frame.add(new DrawPanel(), BorderLayout.CENTER);
frame.setVisible(true);
}
// método pra carregar imagem sem precisar ficar botando try-catch
private static BufferedImage carregarImagem(String caminho) {
try {
InputStream input = DrawPanel.class.getResourceAsStream(caminho);
return ImageIO.read(input);
} catch (IOException ex) {
System.err.println("Error:");
ex.printStackTrace();
return null;
}
}
private BufferedImage yuri;
private BufferedImage sempre;
private VolatileImage volatileImage; // imagem para desenhar em memória
public DrawPanel() {
yuri = carregarImagem("/sara/bola.png");
sempre = carregarImagem("/sara/imagem.jpg");
volatileImage = newVolatileImage(getWidth(), getHeight(), Transparency.TRANSLUCENT);
addComponentListener(new ComponentAdapter() {
// recriar a VolatileImage caso o DrawPanel seja redimensionado
@Override
public void componentResized(ComponentEvent e) {
Dimension size = e.getComponent().getSize();
volatileImage = newVolatileImage(size.width, size.height, Transparency.TRANSLUCENT);
}
});
setBackground(Color.GRAY);
Timer tempo = new Timer(9, event -> repaint());
tempo.start();
}
@Override
public void paintComponent(Graphics g) {
int width = volatileImage.getWidth();
int height = volatileImage.getHeight();
// obtém o Graphics da VolatileImage
Graphics2D grafico = volatileImage.createGraphics();
// desenha nele
grafico.setBackground(Color.GRAY);
grafico.fillRect(0, 0, width, height);
grafico.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
grafico.drawImage(yuri, 0, 0, null);
grafico.drawImage(sempre, 50, 50, null);
grafico.dispose();
// agora transfere a VolatileImage para o Graphics deste componente
g.drawImage(volatileImage, 0, 0, width, height, null);
}
private VolatileImage newVolatileImage(int width, int height, int transparency) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
VolatileImage volatileImage = gc.createCompatibleVolatileImage(width, height, transparency);
int valid = volatileImage.validate(gc);
if (valid == VolatileImage.IMAGE_INCOMPATIBLE) {
return newVolatileImage(width, height, transparency);
}
return volatileImage;
}
}