Como converte java.awt.Image para byte[]

Ola pessoal,
Como posso converter um objeto Image em um byte[]?

Tenho o seguinte código:

jFileChooserImagem.showOpenDialog(this);
if (jFileChooserImagem.getSelectedFile() != null) {
    try {
        FileInputStream fis = new FileInputStream(jFileChooserImagem.getSelectedFile());
        imagemOriginal = new byte[fis.available()];
        fis.read(imagemOriginal);
        fis.close();
    } catch (IOException ex) {
        Logger.getLogger(JInternalFrameCad.class.getName()).log(Level.SEVERE, null, ex);
    }
}

gostaria de redimensionar esta imagem e depois recuperar os bytes da imagem redimensionada.
tentei redimensionar desta forma:

Image image = Toolkit.getDefaultToolkit().getImage(jFileChooserImagem.getSelectedFile().getAbsolutePath());
BufferedImage thumbImage = new BufferedImage(200,200, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(image, 0, 0, 200, 200, null);

mas não sei como recuperar o byte[] da imagem redimensionada, e também não consigo garantir que isto está correto.

Alguém poderia me ajudar?
Vinny? vi que você já postou bastante a respeito aqui, mas não consegui resolver meu problema ainda…

Muito Obrigado

    public byte[] converterArquivo(File file) throws Exception {
        FileInputStream fis = new FileInputStream(file);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer = new byte[25600];
        int bytesRead = 0;

        while ((bytesRead = fis.read(buffer, 0, buffer.length)) != -1) {
            baos.write(buffer, 0, bytesRead);
        }
        return baos.toByteArray();
    }

Utilize o método acima para transformar a imagem(ou qualquer outro arquivo) em um array de bytes…

E quanto ao redimensionamento, experimente redimensionar somente o componente que exibe a imagem(não tenho certeza se funciona para swing)

Pode usar um byteArrayOutputStream para copiar os bytes.

BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); ByteArrayOutputStream buff = new ByteArrayOutputStream(); try { ImageIO.write(bi, "JPG", buff); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } byte[] bytes = buff.toByteArray();

Para processar a imagem, pode usar um WritableRaster. Essa classe te dá acesso completo aos pixel da imagem.
Ou se preferir fazer algo mais rústico, use o próprio vetor de bytes.

Ola pessoal, antes de mais nada obrigado por tentarem me ajudar.
biro o meu problema é justamente que não que ter que gravar a imagem redimensionada em disco para depois obter um File e recuperar o byte[].

juliocbq onde entraria a imagem que possuo em memória neste processo?

O que preciso realmente é algo do tipo:

private byte[] getBytesFromImage(Image imagem){
   ???????????????
}

como poderia implementar um método desse?

Obrigado mais uma vez a todos!!

[code] private byte[] getData(BufferedImage bi){

    ByteArrayOutputStream buff = new ByteArrayOutputStream();
    try {
        ImageIO.write(bi, "JPG", buff);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
     byte[] bytes = buff.toByteArray();
     
     return bytes;
}[/code]

ou pode ser mais específico quanto ao formato:

[code] private byte[] getData(BufferedImage bi, String format){

    ByteArrayOutputStream buff = new ByteArrayOutputStream();
    try {
        ImageIO.write(bi, format, buff);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
     byte[] bytes = buff.toByteArray();
     
     return bytes;
}[/code]

Ola juliocbq,
Me desculpe, mas não estou conseguindo entender… O método que você está propondo possui um parametro BufferedImage bi. Como posso obter este parametro a partir de um java.awt.Image?

Obrigado novamente!!

não use o awt.Image.

Use BufferedImage do swing, e ImageIO para copiar os dados. BufferedImage, e ImageIO são bem mais otimizadas.
Quando se vai trabalhar com imagens, deve-se pensar em performance também.

Como você faria o seguinte:

  • ler uma imagem do disco (exemplo: Foto.jpg)
  • Redimensionar a imagem para 300,300
  • Recuperar a imagem redimensionada e grava-la no banco de dados (aqui que eu preciso do byte[])

Basicamente o que preciso é isto.
O que estou fazendo é:

  • leio o arquivo do disco;
  • crio um byte[] da imagemOriginal;
    **preciso redimensionar
    ** criar um novo byte[] da imagem redimensionada
  • gravar no banco

O que está com ** é onde estou enrroscando.

Obrigado!

Aqui vou ler a imagem do banco.

byte b[] = Base64.decode(la.getUsuario().getFoto()); //byte b[] = usuario.getFoto(); InputStream in = new ByteArrayInputStream(b); //BufferedImage img = Toolkit.getDefaultToolkit().createImage(b); BufferedImage img = null; try { img = ImageIO.read(in); } catch (IOException ex) { ex.printStackTrace(); } ImageIcon imgIcon = new ImageIcon(img.getScaledInstance(img.getWidth(), img.getHeight(), 0));

Gravar e fazer o contrario.

abaixo tem mais ou menos um exemplo do que estou precisando…

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.logging.*;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
public class NewJFrame extends javax.swing.JFrame {
    public NewJFrame() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jfcImagem = new javax.swing.JFileChooser();
        lblImagem = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        lblImagem.setText("jLabel1");
        getContentPane().add(lblImagem, java.awt.BorderLayout.CENTER);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        getContentPane().add(jButton1, java.awt.BorderLayout.PAGE_END);

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        jfcImagem.showOpenDialog(this);
        if (jfcImagem.getSelectedFile() != null) {
            try {
                try {
                    FileInputStream fis = new FileInputStream(jfcImagem.getSelectedFile());
                    imagemOriginal = new byte[fis.available()];
                    fis.read(imagemOriginal);
                    fis.close();
                } catch (IOException ex) {
                    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
                Image image = Toolkit.getDefaultToolkit().createImage(imagemOriginal);
                BufferedImage thumbImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics2D = thumbImage.createGraphics();
                graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                graphics2D.drawImage(image, 0, 0, 200, 200, null);

                ImageInputStream iis = ImageIO.createImageInputStream(image);
                imagemIcone = new byte[(int) iis.length()];
                iis.read(imagemIcone);
                lblImagem.setIcon(new ImageIcon(imagemIcone));
            } catch (IOException ex) {
                Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JFileChooser jfcImagem;
    private javax.swing.JLabel lblImagem;
    // End of variables declaration
    private byte[] imagemOriginal;
    private byte[] imagemIcone;
}

a linha

ImageInputStream iis = ImageIO.createImageInputStream(image);

não está criando o ImageInputStream…

Obrigado

Julio, eu entendo sua posição sobre o ImageIO e BufferedImage mas quando a gente precisa manipular informações de desenho na imagem não tem como escapar muito de usar Image e Graphycs =)

A solução para o problema deste tópico eu postei nesse tópico aqui: http://www.guj.com.br/posts/list/0/58204.java#1169911

Deem uma olhada lá o/
Espero ter ajudado! Abraço!