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;
}