ZXing

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

vlwwwww

Obrigado

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

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!

[quote=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!

[/quote]

vou testar agora.
estou usando jsf2 com primefaces.

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!

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: zell.ruskea@gmail.com

Abraço! o/

te adicionei no gtalk. manda o email
castrohenrique9

meu tcc é o q estou fazendo com qrCode.

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

jovem,

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

alguma dica??

preciso com urgência.

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

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

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”.

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

[quote=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());  
        }  
[/quote]

Olá regismagnus,

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

Obrigado!

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

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