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
biro
Outubro 27, 2009, 9:07am
#2
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
_Zell_
Dezembro 23, 2010, 9:44am
#11
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!