Boa tarde, não estou conseguindo exibir uma imagem no ireport. A imagem esta no banco de dados postgres em um campo tipo bytea
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Boa tarde, não estou conseguindo exibir uma imagem no ireport. A imagem esta no banco de dados postgres em um campo tipo bytea
Oi Giovanni,
vou te passar um link do fórum do Jaspersoft Community que trata exatamente esse assunto:
https://community.jaspersoft.com/wiki/using-images-stored-database-reports
abs, Nico
Bom dia Nico, fiz o mesmo processo que estava no link, mas aparece esse erro:
Error filling print... Unable to get value for field 'img_multa' of class 'java.awt.Image' net.sf.jasperreports.engine.JRException: Unable to get value for field 'img_multa' of class 'java.awt.Image' at net.sf.jasperreports.engine.JRResultSetDataSource.getFieldValue(JRResultSetDataSource.java:328) at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1358) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1259) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1614) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:150) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87) at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:287) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:760) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:891) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: net.sf.jasperreports.engine.JRException: Image read failed. at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73) at net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes(JRImageLoader.java:167) at net.sf.jasperreports.engine.JRResultSetDataSource.getFieldValue(JRResultSetDataSource.java:318) ... 13 morePrint not filled. Try to use an EmptyDataSource...
Oi Giovanni,
vc sabe dizer se a imagem está salvo no banco como base64 encoded?
abs
Ele esta em um campo do tipo bytea no postgres. No java, para salvar a imagem estou usando as seguintes classes:
public byte[] getImgBytes(BufferedImage image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(image, "JPEG", baos);
} catch (IOException ex) {
//handle it here.... not implemented yet...
}
InputStream is = new ByteArrayInputStream(baos.toByteArray());
return baos.toByteArray();
}
Botão para escolher a imagem:
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fc = new JFileChooser();
int res = fc.showOpenDialog(null);
if (res == JFileChooser.APPROVE_OPTION) {
File arquivo = fc.getSelectedFile();
try {
BufferedImage img = control.setImagemDimensao(arquivo.getAbsolutePath());
} catch (Exception ex) {
// System.out.println(ex.printStackTrace().toString());
}
} else {
JOptionPane.showMessageDialog(null, "Voce nao selecionou nenhum arquivo.");
}
}
public BufferedImage setImagemDimensao(String caminhoImg) {
Double novaImgLargura = null;
Double novaImgAltura = null;
Double imgProporcao = null;
Graphics2D g2d = null;
BufferedImage imagem = null, novaImagem = null;
try {
//--- Obtém a imagem a ser redimensionada ---
imagem = ImageIO.read(new File(caminhoImg));
} catch (IOException ex) {
System.out.println(ex.getMessage());
JOptionPane.showMessageDialog(null, "Erro ao selecionar imagem" + ex);
}
//--- Obtém a largura da imagem ---
novaImgLargura = (double) imagem.getWidth();
//--- Obtám a altura da imagem ---
novaImgAltura = (double) imagem.getHeight();
novaImagem = new BufferedImage(novaImgLargura.intValue(), novaImgAltura.intValue(), BufferedImage.TYPE_INT_RGB);
g2d = novaImagem.createGraphics();
g2d.drawImage(imagem, 0, 0, novaImgLargura.intValue(), novaImgAltura.intValue(), null);
return novaImagem;
}
Botão de salvar
mod.setImaMulta(control.getImgBytes(img));
control.Salvar(mod);
Oi Giovanno,
passa tbm a expressão que vc usou no relatório.
confesso que nao sei ainda qual é o problema, mas vamos tentar resolver!
abs
La no ireport, no campo da imagem, quando vou colocar field class, ele não lista o java.awt.Image, ai eu digitei. Pode ser esse o problema? Estou usando a versão 5.6.0 do ireport
Oi Giovanni,
Ainda estou procurando uma solução.
No link abaixo do Stackoverflow, na segunda resposta, tem um código SQL para converter o bytea do PostgresSQL num string base64. Lá tbm tem a expressão para carregra a string base64 no iReport:
https://stackoverflow.com/questions/8430313/displaying-image-in-ireports-using-postgresql
Parece que o bytea do PostgresSQL não é exatamente um BLOB.
Tem como testar isso?
obrigado, Nico
Bom dia Nico, realizei o teste desse procedimento, deu super certo. Muito obrigado pela ajuda Pórem utilizei o seguinte select: SELECT encode(img_multa::bytea, 'base64') as img FROM multa