Bien, entonces voy a aprovechar la posibilidad de que alguien aquí haya usado zxing antes. Estoy desarrollando una aplicación Java, y una de las cosas que necesita hacer es codificar una matriz de datos de bytes en un Código QR y luego decodificarlo en un momento posterior.Codificación y codificación de código QR usando zxing
He aquí un ejemplo de lo que mi codificador parece:
byte[] b = {0x48, 0x45, 0x4C, 0x4C, 0x4F};
//convert the byte array into a UTF-8 string
String data;
try {
data = new String(b, "UTF8");
}
catch (UnsupportedEncodingException e) {
//the program shouldn't be able to get here
return;
}
//get a byte matrix for the data
ByteMatrix matrix;
com.google.zxing.Writer writer = new QRCodeWriter();
try {
matrix = writer.encode(data, com.google.zxing.BarcodeFormat.QR_CODE, width, height);
}
catch (com.google.zxing.WriterException e) {
//exit the method
return;
}
//generate an image from the byte matrix
int width = matrix.getWidth();
int height = matrix.getHeight();
byte[][] array = matrix.getArray();
//create buffered image to draw to
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//iterate through the matrix and draw the pixels to the image
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));
}
}
//write the image to the output stream
ImageIO.write(image, "png", outputStream);
La matriz de bytes principio en este código se usa sólo para probarlo. Los datos de bytes reales serán variados.
Aquí es lo que mi decodificador ve así:
//get the data from the input stream
BufferedImage image = ImageIO.read(inputStream);
//convert the image to a binary bitmap source
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
//decode the barcode
QRCodeReader reader = new QRCodeReader();
Result result;
try {
result = reader.decode(bitmap, hints);
} catch (ReaderException e) {
//the data is improperly formatted
throw new MCCDatabaseMismatchException();
}
byte[] b = result.getRawBytes();
System.out.println(ByteHelper.convertUnsignedBytesToHexString(result.getText().getBytes("UTF8")));
System.out.println(ByteHelper.convertUnsignedBytesToHexString(b));
convertUnsignedBytesToHexString(byte)
es un método que convierte una matriz de bytes en una cadena de caracteres hexadecimales.
Cuando trato de ejecutar estos dos bloques de código juntos, esta es la salida:
48454c4c4f
202b0b78cc00ec11ec11ec11ec11ec11ec11ec
Es evidente que se está codificando el texto, pero los bytes de datos son completamente apagado. Cualquier ayuda sería apreciada aquí.
captureActivity de la cámara y después de la decodificación de ella, muestra los resultados según el tipo de datos almacenados en el código QR. p.ej. si la URL del sitio web está codificada en código QR, la pantalla de resultados tendrá un botón para abrir esa URL y así poder verla. Necesito leer la imagen de la tarjeta SD, decodificarla y manejar la salida de la misma manera que lo hace zxing en caso de descodificación a través de captureActivity. ¿Qué debo hacer después de obtener la salida en "Result result"? –
Debería publicar una nueva pregunta preguntándole esto, con ejemplos de su código. Obtendrás una mejor respuesta haciendo eso de la que podría brindar aquí. – LandonSchropp