Como salvar uma imagen jpeg num Banco de Dados?

3 respostas
anjomal

Renasci to de volta galera !!! :smiley:

Galera to fazendo um programa para emitir codigo de barras, eu fiz uma classe que gera a imagen do codigo de barras e converte ela para um jpeg com as funções da com.sun.image.codec.jpeg.JPEGCodec so que que a funções que gera o JPEG pega um OutputStream como parametro e eu nao quero descarregar essa imagen em um arquivo queria copiar ela direto para um campo BLOB no meu banco de dados para um melhor entendimento segue a classe que faz a imagen do codigo de barras

package com.sic.report.engineer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * @author William J. Oliveira
 *
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates.
 * To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */

public class Barcode implements Serializable {

	java.awt.image.BufferedImage image;

	public Barcode() throws IOException {

		criaImagem(
			"12345678901234567890123456789012345678901234",
			"default.jpg",
			25);
	}

	public Barcode(String numero, String filename) throws IOException {
		StringBuffer tmp = new StringBuffer(numero.substring(0,3));
		tmp.append(getNumeroDv(numero)).append(numero.substring(3));
		criaImagem(tmp.toString(), filename, 35);
	}

	/** Metodo criaImagem
	* Usado para criacao da imagem que representa o codigo de barras
	@author Ricardo Gil
	*/
	public boolean criaImagem(String texto, String filename, int h)
		throws IOException {
		int i, j, tam;

		//Criando arquivos de imagen do codigo de barras
		File file = new File(filename);
		FileOutputStream out = new FileOutputStream(file, true);

		//Variavel que contem a representacao em Codigo de Barras de cada um dos numeros.
		//Nessa representacao:
		// 0 significa Barra Fina (NARROW);
		// 1 significa Barra Grossa (WIDE).
		String[] barras = { "00110", //0
			"10001", //1
			"01001", //2
			"11000", //3
			"00101", //4
			"10100", //5
			"01100", //6
			"00011", //7
			"10010", //8
			"01010" }; //9
		//O Codigo de barras e formado sempre por pares intercalados.
		//Por exemplo 12:
		//Pegando-se a representacao do 1 e do 2 na variavel acima teriamos o seguinte:
		//[telefone removido].
		//Com isso, o primeiro numero representa as Barras Pretas (Fina ou Grossa)
		// e o Segundo numero representa as Barras Brancas, ou espacos, (Fina ou Grossa).
		int preto, branco;
		int w = 9 + (9 * texto.length());

		image =
			new java.awt.image.BufferedImage(
				w,
				h,
				java.awt.image.BufferedImage.TYPE_INT_RGB);
		tam = 0;
		fillRect(0, 0, w, h, 0x00FFFFFF);
		//começo do Codigo de Barras = 0 = 00 / 1 = 00
		fillRect(tam, 0, tam + 1, h, 0x00000000);
		tam++;
		fillRect(tam, 0, tam + 1, h, 0x00FFFFFF);
		tam++;
		fillRect(tam, 0, tam + 1, h, 0);
		tam++;
		fillRect(tam, 0, tam + 1, h, 0x00FFFFFF);
		tam++;
		//Conteudo do Codigo de Barras
		for (i = 0; i <= texto.length() - 1; i++) {
			preto = Integer.parseInt(String.valueOf(texto.charAt(i)));
			branco = Integer.parseInt(String.valueOf(texto.charAt(i + 1)));
			i++;
			for (j = 0; j < 5; j++) {
				if (String.valueOf(barras[preto].charAt(j)).equals("0")) {
					fillRect(tam, 0, tam + 1, h, 0);
					tam++;
				} else {
					fillRect(tam, 0, tam + 3, h, 0);
					tam += 3;
				}
				if (String.valueOf(barras[branco].charAt(j)).equals("0")) {
					fillRect(tam, 0, tam + 1, h, 0x00FFFFFF);
					tam++;
				} else {
					fillRect(tam, 0, tam + 3, h, 0x00FFFFFF);
					tam += 3;
				}
			}
		}

		//fim da barra = 0 = 10 / 1 = 0
		fillRect(tam, 0, tam + 3, h, 0);
		tam += 3;
		fillRect(tam, 0, tam + 1, h, 0x00FFFFFF);
		tam++;
		fillRect(tam, 0, tam + 1, h, 0);
		tam++;

		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(image);
		//GifEncoder encoder = new GifEncoder(BarImage ,outb);
		//encoder.encode();
		// ESSAS DUAS LINHAS ACIMA CRIARIAM UM .gif
		out.close();
		return true;
	}

	private void fillRect(int x0, int y0, int x1, int y1, int color) {
		for (int x = x0; x < x1; x++) {
			for (int y = y0; y < y1; y++) {
				image.setRGB(x, y, color);
			}
		}
	}
	
	private String getNumeroDv(String value)	{		
		StringBuffer result = new StringBuffer("");
		String dv = "0";
		boolean par = true;		
		
		int resto = 0;
		int dividendo = 0;
		int tempint = 0;

	
		for(int i=(value.length()-1);i>=0;i--){
			
			if(par){
				par=false;					
				tempint = 2 * (Integer.parseInt(value.substring(i,(i+1))));				
			}else{
				par=true;
				tempint = 1 * (Integer.parseInt(value.substring(i,(i+1))));				
			}			
			
			result.append(Integer.toString(tempint));				

		}
		
		for(int i=0;i<result.length();i++) tempint = tempint + (Integer.parseInt(result.substring(i,(i+1))));
				
		resto = tempint % 10;
		
		if(resto>0){
			dv = Integer.toString((10 - resto));
		}
		
		return dv;
		
	}
	
}

ao inves de salvar em arquivo queria salvar no banco e ai ?

Falow galera !!!

3 Respostas

douglasfs

Quando eu precisei gravar uma imagem no mysql (campo BLOB) eu peguei um InputStream do arquivo, mais ou menos assim :

InputStream arquivo = …
prep.setInt(5, arquivo, colocaOTamanhoDoArquivoAqui);

Onde prep eh um PreparedStatement

anjomal

Uma perguntinha bem besta :? eu consigo um InputStream diretamente de um OutputStream ? ou vou ter de jogar isso dentro de um arquivo e depois pegalo novamente ???

:shock:

Eis a questao ???

douglasfs

“anjomal”:
Uma perguntinha bem besta :? eu consigo um InputStream diretamente de um OutputStream ? ou vou ter de jogar isso dentro de um arquivo e depois pegalo novamente ???

:shock:

Eis a questao ???

Olha eu nunca tentei fazer isso (na verdade nunca precisei, a solução acima é para trabalhar com uploads junto com o commons FileUpload), mas tem uma duvida parecida em : http://forum.java.sun.com/thread.jsp?forum=54&thread=272257&message=1045532

Só não esqueça que você vai ter que passar o tamanho do arquivo no PreparedStatement

Criado 15 de setembro de 2003
Ultima resposta 15 de set. de 2003
Respostas 3
Participantes 2