Problemas com ByteArrayInputStream e ByteArrayOutputStream!

2 respostas
anjomal

Galera to gerando uma imagem no meu sistema em tempo de execução eu gero essas imagens e quero grava-las no meu BD o problema e que eu não quero criar um arquivo temporario em disco, o JPEGEncoder pede um OutputStream como parametro. No caso geralmente um FileOutputStream no qual e gerado a imagen JPG mas no meu caso eu nao quero esser overhead da copia em disco eu quero gravr essa imagen num ByteArrayOutputStream e depois coloca-la num ByteArrayInputStream no qual eu gravo no meu BD com o metodo setBinaryStream o problema e que depois de eu chamar o meto encode com o ByteArrayOutputStream o array fica zerado, ou seja nada e copiado para lá muito estranho olhem o codigo abaixo e HEEEEELP ME !!! :lol:

package sic.guias;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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 {

	public static final int DV1=1;
	public static final int DV2=2;
	public static final int DV3=3;
	public static final int DV4=4;
	
	private java.awt.image.BufferedImage image;
	private String strbarcode;
	private int insize=0;
	//Criando arquivos de imagen do codigo de barras
	private ByteArrayOutputStream out = new ByteArrayOutputStream();
	private ByteArrayInputStream in;

	public Barcode() throws IOException {

		criaImagem("12345678901234567890123456789012345678901234", 25);
	}

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

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

		//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);			
		in = new ByteArrayInputStream(out.toByteArray());
		
		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);
			}
		}
	}

	public String getDv(int index) {
		int inicio=0,fim=0;
		String dvt;
		
		switch (index) {
			case 1 :
				inicio=0;
				fim=11;
				break;
			case 2 :
				inicio=11;
				fim=22;
				break;
			case 3 :
				inicio=22;
				fim=33;			
				break;
			case 4 :
				inicio=33;
				fim=44;			
				break;
		}
		
		StringBuffer buffer = new StringBuffer(strbarcode.substring(inicio,fim));
		dvt=getNumeroDv(buffer.toString());
		buffer.append("-").append(dvt);
		
		return buffer.toString();
	}

	public String getDvG() {
		return strbarcode;
	}

	public InputStream getIn() {
		return in;
	}
	
	public int getInSize(){
		return insize;
	}
	

	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;

	}

2 Respostas

anjomal

OOOops :oops: erro besta :shock: foi mal galera, ja concertei o erro estava aqui:

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);          
      in = new ByteArrayInputStream(out.toByteArray()); 
       
      encoder.encode(image);

Boteo o carro na frente dos bois, o certo e esse:

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);          
      encoder.encode(image); 
      in = new ByteArrayInputStream(out.toByteArray());

Isso acontece nas melhores familias :lol:

tartaruga.df

Onde você conseguiu achar o JPEGImageEncoder. Estou procurando e não acho.

Criado 20 de setembro de 2003
Ultima resposta 2 de nov. de 2011
Respostas 2
Participantes 2