ZXing

30 respostas
N

Boa noite, galera alguem sabe como usar o ZXing para escrever e ler QRcode no JSP ???

vlwwwww

Obrigado

30 Respostas

_

Vou desenterrar o tópico e responder só para caso alguém encontre essa página via google. Afinal eu apanhei um monte pra descobrir como fazer essa joça. Não seria legal mais uma cambada apanhar também -.-

Então segue o código:

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

import jp.sourceforge.qrcode.QRCodeDecoder;

import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class Exemplo {

	public static void main(String[] args) {

		encode();
		decode();

		System.out.println("Fecho! =D");
	}

	public static void decode() {
		System.out.println("Decodificando...");
		QRCodeDecoder decoder = new QRCodeDecoder();
		byte[] bytes = decoder.decode(new MyImage("C:\\testimg.jpg"));

		String result = new String(bytes);
		System.out.println(result);
	}

	public static void encode() {
		System.out.println("Codificando...");

		Charset charset = Charset.forName("ISO-8859-1");
		CharsetEncoder encoder = charset.newEncoder();
		byte[] b = null;
		try {
			// Convert a string to ISO-8859-1 bytes in a ByteBuffer
			java.nio.ByteBuffer bbuf = encoder.encode(CharBuffer
					.wrap("Agora eu acho que essa naba vai =)"));
			b = bbuf.array();
		} catch (CharacterCodingException e) {
			System.out.println(e.getMessage());
		}

		String data = null;
		try {
			data = new String(b, "ISO-8859-1");
		} catch (UnsupportedEncodingException e) {
			System.out.println(e.getMessage());
		}

		// get a byte matrix for the data
		BitMatrix matrix = null;
		int h = 100;
		int w = 100;
		com.google.zxing.Writer writer = new QRCodeWriter();
		try {
			matrix = writer.encode(data,
					com.google.zxing.BarcodeFormat.QR_CODE, w, h);
		} catch (com.google.zxing.WriterException e) {
			System.out.println(e.getMessage());
		}

		String filePath = "C:\\testimg.jpg";
		File file = new File(filePath);
		try {
			MatrixToImageWriter.writeToFile(matrix, "JPG", file);
			System.out.println("printing to " + file.getAbsolutePath());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

}

Espero ter ajudado.
Abraço!

_
package com.lazulli;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class MyImage implements QRCodeImage{
	
	private BufferedImage code;
	
	public MyImage(String image) {
		ImageIcon img = new ImageIcon(image);
		code = imageToByte(img.getImage());
	}

	@Override
	public int getHeight() {
		return code.getHeight();
	}

	@Override
	public int getWidth() {
		return code.getWidth();
	}
	
	@Override
	public int getPixel(int x, int y) {
		return code.getRGB(x, y);
	}
	
	
	/**
	 * Converte uma imagem em um array de bytes.
	 * @param image : imagem a ser convertida.
	 * @return Retorna o array de bytes da imagem.
	 * 
	 * @author Zell Ruskea
	 * */
	private BufferedImage imageToByte(Image image) {
        BufferedImage bi = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);  
        Graphics bg = bi.getGraphics();
        bg.drawImage(image, 0, 0, null);  
        bg.dispose();
          
        return bi;     
    }
}
C

e ai Zell, tudo blz?

jovem, preciso criar uma aplicação web para codificar e decodificar um qrCode.
pra fazer isso eu baixo as lib zxing.zip e qrcode.zip disponiveis no site da zxing e da sourceforge, né?!

após isso eu faço o que?
importo os .zip pro projeto?
o da zxing ainda estou baixando. a da sourceforge já baixei e vi que tem 2 .jar: qrcode.jar e qrcode-cui.jar.
eu só coloco os .jar?

desde ja muito obrigado por postar esses códigos.
vou começar os testes agora mesmo e volto a postar

_

Olá castrohenrique9.

Bom o esquema é o seguinte. Você vai usar o qrcode (qrcode.jar) para fazer a leitura (decodificar) os QRCodes e usar o core do zxing para criar (codificar) QRCodes. O zxing é uma API feita para dispositivos móveis. Porém da pra usar o seu core para criar RQCodes com aplicações java desktop e Web.

Bom, para que tudo funcione corretamente é bem simples. Vou te explicar como tu prepara o projeto Web (JSP) para as implementações Web. Os passos a seguir é utilizando o Eclipse:

  1. Crie o projeto web: File > New > Dynamic Web Project.
  2. No projeto, jogue na pasta /WebContent/WEB-INF/lib/ o jar do qrcode (qrcode.jar).
  3. Crie uma nova pasta no seu projeto (na raiz) chamada “zxing”.
  4. Baixe o código fonte da API zxing e pegue todos os fontes do CORE da API e jogue dentro da pasta “zxing” criada. No meu arquivo .zip com os fontes que baixei do zxing o core fica em ZXing-1.7.zip - zxing\core\src. É o conteudo da pasta src que vai pra pasta “zxing” criada.
  5. Vá nas propriedades de seu projeto e em seguida em Java Build Path. Vá para a aba Source, clique em Add Folder e selecione a pasta “zxing” criada. Isso vai dizer pro eclipse que essa pasta também deve considerar na compilação do projeto.

Depois disso, se você tiver feito tudo certo, podes criar um main e colocar o exemplo de código que eu postei ai que ele vai funcionar. Observe que o meu código é um main bem simples e desktop. Com base nele você começa as suas implementalções JSP (Web).

Se tiver mais alguma dúvida responde ai que eu tento sanar o quanto antes.

Espero ter ajudado! Boa sorte! Abraço!

C

Zell:
Olá castrohenrique9.

Bom o esquema é o seguinte. Você vai usar o qrcode (qrcode.jar) para fazer a leitura (decodificar) os QRCodes e usar o core do zxing para criar (codificar) QRCodes. O zxing é uma API feita para dispositivos móveis. Porém da pra usar o seu core para criar RQCodes com aplicações java desktop e Web.

Bom, para que tudo funcione corretamente é bem simples. Vou te explicar como tu prepara o projeto Web (JSP) para as implementações Web. Os passos a seguir é utilizando o Eclipse:

  1. Crie o projeto web: File > New > Dynamic Web Project.
  2. No projeto, jogue na pasta /WebContent/WEB-INF/lib/ o jar do qrcode (qrcode.jar).
  3. Crie uma nova pasta no seu projeto (na raiz) chamada “zxing”.
  4. Baixe o código fonte da API zxing e pegue todos os fontes do CORE da API e jogue dentro da pasta “zxing” criada. No meu arquivo .zip com os fontes que baixei do zxing o core fica em ZXing-1.7.zip - zxing\core\src. É o conteudo da pasta src que vai pra pasta “zxing” criada.
  5. Vá nas propriedades de seu projeto e em seguida em Java Build Path. Vá para a aba Source, clique em Add Folder e selecione a pasta “zxing” criada. Isso vai dizer pro eclipse que essa pasta também deve considerar na compilação do projeto.

Depois disso, se você tiver feito tudo certo, podes criar um main e colocar o exemplo de código que eu postei ai que ele vai funcionar. Observe que o meu código é um main bem simples e desktop. Com base nele você começa as suas implementalções JSP (Web).

Se tiver mais alguma dúvida responde ai que eu tento sanar o quanto antes.

Espero ter ajudado! Boa sorte! Abraço!

vou testar agora.
estou usando jsf2 com primefaces.

C

Zell
fiz o teste e funcionou, porém, para isso foi preciso fazer algumas adaptações.

de acordo com seu código, na linha 27 da classe Exemplo, tem um “new MyImage”, daí fiz o import dela.
na linha 70 o projeto não conseguia encontrar a classe MatrixToImageWriter, e realmente não havia a mesma na pasta CORE do zXing.zip que baixei.
no que baixei ela fica na pasta \ZXing-1.7\zxing\javase\src\com\google\zxing\client\j2se. Assim, criei o pacote client.j2se e copiei a classe pra ele.
dai funcionou blz.

no site da refinery encontrei SKD que também funciona, muito mais simples, basta copiar o .jar pra pasta lib e no código, faz o import do pacote e instancia um tipo QRCode.
só que não é Open Source e ao gerar, as vezes eles colocam uma marca d’agua com uma frase.
http://www.businessrefinery.com/products/barcode/barcodes/java-qr-code.html.

no site http://www.primefaces.org/showcase-labs/ui/dynamicImage.jsf também tem exemplos.


agora você sabe como faço pra ler esse qrCode com, por exemplo, uma WebCam?
no caso de já possuir o qrCode impresso e querer ler o mesmo com auxílio de JMF (Java Media Framework).

_

Vix, é vero, eu esqueci de falar da classe MatrixToImageWriter =P A minha classe MatrixToImageWriter eu reescrevi ela completamente, porque eu to fazendo a minha aplicação para Android. Mas que bom que apesar de tudo conseguisse fazer funca a budega xD

Bacana essa API da Refinery, é bem completa. O chato mesmo é esse esquema de código fechado, pois, pelo menos eu, as vezes quero custumizar algumas coisas e gosto de mexer nas classes da API. Fora que pra usar o SDK da Refinery em aplicações comerciais teríamos que comprar a licença. Como eu sou fã de APIs open source e totalmente gratuitas os exemplos que eu posto aqui no GUJ eu só utilizo APIs free e open source =)

Bom, para fazer a leitura de QRcode via WebCam utilizando JMF não é muito difícil. A API qrcode faz isso e forcene um exemplo bem legal. É claro, o exemplo dos desenvolvedores da API é um exemplo a grosso modo, apenas pra mostrar como funciona. Então você pega ele e customiza como for melhor para a sua aplicação. Lembrando também que esse exemplo é de uma aplicação Desktop e não Web. O exemplo com JMF está no seu arquivo .zip do qrcode: [b]qrcode.zip - qrcode\example\jmf[/b] .
Lá tem uma classe chamada jmfexample, é essa classe que contem o método main. Executa essa classe que ela vai abrir um exemplo que lé QRCodes de sua WabCam. Mas é claro, para que ela funcione corretamente você deve ter o JMF instalado e devidamente configurado em seu projeto, se não nem compila.
Eu tive alguns problemas no inicio porque a WebCam do meu note é meio “diferente”, então tive que mexer na classe que carrega a minha WebCam para funcionar. Se você tiver algum problema nisso também posta aqui, quem sabe seja o mesmo problema que eu tive. Assim no que eu puder ajudar eu ajudo.

É isso ai. Good Luck!
Abraço!

C

estou tentando testar a JFM pra ler o qrCode, só que ao executar o projeto aparece uma mensagem falando que não há câmera conectada.

sabe como posso resolver isso?

_

Sei, eu tive esse mesmo problema. Só que pra arrumar isso eu mexi nas classes. Agora eu não lembro tudo o que eu fiz nelas pra te explica, ainda mais que ando meio sem tempo (To fazendo TCC -.-). Faz assim… me manda um e-mail que eu te passo as minhas classes funcionando certinho.

Meu e-mail: [email removido]

Abraço! o/

C

te adicionei no gtalk. manda o email
castrohenrique9

meu tcc é o q estou fazendo com qrCode.

C

aproveitando o topico, queria tirar uma duvida referente ao QR Code

O problema é o seguinte, seguindo o exemplo acima, eu coloco o texto e coloco um caractere de quebra de linha \n, ao ler o qrcode gerado, ele não exibe as linhas acima do \n, somente a ultima. Exemplo

java.nio.ByteBuffer bbuf = encoder.encode(CharBuffer .wrap("Teste \n Nova Linha"));

Ao visualizar só aparece o seguinte

Nova linha

Já tentei usando \n
e até mesmo o codigo ASCII e não da certo, só exibe a ultima linha. Necessito exibir as informações em varias linhas

Desde já agradeço a ajuda

C

jovem,

até hoje tenho problemas com a leitura do qrCode co webCam.

alguma dica??

preciso com urgência.

C

creio q o qrCode não identifica o “\n”

R

Ola. Esta tentado executar seu código, mas obtenho erro de tipos diferentes, ocorrido na linha 61 da classe Exemplo. O write retorna um ByteMatrix, e a variavel matrix é do tipo BitMatrix. Como posso fazer para contornar este problema?
Vlw

C

provavelmente vc tem q importar as classes necessárias. no seu caso, a ByteMatrix.

:idea: dica: faz uma pesquisa pelo nome da classe.java na pasta da zxing q vc baixou. ela pode estar em outra pasta a não ser na “core”.

R

Oi. Por causa do tipo de arquivo (BitMatrix para ByteMatrix) eu tive problemas. Mas obtive sucesso fazendo algumas alterações no codigo da classe exemplo. Segue abaixo:

//Na linha 56 troquei o tipo para ByteMatrix

//Coloquei mais
int width = matrix.getWidth(); 
	        int height = matrix.getHeight(); 

	        byte[][] array = matrix.getArray();
	        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	        
	        for (int y = 0; y < height; y++) { 
	         for (int x = 0; x < width; x++) { 
	          int grayValue = array[y][x] & 0xff; 
	          image.setRGB(x, y, (grayValue == 0 ? 0 : 0xFFFFFF));
	         }
	        }

	        String filePath = "C:\\testimg.jpg";  
	        File file = new File(filePath);  
	        try {  
	        	 ImageIO.write(image, "png", file);
	           // MatrixToImageWriter.writeToFile(matrix, "JPG", file);  
	            System.out.println("printing to " + file.getAbsolutePath());  
	        } catch (IOException e) {  
	            System.out.println(e.getMessage());  
	        }
E

regismagnus:
Oi. Por causa do tipo de arquivo (BitMatrix para ByteMatrix) eu tive problemas. Mas obtive sucesso fazendo algumas alterações no codigo da classe exemplo. Segue abaixo:

//Na linha 56 troquei o tipo para ByteMatrix
//Coloquei mais

int width = matrix.getWidth();

int height = matrix.getHeight();
byte[][] array = matrix.getArray();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        
        for (int y = 0; y < height; y++) { 
         for (int x = 0; x < width; x++) { 
          int grayValue = array[y][x] & 0xff; 
          image.setRGB(x, y, (grayValue == 0 ? 0 : 0xFFFFFF));
         }
        }

        String filePath = "C:\\testimg.jpg";  
        File file = new File(filePath);  
        try {  
        	 ImageIO.write(image, "png", file);
           // MatrixToImageWriter.writeToFile(matrix, "JPG", file);  
            System.out.println("printing to " + file.getAbsolutePath());  
        } catch (IOException e) {  
            System.out.println(e.getMessage());  
        }

Olá regismagnus,

Como você fez para inicializar o objeto da classe ByteMatrix?

Obrigado!

R

Desculpe não havia colocado esta parte por, não ter mudado muito ela, apenas troquei o BitMatriz por ByteMatrix

ByteMatrix matrix = null;  
        int h = 100;  
        int w = 100;  
        com.google.zxing.Writer writer = new QRCodeWriter();  
        try {  
             //Aqui ele ta retornando ByteMatrix
            matrix = writer.encode(data,  
                    com.google.zxing.BarcodeFormat.QR_CODE, w, h);  
        } catch (com.google.zxing.WriterException e) {  
            System.out.println(e.getMessage());  
        }

Dai pra cima é igual do primeiro código feito pelo Zell

D

E ae galera, alguém sabe onde eu consigo achar o jar Qrcode.jar?

C

Não entendi ainda como foi feito parar o Writer retornar ByteMatrix, não consegui modificar o meu código para ele retornar corretamente… Poderia por favor dar um help?
Fiz as alterações como disse, porém continua BitMatrix para o writer.encode

C

Consegui resolvendo usando o bendito BitMatrix mesmo e não fazendo a troca das cores do for de baixo, desta forma não precisei pegar o array.
Obrigado

M

Amigos preciso utilizar a biblioteca com Action Script.
NO exemplo rodou legal no Android mas não consegui ler EAN 13

Poderiam dar uma dica ?

Obrigado.

R

Boa tarde,

eu consigo adaptar para o jsf ?

tem um exemplo ?

C

Zell
29/09/2011 14:23:04 Assunto: Re:ZXing
Vix, é vero, eu esqueci de falar da classe MatrixToImageWriter =P A minha classe MatrixToImageWriter eu reescrevi ela completamente, porque eu to fazendo a minha aplicação para Android. Mas que bom que apesar de tudo conseguisse fazer funca a budega xD

Bacana essa API da Refinery, é bem completa. O chato mesmo é esse esquema de código fechado, pois, pelo menos eu, as vezes quero custumizar algumas coisas e gosto de mexer nas classes da API. Fora que pra usar o SDK da Refinery em aplicações comerciais teríamos que comprar a licença. Como eu sou fã de APIs open source e totalmente gratuitas os exemplos que eu posto aqui no GUJ eu só utilizo APIs free e open source =)

Boa a todos do forum, como podem perceber sou o mais novato possível.
estou com um gde problema, tenho um projeto integrado na facu, que equivale ao tcc, e preciso fazer um aplicativo para android, que construa QR, vi em um post do Zell, alguma coisa sobre o assunto, gostaria de saber se pode me ajudar com links e tbm algumas partes de codigo java para o andriod a esse respeito, fico gradecido.

L
classe que faltava no incio do tópico
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.encoder.ByteMatrix;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.awt.image.BufferedImage;

/**
 * Writes a {@link BitMatrix} or {@link ByteMatrix} to {@link BufferedImage}, file or stream.
 * Provided here instead of core since it depends on Java SE libraries.
 *
 * @author Sean Owen
 */
public final class MatrixToImageWriter {

	private static final int BLACK = 0x00FFFFFF;
	  private static final int WHITE = 0xFFFFFFFF;

  private MatrixToImageWriter() {}

  public static BufferedImage toBufferedImage(BitMatrix matrix) {
    int width = matrix.getWidth();
    int height = matrix.getHeight();
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
      }
    }
    return image;
  }

  public static BufferedImage toBufferedImage(ByteMatrix matrix) {
    int width = matrix.getWidth();
    int height = matrix.getHeight();
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        image.setRGB(x, y, matrix.get(x, y) == 0 ? WHITE : BLACK);
      }
    }
    return image;
  }

  public static void writeToFile(BitMatrix matrix, String format, File file)
          throws IOException {
    BufferedImage image = toBufferedImage(matrix);
    ImageIO.write(image, format, file);
  }

  public static void writeToFile(ByteMatrix matrix, String format, File file)
          throws IOException {
    BufferedImage image = toBufferedImage(matrix);
    ImageIO.write(image, format, file);
  }

  public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)
          throws IOException {
    BufferedImage image = toBufferedImage(matrix);
    ImageIO.write(image, format, stream);
  }

  public static void writeToStream(ByteMatrix matrix, String format, OutputStream stream)
          throws IOException {
    BufferedImage image = toBufferedImage(matrix);
    ImageIO.write(image, format, stream);
  }

}
to em dúvida nessa parte aqui:
private static final int BLACK = 0x00FFFFFF;
	  private static final int WHITE = 0xFFFFFFFF;

se alguém conseguir posta aí

D

lwerner02
Essas variaveis BLACK e WHITE e para guardar as cores do qrcode, esta e sua duvida a respeito ???

L

está parte está ok, porém as variáveis hexadecimais não correspondem a cor branca e preta no momento de geração do QR code

L

gostaria de saber se exite algum outro padrão existente, ou algo semelhante

D

pele observação o método abaixo

image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);

e para definir as cores da imagem no padrão RGB utilizando as variáveis BLACK e WHITE , acho q na hora de gerar a imagem aquele dado hexadecimal é interpretado como um ponteiro. deve ter algumas constantes do sistemas com as cores ja definida que vc possa utilizar nao sei te dizer qual biblioteca elas estão.

O Java guarda cores no formato inteiro exemplo:

int branco = 255255255, preto = 000;

e desta forma que o java reconhece cores.

X

Sounds very interesting a topic, though I can’t understand well with the language here, this do reminded me lots of the [color=#333333]barcode decoder .net[/color].

Criado 21 de agosto de 2009
Ultima resposta 7 de jul. de 2014
Respostas 30
Participantes 14