Como carregar Imagem com VolatileImage?

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;
}
1 curtida

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?

1 curtida

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);

@staroski

Tento carregar a imagem, e não aparece nada, com as tuas instruções o que faço??

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:
formatacao-forum

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;
    }
}
1 curtida

Muito Obrigada @staroski, resultou completamente.

1 curtida