Ola,
Tenho imagens inseridas em um BD Postgres, ela está inserida no formato inputStream, porem ao busca-la no banco e tranforma-la em imagem novamente a mesma fica incompleta,ou,seja apenas um pequeno pedaço da imagem aparece, a dimensão da imagem é normal, porem apenas um pedaço efetivo da imagem aparece o “resto” eh apenas “cinza”.
Tentei 2 metodoa diferentes mas os 2 retornam a mesma imagem cortada.
Metodo 1
[code]InputStream is = pagina.getImagem();
byte[] buffer = null;
buffer = new byte[is.available()];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream("C:\\Users\\Dell001\\Documents\\ImagensGED\\"
+"Pagina" + pagina.getNumero()+".jpg");
fos.write(buffer);
FileDescriptor fd = fos.getFD();
fos.flush();
fd.sync();
fos.close(); [/code]
Metodo 2
Aqui transformei o inputStrem em um bufferedImage, como um amigo me orientou mas tb nao funcionou
[code] BufferedImage buffer_imagem = ImageIO.read(pagina.getImagem());
ImageIO.write(buffer_imagem, "JPG", new File("C:\\Users\\Dell001\\Documents\\ImagensGED\\"
+"Pagina" + pagina.getNumero()+".jpg")); [/code]
As duas maneiras funcionam, porém da maneira q descrevi acima, aparece apenas um pedacinho da imagem em sí o resto tudo cinza.
Segue o metodo que inicializa um scanner e “pega” a imagem escaneada.
[code] package br.com.ns2e.ged.scanner;
import br.com.ns2e.ged.modelo.Pagina;
import ij.IJ;
import ij.ImagePlus;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import uk.co.mmscomputing.device.scanner.Scanner;
import uk.co.mmscomputing.device.scanner.ScannerDevice;
import uk.co.mmscomputing.device.scanner.ScannerIOException;
import uk.co.mmscomputing.device.scanner.ScannerIOMetadata;
import uk.co.mmscomputing.device.scanner.ScannerListener;
import javax.swing.WindowConstants;
public class ScannerGed extends JFrame implements ScannerListener {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JButton jButton = null;
private JButton jButton1 = null;
private Scanner scanner;
private Pagina pagina;
private BufferedImage img;
public ScannerGed(Pagina pag) {
super();
this.setVisible(true);
initialize();
pagina = pag;
try {
scanner = Scanner.getDevice();
scanner.addListener(this);
} catch (Exception e) {
e.printStackTrace();
}
}
private void initialize() {
this.setSize(300, 120);
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setResizable(false);
this.setContentPane(getJContentPane());
this.setTitle("Scaneamento");
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
}
});
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJButton(), null);
jContentPane.add(getJButton1(), null);
}
return jContentPane;
}
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(4, 16, 131, 42));
jButton.setText("Escolha o Dispositivo");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if (scanner.isBusy() == false) {
selectDevice();
}
}
});
}
return jButton;
}
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setBounds(new Rectangle(160, 16, 131, 42));
jButton1.setText("Scaneamento");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
getScan();
}
});
}
return jButton1;
}
public void selectDevice() {
try {
scanner.select();
} catch (ScannerIOException e1) {
IJ.error(e1.toString());
}
}
public void getScan() {
try {
scanner.acquire();
} catch (ScannerIOException e1) {
IJ.showMessage("Acesso negado: Dispositivo em uso");
}
}
public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata) {
// System.out.println("nao foi");
if (type.equals(ScannerIOMetadata.ACQUIRED)) {
// System.out.println("foi");
ImagePlus imp = new ImagePlus("Scaneamento", metadata.getImage());
img = imp.getBufferedImage();
ByteArrayOutputStream buff_bytes = new ByteArrayOutputStream();
try {
ImageIO.write(img, "jpg", buff_bytes);
buff_bytes.flush();
byte[] imagem_byte = buff_bytes.toByteArray();
// byte[] bytes = /* use seu método que converte BufferedImage em byte[] */ ;
InputStream input = new ByteArrayInputStream(imagem_byte);
System.out.println(imagem_byte);
pagina.setImagem(input);
buff_bytes.close();
this.dispose();
} catch (IOException ex) {
Logger.getLogger(ScannerGed.class.getName()).log(Level.SEVERE, null, ex);
}
} else if (type.equals(ScannerIOMetadata.NEGOTIATE)) {
ScannerDevice device = metadata.getDevice();
try {
device.setResolution(100);
} catch (ScannerIOException e) {
IJ.error(e.getMessage());
}
} else if (type.equals(ScannerIOMetadata.STATECHANGE)) {
// IJ.error(metadata.getStateStr());
} else if (type.equals(ScannerIOMetadata.EXCEPTION)) {
IJ.error(metadata.getException().toString());
}
}
} [/code]
E aqui um trecho do metodo que salva esta imagem no banco.
[code] private int incluir(br.com.ns2e.ged.modelo.Pagina pagina) throws SQLException {
int linhas_afetadas = 0;
String texto_sql = “INSERT INTO … "
+ “(documento, numero, imagem)”
+ " VALUES (?, ?, ?)”;
PreparedStatement comando = conexao.prepareStatement(texto_sql);
comando.setInt(1, pagina.getDocumento().getId());
comando.setInt(2, pagina.getNumero());
comando.setBinaryStream(3, pagina.getImagem(), 1024);
try {
comando.execute();
} catch (Exception e) {
System.out.println(e);
}
linhas_afetadas = comando.getUpdateCount();
return linhas_afetadas;
} [/code]
As imagens geradas sae sempre assim, as vezes um pouquinho menos ou um pouquinho mais,
mas sempre apenas ali no topo.