Geração de imagem

7 respostas
W

E aí pessoal?

Fiz minha classe que gera imagens à partir de um banco de dados.

Aí vai ela:
/**
 * @(#)Migracao.java
 *
 *
 * @author 
 * @version 1.00 2007/9/10
 */
import java.io.*;
import java.sql.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.awt.Toolkit;
import javax.imageio.*;

public class Execute {

    public Execute() {
    }
    
    public static void main(String args[]){
	int i = 0;
    	try{
	    	GeraImagem gi = new GeraImagem();
	    	ResultSet rs = gi.retornaFiguras();
			while(rs.next()){
				i++;
				
				System.out.println("Conteúdo do arquivo "+i+ " \n");

					   try {
							//Image img = Toolkit.getDefaultToolkit().createImage(rs.getBytes("im_figura_fso"));
							
							byte[] bytes;  
							bytes = rs.getString("im_figura_fso").getBytes();  
							
							System.out.println("--> " + String.valueOf(rs.getString("im_figura_fso")).substring(0,100));
							System.out.println("--> " + String.valueOf(String.valueOf(bytes)));
							
							Image img = Toolkit.getDefaultToolkit().createImage(bytes);
							
							BufferedImage imagem = converteImagem(img);
							ImageIO.write(imagem, "JPG", new File("teste"+i+".jpg"));

					   }catch (Exception e1) {
					       //TODO Auto-generated catch block
					       System.out.println("\n\nErro - > "  + e1 + "\n\n");
					   }  
				
			}
    	}catch(Exception e){
    		System.out.println("Ahá--- erroo -->>> " + e);
    	}
    	

    }
    
    public static String hexaToString(String hexa) {  
         StringBuilder sb = new StringBuilder();          
         char []value = new char[2];          
         for(int i = 0; i < hexa.length(); i++){  
             int pos = i % 2;  
             value[pos] = hexa.charAt(i);  
             if (pos > 0) {  
                 int intVal = Integer.parseInt(new String(value), 16);  
                 char charVal = (char) intVal;  
                 sb.append(charVal);                        
             }  
         }     
         return(sb.toString());  
     }  
     	
	 public static BufferedImage converteImagem(Image im)
	 {
	    //BufferedImage bi = new BufferedImage(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
	    BufferedImage bi = new BufferedImage(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
	    Graphics bg = bi.getGraphics();
	    bg.drawImage(im, 0, 0, null);
	    bg.dispose();
	    return bi;
	 }
    
}

O problema é assim.

Eu tinha uma base oracle, que foi migrada para postgres. Dentro de uma das tabelas, eu possuo as imagns, que agora, no postgres, estão em um formato semelhante ao a seguir:

789CEC9D4F6FE43876C0A956AFD98B359A3D97C00B1866037B9943806D2001E283634EB20872CA31E7F462CF019C530A48A1....

Isso é a imagem, dentro do banco, em algum formato que não consigo identificar.

Converti isso pra bytes (para fazer a geração da imagem), mas as imagens continuam saindo pretas.

Alguém pode me dar uma luz?

Valeu!

:roll:

7 Respostas

edvaldo.santiago

Cara blz…
Então… isso que tá fazendo é para aplicação Web ou Desktop…
Se for Web eu trato diferente esse processo… .e tb utilizo Posgres 8.2

Valeu :slight_smile:

W

Vai ser web, mas eu tô testando diretão no java, pra ver se eu consigo fazer aparecer…

mas se funcionar direto em web, melhor ainda…

:lol:

ddduran
bytes = rs.getString("im_figura_fso").getBytes();

por que você não faz assim
rs.getBytes(“im_figura_fso”);
direto?

esse campo é de que tipo no banco? Byte[], Blob?

não sei se ajuda, mas

se você seguir ele recupera imagens do banco

W

então, na verdade eu tentei já usando o getBytes (o campo na minha tabela é bytea), mas ainda assim não deu…

Acho que, como eu tenho um formato que não é o de bytes (esse F654AS64a6SFADD…) talvez eu tenha que gerar a imagem à partir disso, só que se eu colocar isso como critério do createIMage, ele interpreta isso como um string, e não gera a imagem baseando-se da forma correta… enfim… é um verdadeiro pepino.

E viva os sistemas legados. hehehehe

se alguém tiver mais alguma idéia, tô aceitando! hehehe

valeu!

edvaldo.santiago

Cara dá uma olhada nesse link…
Aqui tá passo a passo de como vc deve fazer para obter a figura do banco.
http://www.guj.com.br/posts/list/68520.java#360012
Valeu :lol:

W

Então...

adaptei para mim e ficou assim:

<%@page contentType="image/jpeg; chaoResult=iso-8859-1" language="java" %> 
<%@page import="java.sql.*" errorPage="" %>
<%@page import="java.io.InputStream"%>
<jsp:useBean id="conn" class="intranet.Consulta"/>
<%

try{
	ResultSet rs = conn.retornaImagens();
	while(rs.next()){
	InputStream sImage = rs.getBinaryStream("im_figura_fso"); 

		 ServletOutputStream outs = null;
		 try{  
			 outs = response.getOutputStream();   
			 byte[] bytearray = new byte[4096];   
			 int size=0;   
			 response.reset();   
			 response.setContentType("image/jpeg");   
			 response.addHeader("Content-Disposition","filename=imagebd.jpg");   
			 response.setHeader ("Pragma", "no-cache");   
			 response.setHeader ("Cache-Control", "no-cache");   
			 response.setDateHeader ("Expires",0);   
			 while((size=sImage.read(bytearray))!= -1 ) {   
			 	outs.write(bytearray,0,size);   
			 }   
		 }catch(Exception e){   
			 System.out.println("Erro --> " + e);          
		 }  
		 outs.flush();      
		 sImage.close();
		}
}catch(Exception e){
	System.out.println("Erro --> " + e);
}
%>

Quando executo isso dá o erro:

Erro --> java.lang.IllegalStateException
Erro --> java.lang.IllegalStateException
Erro --> java.lang.IllegalStateException
Erro --> java.lang.IllegalStateException
Erro --> java.lang.IllegalStateException(...)

Dicas?

edvaldo.santiago

Em qual linha do código acontece esse erro!?!?
:shock:

Criado 23 de outubro de 2007
Ultima resposta 25 de out. de 2007
Respostas 7
Participantes 3