Está en la página 1de 191

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

ESCUELA TCNICA SUPERIOR DE INGENIERA INFORMTICA INGENIERA INFORMTICA

GENERADOR E INTERPRETE QR CODE

Realizado por: Gins Miguel Fernndez Ordez

Dirigido por: Jos Ramn Portillo Fernndez

Departamento de MATEMTICA APLICADA I

Sevilla, Diciembre de 2009

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

ndice
0. Qu es QR Code?............................................................................ 5 1. Definicin de objetivos.. 9 2. Resumen del estndar QR Code.. 12
2.1 Trminos y definiciones del estndar. 12 2.2 Caractersticas principales.15 2.3 Estructura del smbolo.. 16 2.4 Codificacin de un QR Code 21 2.4.1 Anlisis de los datos.. 22 2.4.2 Codificacin de los datos. 23 2.4.2.1 Conversin de bits de datos a codewords 25 2.4.3 Correccin de errores 29 2.4.4 Construir la secuencia final de Codewords.. 37 2.4.5 Colocacin de Codewords en la matriz 37 2.4.6 Enmascarar los datos.. 39 2.4.7 Informacin de formato.. 41 2.4.8 Informacin de versin. 42

2.5 Decodificacin de un QR Code. 43

3. Anlisis de antecedentes y aportacin realizada.. 48 4. Anlisis de requisitos 51

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

5. Diseo de la aplicacin58
5.1 Diseo de la interfaz grfica..59 5.2 Diseo de la Librera 63

6. Implementacin de la aplicacin. 65
6.1 Paquetes. 65 6.2 Listado de clases....66

6.2.1 Clase QRCodeEncoderDecoderGUI.68


6.2.2 Clase QRCodeDecoder 74

6.2.3 Clase QRCodeEncoder 79 6.2.4 Interface QRCodeImage 86 6.2.5 Clase QRCodeConstantes 87 6.2.6 Clase QRCodeSymbol 89 6.2.7 Clase BCH15_5. 96 6.2.8 Clase EncodingFailedException..100 6.2.9 Clase DecodingFailedException..102 6.2.10 Clase Axis103 6.2.11 Clase Line.. 105 6.2.12 Clase Point 109 6.2.13 Clase SamplingGrid.. 113 6.2.14 Clase AlignmentPattern.. 117 6.2.15 Clase FinderPattern 120 6.2.16 Clase LogicalSeed. 126 6.2.17 Clase QRCodeDataBlockReader.128 6.2.18 Clase QRCodeImageReader.. 132
6.2.19 Interface Color.. 138

6.2 Interface DebugCanvas.141


6.2 Clase ConsoleCanvas 142 6.2 Clase ContentConverter144 6.2 Clase QRCodeUtility 146

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

7. Instalacin previa150 8. Manual de usuario... 153 9. Pruebas.. 160 10. Comparacin con otras alternativas 168 11. Posibles mejoras ..179 12. Conclusiones... 183 13. Costes de desarrollo y Anlisis temporal186 13. Bibliografa. 190

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

0. Qu es QR Code?
QR Code o Quick Response Code (Cdigo de Respuesta Rpida), es un estndar de cdigo de barras bidimensional. Fue creado en Japn en el ao 1994 por la empresa Denso Wave. Esta empresa japonesa distribuye las especificaciones del mismo de manera libre y aunque posee una patente sobre el QR Code, no ejerce los derechos sobre la misma. Existen dos estndares de los QR Code, el japons JIS X 0510, creado por la JIS y distribuido en enero de 1999; y el correspondiente estndar de la ISO, ISO/IEC 18004 aprobado en junio de 2000 y revisado en 2006 (ISO/IEC 18004:2006). El xito probado del QR Code se debe precisamente a su estndar abierto y a que su decodificacin puede realizarse con cualquier telfono mvil con cmara sin ser importante la calidad de sta. En Japn est muy extendido su uso y es raro que los mviles no vengan con software incorporado para decodificarlos.

Ventajas del QR Code: El QR Code es capaz de contener informacin en ambas direcciones (verticalmente y horizontalmente) a diferencia de los tradicionales cdigos de barra (de una dimensin), que tan slo son capaces de almacenar informacin en una direccin. Precisamente por este motivo, la capacidad de almacenamiento es mayor en el caso del QR Code (as es posible almacenar 7089 caracteres numricos o 2953 bytes). La unidad de informacin de un cdigo unidimensional es la barra, en uno bidimensional es el mdulo (cuadradito).

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Adems aporta otras caractersticas muy interesantes: Los QR Codes tiene la capacidad de corregir errores. Se pueden restaurar los datos si parte del cdigo est daado o manchado. Existen varios niveles de correccin de errores, pudiendo llegar a restaurar hasta el 30% de la informacin perdida debido a la suciedad, deterioro del cdigo, etc. El sistema de correccin de errores se basa en Reed Solomon.

Los QR Codes pueden ser ledo a alta velocidad (Quick Response) desde todas las orientaciones (en 360). Esto es debido a que posee unos patrones (patrones localizadores) que permiten detectar la posicin del cdigo. As, aunque es necesario mantener una lnea de visin directa entre el cdigo y el lector la posicin de la etiqueta no es crtica, a diferencia de los cdigos de barras. Si la imagen no esta recta se detecta su orientacin y se rota.

El uso del QR Code se ha popularizado (sobre todo en pases como Japn) gracias a la combinacin de tres factores: La publicacin de las especificaciones del cdigo. Esto ha permitido la proliferacin de lectores de QR Code de muy bajo coste o incluso gratuitos. Adems, se han desarrollado aplicaciones de software que permiten descifrar el QR Code. Muchas de ellas son gratuitas.

La integracin con dispositivos mviles (telfonos y PDAs). Esto ha permitido que la mayora de los telfonos puedan leer los QR Code, puesto que slo necesitan tener una cmara de fotos para la captura de los cdigos y una aplicacin (que en muchos casos es gratuita) para descifrar la informacin contenida en los mismos. Muchos de los principales fabricantes de telefona mvil incorporar de serie en algunos de sus dispositivos aplicaciones para leer QR Codes.

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Adems QR Code soporta los caracteres del alfabeto japons Kanji y viene preparado para poder soportar cualquier otro lenguaje.

El factor comn predominante en la gran parte de las aplicaciones existentes es la utilizacin de los QR Codes como almacn de informacin, que al ser decodificada mediante un dispositivo lector (que puede ser el propio telfono mvil), redirige a una pgina web que el usuario puede consultar a travs de su dispositivo mvil.

Existen otros cdigos de informacin bidimensionales, como el DataMatrix tambin estandarizado. La principal diferencia de QR Code de respecto de DataMatrix y dems es la velocidad a la que se decodifica, de ah el nombre de Quick Response. Los QR Code poseen un patrn de localizacin que se coloca en la esquina superior izquierda, en la superior derecha y en la inferior izquierda. Esto ayuda a la deteccin de la orientacin del QR Code y sus lmites. No es necesario que la imagen tomada sea de gran calidad. La desventaja de esto es que se pierde espacio para almacenar datos. Por estas razones, DataMatrix es ms utilizado para uso industrial y QR Code para uso cotidiano.

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

DataMatrix

QR Code con los patrones localizadores resaltados

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

1. Definicin de objetivos
Los objetivos de este proyecto son tres principalmente:

1) Comprender y dar una explicacin de la especificacin del estndar QR Code 2006, su algoritmo de codificacin y decodificacin, as como las partes que componen los smbolos, sus diferentes versiones y caractersticas.

2) Desarrollar una librera en Java que sirva tanto para generar smbolos QR Code compatibles con el estndar QR Code 2006, como para interpretar un smbolo QR Code 2006 compatible y ver su mensaje. La librera tambin debe implementar algunos algoritmos de pretratamiento de imgenes para mejorar la probabilidad de xito en la interpretacin. Adems la complejidad temporal de la generacin y sobre todo de la interpretacin debe ser ptima ya que debe poder ejecutarse en dispositivos mviles y PDAs.

3) Desarrollar una aplicacin Windows en lenguaje Java, que utilizando la librera anterior sirva para generar e interpretar smbolos QR Code, y que permita especificar y usar las caractersticas principales del estndar; como son las diferentes versiones de smbolos, formatos de datos, niveles de correccin de errores, etc.

Necesitamos informacin abundante y contrastada sobre el funcionamiento del estndar QR Code 2006 para poder estudiar y comprender el funcionamiento de los QR Code, su codificacin y decodificacin, y sus opciones. La compaa japonesa Denso Wave, es la creadora de los QR Code y tras su creacin en 1994 decidi distribuir libremente su especificacin y regalarlo al mundo. Ms tarde, en el ao 2000, la ISO (International Organization for Standardization), junto con la IEC (International Electrotechnical Commission), crean un documento oficial de estndar en ingls. Este documento explica a fondo cmo funcionan los QR Codes y sus caractersticas y en los dos aos siguientes sacan varias revisiones de este 9

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

documento; siendo la ltima versin la ISO/IEC 18004 2006 con ttulo: Information technology Automatic identification and data capture techniques QR Code 2006 bar code symbology specification. Por desgracia este documento no es libre; posee copyright y se vende en las webs de ambas organizaciones. Un ao antes en el 1999, la JIS (Japanese Industrial Standards), cre otro documento oficial, el JIS X0510 con el mismo estndar QR Code, ambos estndares son compatibles. El JIS X0510 est escrito en japons pero es libre y su ltima versin es del 2004.

Como necesitamos desarrollar una librera de funciones capaz de emular el estndar y que pueda ser utilizada por cualquier programa, necesitamos un lenguaje de alto nivel moderno orientado a objetos, Java es una buena opcin. Teniendo en cuenta el lenguaje de alto nivel que utilizamos, se tiene la posibilidad de la fcil reutilizacin de cdigo para futuras mejoras, lo cual ayuda a un posterior desarrollo o estudio de la aplicacin a disear. Necesitamos que la librera a crear sea fcilmente portable y usable, el lenguaje Java facilita la portabilidad de los programas implementados con l, gracias a su tecnologa basada en maquinas virtuales.

La ejecucin de los procesos de codificacin y de decodificacin debe ser rpida, los algoritmos deben tener una complejidad temporal lo ms baja posible. Hay que centrarse en comprobar la complejidad de los cuellos de botella. Aunque tambin hay que tener en cuenta que para el caso de los QR Codes, el tamao de los datos tiene un lmite, al menos a la hora de codificar. La versin de smbolo QR Code con mayor capacidad de datos puede almacenar hasta 7089 caracteres numricos (2953 en ASCII). Para la decodificacin el tamao de los datos depender del nmero de pixeles de la imagen que contiene el QR Code a decodificar.

La aplicacin grfica a crear ser de tipo ventana para aumentar su usabilidad. Debe ser capaz de mostrar y generar imgenes y fotos, ya que los cdigos de barra QR Code son imgenes normalmente obtenidas con cmaras. El programa contendr controles para poder especificar las diferentes opciones que nos ofrece el estndar para crear e interpretar un smbolo QR Code 2006.

10

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

11

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

2. Resumen del estndar QR Code


2.1 Trminos y definiciones del estndar

Comenzaremos dando una definicin de los principales trminos del estndar QR Code:

Bit de relleno: Se usa para rellenar el codeword final despus del terminador en una cadena de bits de datos.

Bits restantes: Usado para llenar posiciones de la regin de codificacin donde el espacio no se divide exactamente en 8 bits.

Codeword: Conjunto de 8 mdulos que puede tener diferentes formas dependiendo de su localizacin en el smbolo y que sirve para almacenar informacin codificada de los datos o de la correccin de errores.

Codeword restante: Codeword de relleno para llenar posiciones sin codeword asignado para completar la capacidad total del smbolo. Va detrs de los codewords de correccin de error.

Contador de caracteres: Secuencia de bits que define el numero de caracteres que contiene una cadena de datos en un modo.

12

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Enmascarado de los datos: Proceso en el cual, a los mdulos de la regin de codificacin, se les realiza una operacin XOR con un patrn mscara. Esto sirve para aumentar la diferenciacin entre mdulos blancos y negros y as mejorar la decodificacin.

Indicador de modo: Identificador de 4 bits que indica en qu modo est codificada la secuencia de bits que le sigue.

Informacin de formato: Patrn codificado que contiene informacin sobre el grado de correccin de errores con el que se han codificado los datos de la regin de codificacin y el tipo de mscara que se les ha aplicado.

Informacin de versin: Patrn codificado en los smbolos de versin 7 o superior que contiene informacin que indica la versin del smbolo.

Modo: Forma en que se representa un conjunto de datos como cadena de bits. La cadena de bits puede representar caracteres alfanumricos, numricos, bytes, Kanji o cualquier otro que se defina.

Mdulo: Cuadrito blanco o negro que en conjunto componen el smbolo QR Code.

Patrn de alineamiento: Patrn de funcin que permite resincronizar las coordenadas de mapeo de la imagen QR Code ante posibles distorsiones moderadas de sta.

13

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Patrn de funcin: Partes del smbolo que no contiene los datos codificados, sino informacin necesaria para la decodificacin de stos. Los patrones de funcin son: patrn de localizacin, separador, patrn de alineamiento y patrn temporizador.

Patrn localizador: Patrn de funcin que existe por triplicado en el smbolo, situado en las esquinas superiores y la inferior izquierda. Sirven para calcular la orientacin rotacional del smbolo.

Patrn temporizador: Secuencia de alternada de mdulos blancos y negros que ayuda a calcular las coordenadas de los mdulos del smbolo.

Regin de codificacin: Regin del smbolo no ocupada por patrones de funcin y s por codewords de datos y de correccin de errores, y tambin por la informacin de formato y versin.

Smbolo: Es toda la imagen QR Code, formada por mdulos, que conforman los datos en la regin de codificacin, y los patrones de funcin.

Separador: Patrn de funcin formado por mdulos blancos, cuyo ancho es de un mdulo y que separa los patrones localizadores del resto del smbolo.

Terminador: Secuencia de bits a 0 cuyo nmero vara segn el smbolo y que sirve para sealar el fin de la cadena de bits que representa los datos.

14

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin: Tamao del smbolo que puede ir desde la versin 1 con 21x21 mdulos hasta la 40 con 177x177 mdulos. Dependiendo de la versin, el smbolo puede tener o no algunos de los elementos descritos y en diferente nmero; alineamiento y la informacin de versin. especialmente patrones de

Zona de silencio: Zona que rodea al smbolo que debe estar en blanco (negro en caso de reflectancia inversa) para delimitar correctamente sus bordes, debe tener una anchura mnima de 4 mdulos.

2.2 Caractersticas principales

Los smbolos QR Code tienen 40 versiones y 4 grados de correccin de error (L, M, Q, H). Un smbolo 40-H sera un smbolo de versin 40 y correccin de errores H. Cada versin tiene un tamao, siendo la 1 de 21x21 mdulos y la 40 de 177x177 mdulos, creciendo en 4 mdulos el tamao de cada versin (la versin 2 sera de 25x25 mdulos).

Hay 4 modos de codificar los caracteres de datos:

1) Datos numricos (0-9) 2) Datos alfanumricos (0-9, A-Z y otros 9 caracteres: espacio, $, %, *, +, -, ., /, :) 3) Bytes (por defecto ISO/IEC 8859-1) 4) Caracteres Kanji, compactados en 13 bits (caracteres de la escritura japonesa)

Para un smbolo 40-L el nmero mximo de datos que puede contener es: Datos numricos: 7089 caracteres Datos alfanumricos: 4296 caracteres Bytes: 2953 caracteres Caracteres Kanji: 1817 caracteres

15

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

El sistema correccin de errores se basa en Reed Solomon y tiene 4 niveles:

1) L (low) bajo, puede corregir hasta el 7% de los codewords del smbolo. 2) M (mdium) medio, puede corregir hasta el 15% de los codewords del smbolo. 3) Q (quality) calidad, puede corregir hasta el 25% de los codewords del smbolo. 4) H (high) alto, puede corregir hasta el 30% de los codewords del smbolo.

Los mdulos del smbolo QR Code pueden ser blancos o negros y representan respectivamente el 0 y el 1 binario. Sin embargo existe un modo de reflectancia inversa donde es al revs. QR Code puede soportar el que la imagen con el smbolo est rotada o transpuesta lateralmente (mirror image), tiene independencia de orientacin.

Ejemplos de QR Codes: a) orientacin y reflectancia normal b) orientacin normal y reflectancia invertida c) orientacin transpuesta y reflectancia normal d) orientacin transpuesta y reflectancia invertida

2.3 Estructura del smbolo

Los QR Code 2005 estn formados por mdulos colocados en una estructura cuadrada. sta estructura contiene la regin de codificacin y los patrones de funcin, que son: localizador, separador, temporizador y de alineamiento. El smbolo debe estar rodeado en sus cuatro lados por una zona de silencio.

16

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Estructura de un smbolo QR Code versin 7

Hay 40 versiones cada una con un nmero de mdulos, la versin 1 tiene 21x21 mdulos y la 40 177x177; el nmero de mdulos se incrementa de 4 en 4 de una versin a otra. Las versiones tambin se diferencian en el nmero de codewords que contienen y el de patrones de alineamiento, algunas tienen bits de relleno pero otras no. las versiones anteriores a la 7 no tienen informacin de versin, la versin 1 no tiene ningn patrn de alineamiento. Todas tienen tres patrones localizadores, dos patrones temporizadores, tres separadores y la informacin de formato por duplicado.

17

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

18

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

El patrn localizador se sita en las esquinas superior izquierda, superior derecha e inferior izquierda del smbolo QR Code. Est formado por un cuadrado relleno de 3x3 mdulos negros, rodeado de un cuadrado de 5x5 mdulos blancos que a su vez est rodeado por otro cuadrado de 7x7 mdulos negros. Ser muy difcil encontrar un patrn de mdulos similar a este en otras partes del smbolo. Tener xito en encontrar los 3 patrones localizadores de un smbolo supone poder calcular la orientacin en el campo de visin de ste.

Patrn localizador

Los separadores estn formados por mdulos blancos y rodean los bordes de los patrones localizadores que dan a la parte interior del smbolo.

Los patrones temporizador son dos, uno vertical y otro horizontal. Estn formados por una lnea o columna de mdulos blancos y negros alternados, comenzando y terminando en un mdulo negro. Posibilitan que la versin del smbolo y las coordenadas de los mdulos puedan ser determinadas. El temporizador horizontal cruza la fila nmero 6 entre los separadores superiores y el vertical igual pero cruzando la columna 6.

Los patrones de alineamiento estn formados por un mdulo negro, rodeado de un cuadrado de 3x3 mdulos blancos que a su vez est rodeado por otro cuadrado de 5x5 mdulos negros. Su nmero en el smbolo vara segn la versin.

19

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

La regin de codificacin contiene los codewords que representan los datos, tambin contiene codewords de correccin de errores, la informacin de formato y la informacin de versin en la mayora de casos.

La zona de silencio debe tener un grosor de 4 mdulos rodeando los cuatro bordes del smbolo.

20

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Capacidad de las diferentes versiones de QR Code

Versin

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

mero de mdulos por lado 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 101 105 109 113 117 121 125 129 133 137 141 145 149 153 157 161 165 169 173 177

Mdulos de patrones de funcin 202 235 243 251 259 267 390 398 406 414 422 430 438 611 619 627 635 643 651 659 882 890 898 906 914 922 930 1203 1211 1219 1227 1235 1243 1251 1574 1582 1590 1598 1606 1614

Mdulos de informacin de formato y versin 31 31 31 31 31 31 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67

Mdulos de datos

Codewords de datos

Bits restantes

208 359 567 807 1079 1383 1568 1936 2336 2768 3232 3728 4256 4651 5243 5867 6523 7211 7931 8683 9252 10068 10916 11796 12708 13652 14628 15371 16411 17483 18587 19723 20891 22091 23008 24272 25568 26896 28256 29648

26 44 70 100 134 172 196 242 292 346 404 466 532 581 655 733 815 901 991 1085 1156 1258 1364 1474 1588 1706 1828 1921 2051 2185 2323 2465 2611 2761 2876 3034 3196 3362 3532 3706

0 7 7 7 7 7 0 0 0 0 0 0 0 3 3 3 3 3 3 3 4 4 4 4 4 4 4 3 3 3 3 3 3 3 0 0 0 0 0 0

21

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

2.4 Codificacin de un QR Code

El procedimiento de codificacin se divide en 7 pasos:

1. Anlisis de los datos: Se analizan los datos a codificar identificando de qu tipo son sus caracteres, para calcular en que modos codificarlos para ahorrar el mximo espacio. El estndar soporta varios modos de codificacin, pudiendo usarse a la vez diferentes modos para cada subconjunto de caracteres. Si no se especific que versin usar, se debera usar la menor necesaria.

2. Codificacin de datos: Se convierten los datos en un flujo de bits acorde al modo usado. Se inserta un indicador de modo delante de cada subconjunto de datos para saber en qu modo estn codificados. Tambin se inserta un terminador y se dividen los datos en codewords de 8bit.

3. Codificacin de correccin de errores Se ejecuta el algoritmo de correccin de error, para generar los codewords de correccin de errores. stos se aaden al final de los codewords de datos.

4. Estructurar mensaje Entrelazar los codewords de datos y de error, y aadir bits restantes si es necesario.

5. Colocacin de mdulos Se colocan lo mdulos de los codewords en la matriz QR Code junto a los patrones de funcin para formar el smbolo QR Code.

6. Enmascarar datos

22

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Aplicar los patrones de enmascarado a la regin de codificacin. Evaluar los resultados y seleccionar el patrn que optimice el equilibrio de mdulos blancos y negros y minimice la aparicin de patrones indeseables.

7. Informacin de versin y formato Generar la informacin de formato y la de versin si es necesario, y colocarla en el smbolo para completarlo.

2.4.1 Anlisis de los datos

Los datos a codificar pueden tener diferentes formatos e incluso dividirse en conjuntos de diferentes tipos. Hay que analizar los datos para ver en que formatos estn y encontrar el modo ptimo en el cual codificarlos. Es posible cambiar de modo para ahorrar espacio. Es ms eficiente codificar los datos en el modo que requiere menos bits por carcter pero teniendo en cuenta el espacio de la cabecera. Cada cabecera se compone de indicador de modo y de contador de caracteres e ir delante de cada subconjunto de datos. Un conjunto pequeo de caracteres no merecer la pena codificarlo a parte en un modo diferente. Adems como las capacidades de los smbolos QR Code, aumentan de manera discreta en cada versin, no siempre es necesaria alcanzar la mxima eficiencia.
Modo numrico:

Codifica caracteres numricos del conjunto [0,9]. Normalmente, 3 caracteres numricos se representan con 10 bits en este modo.
Modo alfanumrico:

Codifica un conjunto de 45 caracteres. Los 10 dgitos del modo numrico, los 26 caracteres del alfabeto internacional y 9 smbolos ms (ESPACIO, $, %, *, +, -, . , /, :). Normalmente 2 caracteres alfanumricos se representan con 11 bits en este modo.

23

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Modo byte:

Los datos se codifican con 8 bits por carcter en cdigo ASCII, aunque podra definirse un conjunto alternativo.
Modo Kanji:

Codifica los caracteres Kanji del alfabeto japons de acuerdo con el sistema Shift Jis basado en JIS X 0208. Cada carcter de 2 bytes es compactado en un codeword de 13 bits.
Modo interpretacin de canal extendido (ICE):

Permite definir interpretaciones diferentes del conjunto de caracteres por defecto. Provee un mtodo consistente para especificar interpretaciones particulares.

2.4.2 Codificacin de los datos

Los datos se convierten en un flujo de bits consistente en uno o ms subconjuntos de modos diferentes. Si se utiliza el ICE por defecto, el flujo de bits comienza por el primer indicador de modo. Si se utilizaran uno o ms ICEs diferentes del por defecto, el flujo de bits comenzara con la cabecera ICE seguida del primer subconjunto.

La cabecera ICE se compone de indicador de modo ICE (4 bits) y de designador ICE (8, 16 o 24 bits). Empieza con el bit ms significativo del indicador de modo ICE y termina con el menos significativo del designador ICE.

Los subconjuntos se componen de indicador de modo (4 bits), de contador de caracteres y de los datos. Cada subconjunto de modo empieza con el bit ms significativo del indicador de modo y termina con el bit menos significativo del flujo de datos. No existen separadores entre los subconjuntos ya que su tamao y lugar de inicio estn delimitados inequvocamente por el indicador de modo y el contador de caracteres.

24

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

El indicador de modo tendr los siguientes valores:

Numrico = 0001 Alfanumrico = 0010 Byte = 0100 Kanji = 1000 ICE = 0111 Fin de mensaje = 0000 Bits del contador de caracteres Modo Modo Modo numrico Alfanumrico byte 10 12 14 9 11 13 8 16 16

Versin 1-9 10 - 26 27 - 40

Modo Kanji 8 10 12

Al final del ltimo subconjunto de modo se aade un terminador fin de mensaje consistente en 4 bits a cero. Puede ser omitido o reducido si la capacidad restante del smbolo es menor.

En el modo numrico, los datos de entrada se dividen en grupos de tres dgitos, cada grupo se convierte en su equivalente binario de 10 bits. Si el nmero de dgitos no es mltiplo de tres, los uno o dos ltimos son convertidos a 4 o 7 bits. Los datos binarios resultantes son entonces concatenados y se les pone como prefijo el indicador de modo y el indicador contador de caracteres.

En el modo alfanumrico, a cada carcter se le asigna un valor entre 0 y 44 acorde a la tabla siguiente:

Char.

Valor

Char.

Valor

Char.

Valor

Char.

Valor

Char.

Valor

Char.

Valor

Char.

Valor

Char.

Valor

0 1 2 3 4 5

0 1 2 3 4 5

6 7 8 9 A B

6 7 8 9 10 11

C D E F G H

12 13 14 15 16 17

I J K L M N

18 19 20 21 22 23

O P Q R S T

24 25 26 27 28 29

U V W X Y Z

30 31 32 33 34 35

SP $ % * + -

36 37 38 39 40 41

. / :

42 43 44

25

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Los caracteres se dividen en grupos de dos caracteres codificados en 11 bits. Valor del primer carcter se multiplica por 45 y el valor del segundo se le suma al este producto. La suma es entonces convertida en un nmero de 11 bits. Si el nmero de caracteres de entrada no es mltiplo de dos, el ltimo carcter se codifica en un nmero de 6 bits. Los datos binarios resultantes son concatenados y se les pone como prefijo el indicador de modo y el indicador contador de caracteres.

En el modo Byte, el valor de cada carcter es el mismo que el de su correspondiente codeword de 8 bits. Los valores resultantes se concatenan y se les pone como prefijo el indicador de modo y el indicador contador de caracteres.

Existe la posibilidad de combinar varios modos de codificacin para los datos, y as ahorrar espacio. Cada segmento de datos se codificara como se indic antes y luego se concatenaran entre s empezando cada segmento con su prefijo de indicador de modo ms indicador contador de caracteres.

Al final de los segmentos codificados se aade un terminador con una secuencia de cuatro ceros. El terminador se puede omitir si los datos completan la capacidad del smbolo o reducido a menos ceros si no caben los cuatro. 2.4.2.1 Conversin de bits de datos a codewords Los datos codificados resultantes del paso anterior ahora deben ser divididos en codewords de 8 bits. Si no fueran mltiplo de ocho se aadirn bits de relleno al ltimo codeword. Despus el mensaje resultante debe ser extendido con codewords de relleno hasta rellenar la capacidad mxima de codewords de la versin QR Code del smbolo que estamos codificando. Estos codewords de relleno son 11101100 y 00010001 que se van aadiendo de forma alternante. Despus a estos codewords se aadirn los codewords de ECC como veremos en el siguiente punto.

26

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Capacidad de un QR Code segn su versin ivel de Codewords de Versin correccin datos de errores 1 L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H 19 16 13 9 34 28 22 16 55 44 34 26 80 64 48 36 108 86 62 46 136 108 76 60 156 124 88 66 194 154 110 86 232 182 132 100 274 216 154 122 324 254 180 140 Bits de datos

Capacidad de datos umrico Alfanumrico Byte 17 14 11 7 32 26 20 14 53 42 32 24 78 62 46 34 106 84 60 44 134 106 74 58 154 122 86 64 192 152 108 84 230 180 130 98 271 213 151 119 321 251 177 137 Kanji 10 8 7 4 20 16 12 8 32 26 20 15 48 38 28 21 65 52 37 27 82 65 45 36 95 75 53 39 118 93 66 52 141 111 80 60 167 131 93 74 198 155 109 85

152 128 104 72 272 224 176 128 440 352 272 208 640 512 384 288 864 688 496 368 1 088 864 608 480 1 248 992 704 528 1 552 1 232 880 688 1 856 1 456 1 056 800 2 192 1 728 1 232 976 2 592 2 032 1 440 1 120

41 34 27 17 77 63 48 34 127 101 77 58 187 149 111 82 255 202 144 106 322 255 178 139 370 293 207 154 461 365 259 202 552 432 312 235 652 513 364 288 772 604 427 331

25 20 16 10 47 38 29 20 77 61 47 35 114 90 67 50 154 122 87 64 195 154 108 84 224 178 125 93 279 221 157 122 335 262 189 143 395 311 221 174 468 366 259 200

10

11

27

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

ivel de Codewords de Versin correccin datos de errores 12 L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H 370 290 206 158 428 334 244 180 461 365 261 197 523 415 295 223 589 453 325 253 647 507 367 283 721 563 397 313 795 627 445 341 861 669 485 385 932 714 512 406 1 006 782 568 442

Bits de datos

Capacidad de datos umrico Alfanumrico Byte 367 287 203 155 425 331 241 177 458 362 258 194 520 412 292 220 586 450 322 250 644 504 364 280 718 560 394 310 792 624 442 338 858 666 482 382 929 711 509 403 1 003 779 565 439 Kanji 226 177 125 96 262 204 149 109 282 223 159 120 320 254 180 136 361 277 198 154 397 310 224 173 442 345 243 191 488 384 272 208 528 410 297 235 572 438 314 248 618 480 348 270

2 960 2 320 1 648 1 264 3 424 2 672 1 952 1 440 3 688 2 920 2 088 1 576 4 184 3 320 2 360 1 784 4 712 3 624 2 600 2 024 5 176 4 056 2 936 2 264 5 768 4 504 3 176 2 504 6 360 5 016 3 560 2 728 6 888 5 352 3 880 3 080 7 456 5 712 4 096 3 248 8 048 6 256 4 544 3 536

883 691 489 374 1 022 796 580 427 1 101 871 621 468 1 250 991 703 530 1 408 1 082 775 602 1 548 1 212 876 674 1 725 1 346 948 746 1 903 1 500 1 063 813 2 061 1 600 1 159 919 2 232 1 708 1 224 969 2 409 1 872 1 358 1 056

535 419 296 227 619 483 352 259 667 528 376 283 758 600 426 321 854 656 470 365 938 734 531 408 1 046 816 574 452 1 153 909 644 493 1 249 970 702 557 1 352 1 035 742 587 1 460 1 134 823 640

13

14

15

16

17

18

19

20

21

22

28

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

ivel de Codewords de Versin correccin datos de errores 23 L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H 1 094 860 614 464 1 174 914 664 514 1 276 1 000 718 538 1 370 1 062 754 596 1 468 1 128 808 628 1 531 1 193 871 661 1 631 1 267 911 701 1 735 1 373 985 745 1 843 1 455 1 033 793 1 955 1 541 1 115 845 2 071 1 631 1 171 901

Bits de datos

Capacidad de datos umrico Alfanumrico Byte 1 091 857 611 461 1 171 911 661 511 1 273 997 715 535 1 367 1 059 751 593 1 465 1 125 805 625 1 528 1 190 868 658 1 628 1 264 908 698 1 732 1 370 982 742 1 840 1 452 1 030 790 1 952 1 538 1 112 842 2 068 1 628 1 168 898 Kanji 672 528 376 284 721 561 407 315 784 614 440 330 842 652 462 365 902 692 496 385 940 732 534 405 1 002 778 559 430 1 066 843 604 457 1 132 894 634 486 1 201 947 684 518 1 273 1 002 719 553

8 752 6 880 4 912 3 712 9 392 7 312 5 312 4 112 10 208 8 000 5 744 4 304 10 960 8 496 6 032 4 768 11 744 9 024 6 464 5 024 12 248 9 544 6 968 5 288 13 048 10 136 7 288 5 608 13 880 10 984 7 880 5 960 14 744 11 640 8 264 6 344 15 640 12 328 8 920 6 760 16 568 13 048 9 368 7 208

2 620 2 059 1 468 1 108 2 812 2 188 1 588 1 228 3 057 2 395 1 718 1 286 3 283 2 544 1 804 1 425 3 517 2 701 1 933 1 501 3 669 2 857 2 085 1 581 3 909 3 035 2 181 1 677 4 158 3 289 2 358 1 782 4 417 3 486 2 473 1 897 4 686 3 693 2 670 2 022 4 965 3 909 2 805 2 157

1 588 1 248 890 672 1 704 1 326 963 744 1 853 1 451 1 041 779 1 990 1 542 1 094 864 2 132 1 637 1 172 910 2 223 1 732 1 263 958 2 369 1 839 1 322 1 016 2 520 1 994 1 429 1 080 2 677 2 113 1 499 1 150 2 840 2 238 1 618 1 226 3 009 2 369 1 700 1 307

24

25

26

27

28

29

30

31

32

33

29

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

ivel de Codewords de Versin correccin datos de errores 34 L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H L M Q H 2 191 1 725 1 231 961 2 306 1 812 1 286 986 2 434 1 914 1 354 1 054 2 566 1 992 1 426 1 096 2 702 2 102 1 502 1 142 2 812 2 216 1 582 1 222 2 956 2 334 1 666 1 276

Bits de datos

Capacidad de datos umrico Alfanumrico Byte 2 188 1 722 1 228 958 2 303 1 809 1 283 983 2 431 1 911 1 351 1 051 2 563 1 989 1 423 1 093 2 699 2 099 1 499 1 139 2 809 2 213 1 579 1 219 2 953 2 331 1 663 1 273 Kanji 1 347 1 060 756 590 1 417 1 113 790 605 1 496 1 176 832 647 1 577 1 224 876 673 1 661 1 292 923 701 1 729 1 362 972 750 1 817 1 435 1 024 784

17 528 13 800 9 848 7 688 18 448 14 496 10 288 7 888 19 472 15 312 10 832 8 432 20 528 15 936 11 408 8 768 21 616 16 816 12 016 9 136 22 496 17 728 12 656 9 776 23 648 18 672 13 328 10 208

5 253 4 134 2 949 2 301 5 529 4 343 3 081 2 361 5 836 4 588 3 244 2 524 6 153 4 775 3 417 2 625 6 479 5 039 3 599 2 735 6 743 5 313 3 791 2 927 7 089 5 596 3 993 3 057

3 183 2 506 1 787 1 394 3 351 2 632 1 867 1 431 3 537 2 780 1 966 1 530 3 729 2 894 2 071 1 591 3 927 3 054 2 181 1 658 4 087 3 220 2 298 1 774 4 296 3 391 2 420 1 852

35

36

37

38

39

40

2.4.3 Correccin de errores QR Code utiliza codificacin de control de errores (EC) de Reed-Solomon para detectar errores. Para ello se generan una serie de codewords de correccin de errores (ECC), que se aaden a los de datos. Existen cuatro niveles de EC elegibles por el usuario que quiere crear el smbolo. Los niveles son: L (Low) con 7% de capacidad de recuperacin M (Medium) con 15% de capacidad de recuperacin Q (Quality) con 25% de capacidad de recuperacin H (High) con 30% de capacidad de recuperacin

30

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Este sistema puede corregir dos tipos de codewords errneos, los que provocan que un carcter no se pueda decodificar (borrn) y los que provocan que no se decodifique en otro carcter errneo (error). Por ejemplo un mdulo que cambia de negro a blanco provoca un error. El nmero de borrones y errores corregibles por cada ECC es dado por la siguiente frmula:

x + 2y <= a b Donde: x = nmero de borrones y = nmero de errores a = nmero de ecc para borrones b = nmero de ecc para errores

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M Q H L M Q H L M Q H L M Q H L M Q H 7 10 13 17 10 16 22 28 15 26 36 44 20 36 52 64 26 48 72 88

Valor de b

Number of error correction blocks 1 1 1 1 1 1 1 1 1 1 2 2 1 2 2 4 1 2 2 2 2 2

Error correction code per block (f, g, h) (26,19,2) (26,16,4) (26,13,6) (26,9,8) (44,34,4) (44,28,8) (44,22,11) (44,16,14) (70,55,7) (70,44,13) (35,17,9) (35,13,11) (100,80,10) (50,32,9) (50,24,13) (25,9,8) (134,108,13) (67,43,12) (33,15,9) (34,16,9) (33,11,11) (34,12,11)

26

3 2 1 1 2 0 0 0 1 0 0 0

44

70

100

134

31

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M Q H L M Q H L M 36 64 96 112 40 72 108 130 48 88 132 156 60 110 160 192 72 130 192 224 80 150 224 264 96 176 260 308

Valor de b

Number of error correction blocks 2 4 4 4 2 4 2 4 4 1 2 2 2 4 2 4 2 2 3 2 4 4 4 4 2 2 4 1 6 2 6 2 4 1 4 4 4 3 8 2 2 6 2 4 6 7 4

Error correction code per block (f, g, h) (86,68,9) (43,27,8) (43,19,12) (43,15,14) (98,78,10) (49,31,9) (32,14,9) (33,15,9) (39,13,13) (40,14,13) (121,97,12) (60,38,11) (61,39,11) (40,18,11) (41,19,11) (40,14,13) (41,15,13) (146,116,15) (58,36,11) (59,37,11) (36,16,10) (37,17,10) (36,12,12) (37,13,12) (86,68,9) (87,69,9) (69,43,13) (70,44,13) (43,19,12) (44,20,12) (43,15,14) (44,16,14) (101,81,10) (80,50,15) (81,51,15) (50,22,14) (51,23,14) (36,12,12) (37,13,12 (116,92,12) (117,93,12) (58,36,11) (59,37,11) (46,20,13) (47,21,13) (42,14,14) (43,15,14)

172

196

242

Q H L M

292

Q H L M

10

346

Q H L M

11

404

Q H L M

12

466

Q H

32

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M 104 198 288 352 120 216 320 384 132 240 360 432 144 280 408 480 168 308 448 532 180 338 504 588

Valor de b

Number of error correction blocks 4 8 1 8 4 12 4 3 1 4 5 11 5 11 5 5 1 5 5 5 7 11 7 5 1 7 3 15 2 3 13 1 5 10 1 1 15 2 17 5 1 9 4 17 1 2 19

Error correction code per block (f, g, h) (133,107,13) (59,37,11) (60,38,11) (44,20,12) (45,21,12) (33,11,11) (34,12,11) (145,115,15) (146,116,15) (64,40,12) (65,41,12) (36,16,10) (37,17,10) (36,12,12) (37,13,12) (109,87,11) (110,88,11) (65,41,12) (66,42,12) (54,24,15) (55,25,15) (36,12,12) (37,13,12) (122,98,12) (123,99,12) (73,45,14) (74,46,14) (43,19,12) (44,20,12) (45,15,15) (46,16,15) (135,107,14) (136,108,14) (74,46,14) (75,47,14) (50,22,14) (51,23,14) (42,14,14) (43,15,14) (150,120,15) (151,121,15) (69,43,13) (70,44,13) (50,22,14) (51,23,14) (42,14,14) (43,15,14)

13

532

Q H L M

14

581

Q H L M

15

655

Q H L M

16

733

Q H L M

17

815

Q H L M

18

901

Q H

33

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M 196 364 546 650 224 416 600 700 224 442 644 750 252 476 690 816 270 504 750 900 300 560 810 960

Valor de b

Number of error correction blocks 3 4 3 11 17 4 9 16 3 5 3 13 15 5 15 10 4 4 17 17 6 19 6 2 7 17 7 16 34 4 5 4 14 11 14 16 14 6 4 6 14 11 16 30 2

Error correction code per block (f, g, h) (141,113,14) (142,114,14) (70,44,13) (71,45,13) (47,21,13) (48,22,13) (39,13,13) (40,14,13) (135,107,14) (136,108,14) (67,41,13) (68,42,13) (54,24,15) (55,25,15) (43,15,14) (44,16,14) (144,116,14) (145,117,14) (68,42,13) (50,22,14) (51,23,14) (46,16,15) (47,17,15) (139,111,14) (140,112,14) (74,46,14) (54,24,15) (55,25,15) (37,13,12) (151,121,15) (152,122,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (147,117,15) (148,118,15) (73,45,14) (74,46,14) (54,24,15) (55,25,15) (46,16,15) (47,17,15)

19

991

Q H L M

20

1 085

Q H L M Q H L

21

1 156

22

1 258

M Q H L M

23

1 364

Q H L M

24

1 474

Q H

34

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M 312 588 870 1050 336 644 952 1110 360 700 1 020 1 200 390 728 1 050 1 260 420 784 1 140 1 350 450 812 1 200 1 440

Valor de b

Number of error correction blocks 8 4 8 13 7 22 22 13 10 2 19 4 28 6 33 4 8 4 22 3 8 26 12 28 3 10 3 23 4 31 11 31 7 7 21 7 1 37 19 26 5 10 19 10 15 25 23 25

Error correction code per block (f, g, h) (132,106,13) (133,107,13) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (142,114,14) (143,115,14) (74,46,14) (75,47,14) (50,22,14) (51,23,14) (46,16,15) (47,17,15) (152,122,15) (153,123,15) (73,45,14) (74,46,14) (53,23,15) (54,24,15) (45,15,15) (46,16,15) (147,117,15) (148,118,15) (73,45,14) (74,46,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (146,116,15) (147,117,15) (73,45,14) (74,46,14) (53,23,15) (54,24,15) (45,15,15) (46,16,15) (145,115,15) (146,116,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

25

1 588

Q H L M

26

1 706

Q H L M

27

1 828

Q H L M

28

1 921

Q H L M

29

2 051

Q H L M

30

2 185

Q H

35

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M 480 868 1 290 1 530 510 924 1 350 1 620 540 980 1 440 1 710 570 1 036 1 530 1 800 570 1 064 1 590 1 890 600 1 120 1 680 1 980

Valor de b

Number of error correction blocks 13 3 2 29 42 1 23 28 17 10 23 10 35 19 35 17 1 14 21 29 19 11 46 13 6 14 23 44 7 59 1 12 7 12 26 39 14 22 41 6 14 6 34 46 10 2 64

Error correction code per block (f, g, h) (145,115,15) (146,116,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (145,115,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (145,115,15) (146,116,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (145,115,15) (146,116,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (46,16,15) (47,17,15) (151,121,15) (152,122,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (151,121,15) (152,122,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

31

2 323

Q H L M

32

2 465

Q H L M

33

2 611

Q H L M

34

2 761

Q H L M

35

2 876

Q H L M

36

3 034

Q H

36

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Versin

Nivel Nmero Codewords de de totales ECC ECCs L M 630 1 204 1 770 2 100 660 1 260 1 860 2 220 720 1 316 1 950 2 310 750 1 372 2 040 2 430

Valor de b

Number of error correction blocks 17 4 29 14 49 10 24 46 4 18 13 32 48 14 42 32 20 4 40 7 43 22 10 67 19 6 18 31 34 34 20 61

Error correction code per block (f, g, h) (152,122,15) (153,123,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (152,122,15) (153,123,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (147,117,15) (148,118,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15) (148,118,15) (149,119,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

37

3 196

Q H L M

38

3 362

Q H L M

39

3 532

Q H L M

40

3 706

Q H

f = total de codewords,

g = nmero de codewords de datos, h = EC capacidad

Los codewords de datos con los codewords de relleno incluidos se deben dividir en bloques como se muestra en la tabla anterior segn versin. Los ECC se calculan para cada bloque y se aaden a los codewords de datos. Para generar los ECC, hay que ver cada codeword de datos como un coeficiente que es trmino de un polinomio, siendo el coeficiente mayor el primer codeword y el menor el ltimo.

37

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

2.4.4 Construir la secuencia final de Codewords

Dividimos la secuencia de codewords en n bloques como se ve en la tabla anterior. Para cada bloque se generan los codewords de error. Despus creamos la secuencia final de codewords que tendra el siguiente orden:

Codeword de datos 1 de bloque 1, codeword de datos 1 de bloque 2, codeword de datos 1 de bloque 3, , codeword de datos 1 de ltimo bloque, codeword de datos 2 de bloque 1, , codeword de datos 2 de ltimo bloque, , ltimo codeword de datos de bloque 1, , ltimo codeword de datos de ltimo bloque, codeword de error 1 de bloque 1, codeword de error 1 de bloque 2, , codeword de error 1 de ltimo bloque, , ltimo codeword de error de bloque 1, , ltimo codeword de error de ltimo bloque. 2.4.5 Colocacin de Codewords en la matriz

La mayora de codewords se representaran en el smbolo como un bloque de 2x4 mdulos o 4x2 mdulos. Otros tendrn formas irregulares por tenerse colocar adyacentes a algn patrn de funcin, como se muestra en la siguiente figura:

Tenemos que crear una matriz en blanco con el tamao correspondiente a la versin del smbolo a crear. A este tamao hay que aadir la regin de silencio rodeando el smbolo que debe ser de 4 mdulos de tamao. Aadimos los tres patrones localizadores y los separadores, tambin los patrones temporizadores, que tendrn un tamao diferente segn la versin. Los mdulos correspondientes, a la informacin de

38

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

versin y de formato, los dejaremos en blanco de momento; recordar que la informacin de versin no es necesaria en todas las versiones de smbolo. Los patrones de alineamiento tambin los podemos colocar, ver el estndar JIS para ver cmo.

La regin de codificacin se rellena con la secuencia de codewords (los codewords normalmente tendrn la forma de 2x4 mdulos), empezando por la parte inferior derecha del smbolo, subiendo primero hacia arriba hasta llegar al patrn localizador, luego pasamos a la columna adyacente izquierda y bajamos hasta abajo, para luego volver a subir. Los codewords se van colocando en zigzag. En la siguiente figura se muestra como sera la colocacin de codewords en un smbolo versin 2.

El orden de los bits de cada codeword vara cuando el codeword se coloca hacia arriba o hacia abajo:

Si la capacidad total del smbolo no se llena con los codewords, se rellena con 3,4 o 7 bits de relleno.

39

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

2.4.6 Enmascarar los datos

Para mejorar la decodificacin de los smbolos es preferible que el nmero de mdulos blancos y negros del smbolo este equilibrado. El patrn 1011101 debe ser evitado ya que se puede confundir con el patrn localizador. Para conseguir esto despus de crear la matriz del smbolo, debemos aplicar una mscara de datos a esta. La mscara no se aplica a los patrones de funcin ni a la informacin de formato y versin.

Existen varios patrones de mscara que podemos aplicar, para ver cul es el mejor para nuestro smbolo, lo que hay que hacer es aplicarlos todos y luego evaluar el que da mejor resultado. La mscara se aplica a los mdulos mediante una operacin XOR.

Los patrones posibles y su cdigo para la informacin de formato son los siguientes:

Cdigo de patrn de mscara de Datos 000 001 010 011 100 101 110 111 (i + j) mod 2 = 0 i mod 2 = 0 j mod 3 = 0 (i + j) mod 3 = 0

Frmula

((i div 2) + (j div 3)) mod 2 = 0 (i j) mod 2 + (i j) mod 3 = 0 ((i j) mod 2 + (i j) mod 3) mod 2 = 0 ((i+j) mod 2 + (i j) mod 3) mod 2 = 0

Para la versin 1, estos patrones seran as:

40

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Los mdulos grises pertenecen a patrones de funcin, o son de informacin de versin o formato, y no se les debe aplicar la mscara.

Despus de aplicar las mscaras, para evaluar el mejor patrn, se calculan los defectos provocados por cada uno y se elige como definitivo el que tiene menos. Existen cuatro pesos diferentes para evaluar los defectos: N1=3, N2 = 3, N3 = 40, N4 = 10. A la hora de evaluar se tiene en cuenta todo el smbolo, no solo la zona a la que se aplicaron las mscaras.

Los posibles defectos son:

1) Mdulos adyacentes a la izquierda, derecha, abajo o arriba del mismo color: Su valor de defecto es: cumplen esa condicin. 41 N1 + i 5 siendo i el numero de mdulos que

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

2) Bloque de mdulos con el mismo color: Su valor de defecto es: N2 x (m -1) x (n -1)

Siendo n las columnas del bloque y m las filas

3) Existencia del patrn 1011101 seguido o precedido del 0000: Su valor es igual a N3 si se produce una o ms veces

4) Proporcin de mdulos negros en todo el smbolo: Si es alta el valor ser igual a N4 (ver JIS para ms informacin)

2.4.7 Informacin de formato

La informacin de formato consiste en una secuencia de 15 bits, de los cuales 5 contienen datos y los otros 10 son para reconstruir los 5 anteriores en caso de existir un error al decodificar. Para esto se utiliza (15,5) BCH Code.

Los primeros dos bits de los cinco indican el nivel de correccin de error usado: L = 01, M = 00, Q = 11, H = 10

Los otros tres bits indican el patrn de la mscara de datos usada.

Una vez calculados los 15 bits se les debe aplicar mediante XOR la mscara 101010000010010, esto es para evitar que pudiera generarse una informacin de formato compuesta solo por ceros.

La informacin de formato se coloca en la matriz del smbolo por duplicado en las zonas establecidas. La siguiente figura muestra como sera en un smbolo de versin 1:

42

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Es esencial que la decodificacin de la informacin de formato sea correcta, para el xito en la decodificacin del smbolo.

2.4.8 Informacin de versin

Esta informacin solo se aplica a los smbolos de versin 7 o superior. Est formada por 18 bits, 6 de ellos son de datos y los otros 12 para corregir errores. Los errores se corrigen mediante (18,6) BCH Code. Los 6 bits de datos contienen codificada la versin del smbolo con el bit ms significativo primero. 000111 representara la versin 7, 101000 representara la versin 40. No es necesario enmascarar esta informacin como pasaba en el apartado anterior puesto que las versiones que provocaran una cadena de ceros no tienen informacin de versin.

Es esencial que la decodificacin de la informacin de versin sea correcta, para el xito en la decodificacin del smbolo. La informacin de versin se coloca en la matriz del smbolo por duplicado en las zonas establecidas. Los posicionamientos posibles de los bits de esta informacin son:

43

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Abajo a la izquierda

Arriba derecha

2.5 Decodificacin de un QR Code El proceso de decodificacin es el inverso al de codificacin. A partir de un smbolo obtenemos unos datos en forma de caracteres. Este proceso se puede dividir en 8 pasos.

1) Obtener una imagen del smbolo y a partir de ella crear una matriz de unos y ceros, reconociendo los mdulos negros y blancos. Para eso hay que binarizar correctamente la imagen.

2) Leer la informacin de formato, detectar y corregir posibles errores en esta. Si no hay xito probar a decodificar el smbolo usando mirror imaging. Obtener el nivel de correccin de errores y el tipo de patrn de mascara de datos usado.

3) Leer la informacin de versin si est, para determinar la versin del smbolo.

4) Pasar la mscara de datos a la matriz de unos y ceros, en la regin de codificacin, mediante una operacin XOR, esto deshar la mscara.

5) Obtener los codewords de datos y de error de la regin de codificacin teniendo en cuenta su orden de colocacin.

6) Detectar los posibles errores en los codewords de datos, utilizando los codewords de error y corregirlos.

7) Dividir los codewords corregidos en segmentos segn los indicadores de modo y contadores de caracteres encontrados. 44

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

8) Decodificar los caracteres de acuerdo a su modo de codificacin y concatenar los resultados para crear la cadena decodificada resultante.

A la hora de binarizar la imagen, es muy importante calcular el color umbral que decidir que pixeles sern negros o blancos, correctamente.

Para localizar los patrones de localizacin debemos buscar el patrn 1011101. Pero ahora cada mdulo est formado por pixeles, tenemos que buscar una proporcin de pxeles alternados en negro y blanco de 1 : 1 : 3 : 1 : 1, dejando un margen de ms menos 0,5 por posible deformacin de la imagen. Una vez encontrado un candidato a patrn localizador tenemos que analizarlo.

Una vez localizados los tres patrones localizadores, hay que determinar la orientacin del smbolo. Para ello se analizan las posiciones de los centros de cada patrn y se detecta cul de ellos es el patrn superior izquierda. El hecho de haber detectado los patrones, nos da una idea de cul es el ancho de mdulo en pixeles de la imagen.

Cuando el smbolo es de versin inferior a la siete, la forma de calcular la versin, ante la ausencia de informacin sobre esta, es calcular el ancho del smbolo esto se hace calculando la distancia entre los dos patrones localizadores superiores.

Sabiendo la versin del smbolo, ya sabemos cuntos patrones de alineamiento posee el smbolo y su posicin, en estas posiciones debemos buscar los patrones 11111, 10101 y el 10001.

Para definir bien la regin de codificacin es necesario encontrar los patrones temporizadores. Estos patrones nacen y terminan en un borde de los patrones localizadores, con una separacin de un mdulo blanco; este mdulo blanco pertenece a un patrn separador. Hay que trazar lneas que unifiquen los patrones localizadores y si

45

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

encontramos en la lnea un patrn altrnate de unos y ceros esa lnea ser candidata a patrn temporizador.

46

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

47

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

3. Anlisis de antecedentes y aportacin realizada


Existen varias aplicaciones de pago, que realizan la codificacin y decodificacin de QR Codes. Estas aplicaciones suelen ser para sistemas de sobremesa. Tambin hay muchas para mviles o PDAs que dispongan de una cmara fotogrfica, aunque estas aplicaciones decodifican smbolos, no los suelen codificar. Por ejemplo existe el I-Nigma Reader, vase www.i-nigma.com.

Tambin hay pginas web que ofrecen servicios para codificar smbolos como por ejemplo http://qrcode.es y tambin http://zxing.org/w/decode.jspx que nos permite decodificar QR Codes online. El blog qrcode.es utiliza la librera QR Code Perl CGI & PHP scripts ver. 0.50 para generar los QR code. Esta librera es japonesa y la documentacin est en japons.

En la web http://www.psytec.co.jp se puede descargar gratuitamente el programa PSQRedit para Windows totalmente en japons que codifica y decodifica QR code. Tambin se puede conseguir una versin de la aplicacin open source programada en C++ pero solo genera QR code no los interpreta y adems la documentacin y los escasos comentarios del cdigo estn en japons.

En la pgina de Sourceforge http://qrcode.sourceforge.jp, existe un proyecto open source en Java que decodifica smbolos QR Code pero no los codifica. Es compatible con J2SE, J2ME MIDP2.0/CLDC1.0. La documentacin y comentarios de cdigo estn en ingls.

En esta web http://www.codeproject.com/KB/cs/qrcode.aspx existe otro proyecto open source en ingls. Est programado en .NET lo que le hace altamente portable como pasa con Java. Soporta la codificacin y decodificacin de smbolos en una sola interfaz. Soporta imgenes en formatos JPEG, GIF, PNG y BMP.

48

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

El objetivo de este proyecto es realizar una aplicacin que codifique y decodifique smbolos QR code en lenguaje Java. La interfaz ha sido programada, para que funcione en sistemas operativos Windows para sistemas de sobremesa y ordenadores porttiles, centrndonos en los ms usados actualmente que son Windows XP y Windows Vista. Las aportaciones de la aplicacin realizada son:

1) La aplicacin ser libre y open source

2) Realizar la codificacin y la decodificacin, en un solo programa con una interfaz comn sencilla, con todas las caractersticas principales del estndar y compatible con cualquier otro programa que cumpla el estndar ISO/IEC 18004 2006 el JIS-X0510.

3) El cdigo fuente est ampliamente comentado en espaol, adems todas las clases, interfaces y atributos contienen comentarios javadoc que son de gran ayuda durante la programacin. Esto hace que el cdigo sea altamente reusable y fcil de estudiar. 4) La aplicacin al estar programada en Java puede ejecutarse en cualquier plataforma de escritorio que tenga instalada la mquina virtual de Java: Linux, MAC, Solaris, Windows 7, Windows Vista, Windows XP, etc.

5) Al estar programado en lenguaje Java los mdulos de codificacin y decodificacin se pueden aprovechar fcilmente para realizar nuevas interfaces para otras plataformas, como mviles o PDAs. El resultado es fcilmente portable. La nueva interfaz slo tiene que utilizar una clase de la librera para codificar y a otra clase para decodificar. Los mtodos Decode y Encode de las clases QRCodeDecoder y QRCodeEncoder, se encargan de realizar todos los clculos necesarios llamando internamente al resto de clases y mtodos de la librera. Por tanto adems es fcilmente reusable.

49

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

50

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

4.

Anlisis de requisitos

Como vimos en el primer apartado de este documento los objetivos de este proyecto son tres principalmente:

1) Comprender y dar una explicacin de la especificacin del estndar QR Code 2006, su algoritmo de codificacin y decodificacin, as como las partes que componen los smbolos, sus diferentes versiones y caractersticas.

2) Desarrollar una librera en Java que sirva, tanto para generar smbolos QR Code compatibles con el estndar QR Code 2006, como para interpretar un smbolo QR Code 2006 compatible y ver su mensaje. La librera tambin debe implementar algunos algoritmos de pretratamiento de imgenes para mejorar la probabilidad de xito en la interpretacin. Adems la complejidad temporal de la generacin y sobre todo de la interpretacin debe ser ptima ya que debe poder ejecutarse en dispositivos mviles y PDAs.

3) Desarrollar una aplicacin de escritorio en lenguaje Java, que utilizando la librera anterior sirva para generar e interpretar smbolos QR Code, y que permita especificar y usar las caractersticas principales del estndar; como son las diferentes versiones de smbolos, formatos de datos, niveles de correccin de errores, etc.

Cada uno de estos objetivos se pueden dividir en requisitos. Para el primer objetivo necesitamos obtener informacin abundante y contrastada sobre el funcionamiento del estndar QR Code 2006. Una vez conseguida esta informacin se requiere su estudio en profundidad. Cumplir estos dos requisitos es vital parar poder cumplir los otros dos objetivos principales.

51

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Para el segundo objetivo es necesario haber cumplido el primer objetivo. Despus de comprender como funciona el estndar QR Code 2006 necesitamos analizar cmo desarrollar una librera de funciones capaz de emularlo y que pueda ser utilizada por cualquier programa. El hecho de usar Java como lenguaje de programacin facilitar el cumplir este requisito. Teniendo en cuenta el lenguaje de alto nivel que utilizamos, se tiene la posibilidad de la fcil reutilizacin de cdigo para futuras mejoras, lo cual ayuda a un posterior desarrollo o estudio de la aplicacin a disear.

Tambin es requisito que la ejecucin de los procesos de codificacin y decodificacin sea rpida. Hay que conseguir que los algoritmos a implementar tengan una complejidad temporal baja, preferiblemente inferior a O(N2). Hay que centrarse en comprobar la complejidad de los llamados cuellos de botella, instrucciones que ms veces se ejecutan. Hay que tener en cuenta que para el caso de los QR Codes, el tamao de datos tiene un lmite. La versin de smbolo QR Code ms grande es la 40, que est compuesta por 177x177 mdulos y puede almacenar codificados hasta 7089 caracteres en modo numrico (2953 en modo byte). Luego N tiene lmite. Para la decodificacin el tamao de los datos depender del nmero de pixeles de la imagen que contiene el QR Code a decodificar.

El tercer objetivo se acometer una vez cumplido el segundo ya que se necesita la librera para ser llamada y utilizada por el programa generador e intrprete de QR Codes. Es requisito que esta aplicacin sea grfica, de tipo ventana para aumentar su usabilidad. Es requisito el que sea capaz de mostrar y generar imgenes y fotos, ya que los cdigos de barra QR Code son imgenes normalmente obtenidas con cmaras. Es requisito que el programa contenga los controles necesarios para poder especificar las diferentes opciones que nos ofrece el estndar para crear e interpretar un smbolo QR Code 2006. La aplicacin debe poder ser ejecutable en el mayor nmero posible de sistemas operativos, empezando por los de la familia Windows por ser los ms utilizados hoy en da.

Una vez expuestos los principales requisitos del proyecto pasamos a analizar las diferentes opciones que existen para cumplirlos.

52

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Para el requisito de obtener informacin sobre el estndar QR Code la principal fuente de informacin y sobre todo ms cercana es internet y sus buscadores. Utilic Google para obtener informacin sobre los QR Code y pronto descubr que en la pgina de la compaa japonesa Denso Wave (http://www.denso-wave.com), existe gran cantidad de informacin. Esta compaa es la creadora de los QR Code y tras su creacin decidi liberar su estndar, hacerlo pblico y regalarlo al mundo. Tambin encontr un blog espaol http://www.qrcode.es dedicado a los QR Code con informacin actualizada y gran cantidad de enlaces a otras pginas relacionadas.

Despus descubr que existen dos documentos oficiales estndar que explican a fondo cmo funcionan los QR Codes y sus caractersticas uno de estos documentos es el estndar ISO/IEC 18004 Information technology Automatic identification and data capture techniques QR Code 2005 bar code symbology specification. ste documento oficial de la International Organization for Standardization y de la International Electrotechnical Commission, est escrito en ingls y por desgracia no es libre; posee copyright y se puede conseguir por el mdico precio de 190 dlares. El otro documento es el estndar JIS X0510 perteneciente a la Japanese Industrial Standards, ste tiene la ventaja de que s es libre pero tiene la desventaja de que est escrito en japons y adems conseguirlo no es fcil ya que las pginas que lo ofrecen estn en japons. Despus de mucho buscar encontr una traduccin al ingls del documento JIS X0510 con la que obtuve la principal informacin necesaria para completar el primer objetivo. Se expone un resumen en espaol de este documento en el apartado 2 de ste documento.

Para cumplir los requisitos del objetivo dos debemos analizar los diferentes sistemas disponibles para desarrollar la librera. Uno de los requisitos es que la librera sea fcilmente portable y usable, el lenguaje Java facilita la portabilidad de los programas implementados con l, gracias a su tecnologa basada en maquinas virtuales. Otra opcin era utilizar .Net de Microsoft y programar en C#, las razones por las que no nos decantamos por esta tecnologa es porque solo est optimizada para sistemas operativos Windows, porque las principales IDE no son libres y porque el desarrollador de este

53

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

proyecto tiene mayor experiencia en tecnologa Java que en tecnologa .NET. Otra razn por la que utilizar un lenguaje de alto nivel orientado a clases como Java o C#, es la ventaja de tener mayor posibilidad de estructurar el cdigo en clases y capas para mejorar la reusabilidad del cdigo; ayudando as a un posible posterior estudio de la aplicacin o mantenimiento.

Una vez tenido claro que iba a usar tecnologa Java haba que elegir el IDE con el que desarrollar el software. Para Java los IDEs ms conocidos son Net Beans y Eclipse, existen otros IDEs pero estos dos son los ms usados en entornos profesionales.

NetBeans recuerda por su usabilidad a Microsoft Visual Studio, muchos de los aceleradores de teclado son iguales en ambos IDEs. La estructuracin de las diferentes paletas de la ventana y el outlining del cdigo tambin son parecidos en ambos IDEs, esto hace que si los desarrolladores estn familiarizados con Visual Studio les resulte ms fcil adaptarse a NetBeans que a eclipse. La principal ventaja de NetBeans sobre eclipse, es que en l resulta mucho ms sencillo implementar aplicaciones grficas de escritorio con swing. NetBeans trae herramientas para crear formularios y ventanas de dilogo de forma visual, construyendo interfaces de forma parecida a como se hace con Windows Forms o Visual Basic.

Una de las ventajas de Eclipse es, que existen cientos de plugins instalables con todo tipo de funcionalidades que podamos necesitar; aunque pueden existir problemas de dependencias entre los propios plugins, que complican su instalacin. Otra ventaja de Eclipse es, que su uso est ms extendido que NetBeans y es ms probable que los desarrolladores tengan ms experiencia en esta, como es mi caso. Las ltimas versiones de Eclipse, como por ejemplo Eclipse Galileo, estn mejor adaptadas a las nuevas resoluciones de pantalla, y los entornos grficos 3D de los sistemas operativos. Esto aumenta el atractivo visual de Eclipse. Tambin eclipse puede aportar ms funcionalidades para programar y depurar cdigo que NetBeans.

Una vez sopesados los pros y contras de ambas IDEs la conclusin a la que llegamos es que al tener mayor experiencia con Eclipse, ser mejor utilizar ste para el segundo

54

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

objetivo. Despus para realizar la aplicacin grfica del tercer objetivo utilizaremos mejor NetBeans por sus mayores facilidades para crear interfaces grficas de escritorio.

Tambin es importante decidir el sistema operativo, en el cual se va a poder ejecutar la aplicacin de ventana. En nuestro caso al estar programada en Java J2SE, podr ser ejecutada en cualquier sistema operativo de escritorio, que disponga de una mquina virtual de Java. La aplicacin puede ejecutarse en: Linux, MAC OS, Solaris, Windows 7, Windows Vista, Windows XP, etc.

Aunque la aplicacin funciona en muchos sistemas operativos, debemos elegir uno para ser el usado durante el desarrollo; especialmente durante las pruebas y el desarrollo de la interfaz. As estaremos ms seguros de su correcto funcionamiento para este sistema operativo. De las opciones posibles, la mejor opcin ser el sistema operativo ms extendido entre los usuarios porque este ser probablemente el sistema operativo en el que ms veces se ejecutar la aplicacin.

Segn un estudio realizado en Junio de 2007, con los accesos realizados a una pgina web se obtuvo el siguiente grfico:

55

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Windows sigue estando a la cabeza con una diferencia abrumadora en utilizacin por los usuarios comunes. Por lo que lo ms lgico es desarrollar esta aplicacin en sistemas operativos Windows, ya que probablemente ser utilizado principalmente con esta familia de sistemas operativos.

56

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

57

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

5. Diseo de la Aplicacin
En este apartado se intentar razonar debidamente las decisiones

informticas que se han tomado para la realizacin de este proyecto. Decisiones como la eleccin del lenguaje de programacin, la presentacin y ejecucin de la aplicacin, como estructurar y ordenar los algoritmos a desarrollar, etc.

En el punto anterior ya hablamos sobre que lenguaje de programacin y sistema operativo utilizar. La librera a desarrollar debe ser fcilmente portable y usable, el lenguaje Java facilita la portabilidad de los programas implementados con l, gracias a su tecnologa basada en maquinas virtuales. Otra opcin era utilizar .Net de Microsoft y programar en C#, las razones por las que no nos decantamos por esta tecnologa es porque solo est optimizada para sistemas operativos Windows, porque las principales IDE no son libres. Otra razn por la que utilizar un lenguaje de alto nivel orientado a clases como Java o C#, es la ventaja de tener mayor posibilidad de estructurar el cdigo en clases y capas para mejorar la reusabilidad del cdigo; ayudando as a un posible posterior estudio de la aplicacin o mantenimiento. Utilizaremos Java como lenguaje de programacin.

Para desarrollar la librera, utilizaremos como IDE, Eclipse, concretamente la versin Galileo por estar ms actualizado que la otra alternativa principal NetBeans; y por sus mejores caractersticas a la hora de escribir cdigo. Para desarrollar la aplicacin grfica de ventana, utilizaremos como IDE, NetBeans 6.7.1, por sus funcionalidades y ayudas para desarrollar visualmente aplicaciones de ventana tipo formulario. Permite crear las interfaces de formularios con tecnologa Java Swing casi sin tener que escribir cdigo, solo arrastrando objetos al formulario y modificando sus propiedades. Slo hay que programar el comportamiento de los objetos ante determinados eventos.

Como vamos a desarrollar todo el cdigo en Java J2SE, tanto la aplicacin como la librera podrn ser ejecutadas en cualquier sistema operativo de escritorio, que disponga

58

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

de una mquina virtual de Java. La aplicacin puede ejecutarse en: Linux, MAC OS, Solaris, Windows 7, Windows Vista, Windows XP, etc.

Aunque la aplicacin funciona en muchos sistemas operativos, debemos elegir uno para ser el usado durante el desarrollo; especialmente durante las pruebas y el desarrollo de la interfaz. As estaremos ms seguros de su correcto funcionamiento para este sistema operativo. De las opciones posibles, la mejor opcin ser el sistema operativo ms extendido y a da de hoy estos son los de la familia Windows.

Cuando desarrollamos un proyecto en Java hay que tomar la decisin de que versin del JDK (Java Development Kit) utilizar. Existen varias versiones del JDK, siendo la ltima la 1.6. Cuanto ms moderno sea el JDK usado, las funcionalidades a la hora de programar sern ms y mejores. Sin embargo se corre el riesgo, de que s usamos una funcionalidad que no exista en un JDK anterior, nuestro cdigo no sea ejecutable en una mquina virtual de Java antigua. Se puede utilizar un JDK ms moderno sin perder compatibilidad hacia atrs con otros anteriores. La decisin tomada fue la de usar el JDK 1.4 con compatibilidad hacia atrs con JDK 1.2. Las versiones 1.6 y 1.5 del JDK aportan nuevas funcionalidades que no eran necesarias para el desarrollo de este proyecto. 5.1 Diseo de la interfaz grfica

Necesitamos disear la interfaz grfica de la aplicacin a realizar, el generador e intrprete de QR Codes. Esta aplicacin tiene que ser capaz de permitir al usuario introducir los datos necesarios para crear un QR Code acorde al estndar en formato de imagen, y al mismo tiempo debe ser capaz de abrir ficheros de imagen, mostrarlos y decodificar el mensaje que contienen si son imgenes de un smbolo QR Code. Lo lgico es definir dos pantallas, una para codificar y otra para decodificar. Esto podramos hacerlo con dos ventanas pero hay otra forma ms elegante. Esta forma permite tener dos pantallas en una misma ventana, para ello se utilizan fichas. Tendremos dos fichas seleccionables en todo momento en una sola ventana, una ficha mostrara las opciones necesarias para codificar y mostrar el smbolo generado, y la otra

59

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

contendr lo necesario para abrir un fichero de imagen, decodificarlo y mostrar su mensaje.

La pantalla de codificacin necesita un objeto que pueda mostrar una imagen, se cargar con la imagen generada al codificar. En Java Swing el control JLabel permite mostrar imgenes y texto. Tambin necesita un objeto para que el usuario escriba los datos a codificar en el smbolo. En Java Swing el control JTextPane permite introducir texto por teclado o cdigo y mostrarlo. Otro requisito de esta pantalla es que el usuario, pueda elegir el modo de codificacin de los datos, el nivel de correccin de error y la versin del smbolo. Como estos valores tienen un dominio limitado, lo mejor es permitir seleccionarlos mediante controles de tipo combobox. En Java Swing disponemos del control JComboBox de tipo combobox. Tambin es interesante permitir elegir al usuario el tamao de la imagen a crear, la mejor manera de definir el tamao es elegir el tamao en pixeles de un mdulo por lado. As que un control que permita elegir nmeros enteros entre 1 y X es una buena opcin, un control de tipo spinner nos sirve y es muy usable. En Java Swing existe el control JSpinner. Por ltimo la pantalla de codificacin necesita dos botones, uno para iniciar la codificacin y otro para guardar la imagen generada. Al pulsar el botn codificar la imagen generada se muestra en el control JLabel. El botn de guardar no funciona hasta que ya se haya generado una imagen.

60

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Detalle de la pantalla de codificacin

Hay que tener en cuenta que segn el tamao de los datos introducidos, el nivel de correccin de errores y el modo de codificacin seleccionado por el usuario, es posible que la versin elegida no tenga capacidad suficiente. En tal caso se debe mostrar un mensaje indicndolo. Tanto la interfaz como la librera pueden darse cuenta de esto y comunicarlo. Concretamente lo que ocurre en nuestro programa es, que la interfaz llama a la funcin codificar de la librera. sta recibe los datos para codificar el smbolo, los analiza y se da cuenta de que no caben, luego se lo comunica a la interfaz mediante lanzando una excepcin. Esta excepcin es capturada por la interfaz y entonces se muestra el mensaje al usuario indicando lo sucedido mediante un messagebox. Una opcin interesante que se ha implementado es permitir al usuario elegir como versin la versin vlida ms pequea posible, pero sin tener que calcularlo l sino que el programa se encargue solo. El encargado de realizar este clculo es la librera.

61

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

La pantalla de decodificacin necesita otro objeto para mostrar imgenes, que se cargar con la imagen a decodificar. Tambin necesita un objeto para mostrar el texto decodificado. Por ltimo la pantalla necesita dos botones, uno para iniciar la decodificacin y otro para cargar la imagen a decodificar. El botn decodificar no funciona hasta que ya se haya cargado una imagen. Al pulsar en decodificar se inicia el proceso de decodificacin y se muestra en el campo de texto el resultado. El campo de texto es mejor que no sea editable.

Detalle de la pantalla de decodificacin

Al pulsar el botn decodificar se llama al mtodo decodificar de la librera. S en el proceso sucede algn error y no se consigue decodificar el smbolo, la librera lanza una excepcin; esta excepcin es recogida por la interfaz que en tal caso mostrar un messagebox indicando el error y la causa.

62

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Tanto para guardar las imgenes generadas como para abrir una imagen para ser decodificada, necesitamos que el usuario pueda elegir la ubicacin del archivo e introducir su nombre de una manera usable. El objeto JFileChooser de Java Swing permite lanzar una ventanita muy usable para abrir o guardar ficheros y es el que se ha usado para esta tarea.

Detalle de la ventana de seleccin de archivos

La clase que implementa la interfaz grfica se llama QREncoderDecogerGUI.java

5.1 Diseo de la Librera

La librera se divide en dos mdulos principales, uno para codificar y otro para decodificar. Al estar programado en Java, vamos a crear clases, cada clase se encargar de unas tareas concretas tal como indique su nombre y se llamarn entre ellas para solicitar operaciones. Las clases se agruparan en paquetes dependiendo de sus funciones. Para ms informacin ver el siguiente aparatado (Implementacin).

63

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

64

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

6. Implementacin de la Aplicacin
Todo el cdigo desarrollado ha sido comentado con comentarios Javadoc, estos comentarios permiten autogenerar una documentacin completa del cdigo en forma de pgina web. Esto es gracias a una herramienta que incorpora Eclipse y tambin NetBeans.

La informacin que se muestra a continuacin se ha obtenido de los ficheros HTML generados por Javadoc. Se recomienda para un mejor estudio consultar directamente los ficheros HTML que se encuentran en el directorio doc del cdigo fuente.

Tambin comentar que parte del cdigo dedicado a la decodificacin est basado en el proyecto QR Code de Source Forge. Este proyecto est en lenguaje Java y es capaz de decodificar imgenes con smbolos QR Code, sin embargo la codificacin a da de hoy no est implementada.

6.1 Paquetes
jp.sourceforge.qrcode jp.sourceforge.qrcode.data jp.sourceforge.qrcode.ecc jp.sourceforge.qrcode.exception jp.sourceforge.qrcode.geom jp.sourceforge.qrcode.pattern jp.sourceforge.qrcode.reader jp.sourceforge.qrcode.util

65

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Clases: 6.2 Listado de Clases:


AlignmentPattern AlignmentPatternNotFoundException Axis BCH15_5 Color ConsoleCanvas ContentConverter DebugCanvas DebugCanvasAdapter DecodingFailedException EncodingFailedException FinderPattern FinderPatternNotFoundException InvalidDataBlockException InvalidVersionException InvalidVersionInfoException Line LogicalSeed Point QRCodeConstantes QRCodeDataBlockReader QRCodeDecoder QRCodeEncoder QRCodeEncoderDecoderGUI QRCodeImage QRCodeImageReader QRCodeSymbol QRCodeUtility ReedSolomon SamplingGrid SymbolNotFoundException VersionInformationException

1- Paquete jp.sourceforge.qrcode

Clases
QRCodeDecoder Clase ncleo para el proceso de decodificacin. QRCodeEncoder Clase encargada del proceso de codificacin QRCode.

2- Paquete jp.sourceforge.qrcode.data

Interfaces
QRCodeImage

66

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Clases
QRCodeConstantes Contenedor de constantes habituales de QRCode. QRCodeSymbol Clase que Representa a un smbolo QRCode y contiene toda la informacin necesario para representarlo.

3- Paquete jp.sourceforge.qrcode.ecc

Clases
BCH15_5 ReedSolomon Clase para corregir errores de la informacin de formato y transformarla de 15 bits a 5 bits.

4- Paquete jp.sourceforge.qrcode.exception

Excepciones
AlignmentPattern otFoundException DecodingFailedException EncodingFailedException FinderPattern otFoundException InvalidDataBlockException InvalidVersionException InvalidVersionInfoException Symbol otFoundException VersionInformationException Excepcin que indica codificacin. fallo durante la

5- Paquete jp.sourceforge.qrcode.geom

Clases
Axis Line Point Clase para mover un Point en funcin del eje independiente. Representa una linea formada por dos puntos. Representa a un punto en el plano.

SamplingGrid Permite que un rea tenga un tamao diferente de otra

67

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

6- Paquete jp.sourceforge.qrcode.pattern

Clases
AlignmentPattern FinderPattern LogicalSeed Clase para consultar donde se colocan los patrones. Clase que representa a un patrn de alineamiento dentro de un smbolo QRCode.

7- Paquete jp.sourceforge.qrcode.reader

Clases
QRCodeDataBlockReader QRCodeImageReader Clase para realizar el pretratamiento a un smbolo QRCode antes de decodificarlo.

8- Paquete jp.sourceforge.qrcode.util

Interfaces
Color DebugCanvas Interfaz con ints que representan colores en formato RGB.

Clases
ConsoleCanvas ContentConverter DebugCanvasAdapter QRCodeUtility Clase contenedora de mtodos tiles.

6.2.1 Clase QRCodeEncoderDecoderGUI


java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame QRCodeEncoderDecoderGUI

All Implemented Interfaces:

68

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants


public class QRCodeEncoderDecoderGUI extends javax.swing.JFrame

Sumario de atributos
private int alturaInicial

int con el tamao en pixeles de la altura de la ventana al inicio


private int anchoInicial

int con el tamao en pixeles del ancho de la ventana al inicio


private private private private javax.swing.JButton BotonAbrir javax.swing.JButton BotonCodificar javax.swing.JButton BotonDecodificar javax.swing.JButton BotonGuardar private ComboECC javax.swing.JComboBox private ComboModo javax.swing.JComboBox private ComboVersion javax.swing.JComboBox private FichaDecodificar javax.swing.JTabbedPane private generatedImage java.awt.image.BufferedImage contendr la imagen private private private private private private javax.swing.JLabel jLabel1 javax.swing.JLabel jLabel2 javax.swing.JLabel jLabel3 javax.swing.JLabel jLabel4 javax.swing.JLabel jLabel5 javax.swing.JLabel jLabel6

generada al codificar

69

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

private jScrollPane1 javax.swing.JScrollPane private jScrollPane2 javax.swing.JScrollPane private private private private javax.swing.JLabel LabelImageCodificar javax.swing.JLabel LabelImageDecodificar javax.swing.JPanel PanelCodificar javax.swing.JPanel PanelDecodificar private static long serialVersionUID

ID serial de versin.
private sourceImage java.awt.image.BufferedImage contendr private

la imagen seleccionada por el usuario para ser decodificada

javax.swing.JSpinner spinnerTamano private TextPaneCodificar javax.swing.JTextPane private TextPaneDecodificar javax.swing.JTextPane

Constructor
QRCodeEncoderDecoderGUI()

Creates new form NewJFrame

Sumario de mtodos
private BotonAbrirActionPerformed(java.awt.event.ActionEvent evt) void private BotonCodificarActionPerformed(java.awt.event.ActionEvent ev void t) private BotonDecodificarActionPerformed(java.awt.event.ActionEvent void evt) private BotonGuardarActionPerformed(java.awt.event.ActionEvent evt) void private initComponents() void This method is

called from within the constructor to initialize the

form.
static voi main(java.lang.String[] args)

70

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Detalle de Atributos
serialVersionUID
private static final long serialVersionUID

ID serial de versin. See Also: Constant Field Values

sourceImage
private java.awt.image.BufferedImage sourceImage

contendra la imagen seleccionada por el usuario para ser decodificada

generatedImage
private java.awt.image.BufferedImage generatedImage

contendr la imagen generada al codificar

alturaInicial
private int alturaInicial

int con el tamao en pixeles de la altura de la ventana al incicio

anchoInicial
private int anchoInicial

int con el tamao en pixeles del ancho de la ventana al incicio

BotonAbrir
private javax.swing.JButton BotonAbrir

BotonCodificar
private javax.swing.JButton BotonCodificar

BotonDecodificar
private javax.swing.JButton BotonDecodificar

71

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

BotonGuardar
private javax.swing.JButton BotonGuardar

ComboECC
private javax.swing.JComboBox ComboECC

ComboModo
private javax.swing.JComboBox ComboModo

ComboVersion
private javax.swing.JComboBox ComboVersion

FichaDecodificar
private javax.swing.JTabbedPane FichaDecodificar

LabelImageCodificar
private javax.swing.JLabel LabelImageCodificar

LabelImageDecodificar
private javax.swing.JLabel LabelImageDecodificar

PanelCodificar
private javax.swing.JPanel PanelCodificar

PanelDecodificar
private javax.swing.JPanel PanelDecodificar

TextPaneCodificar
private javax.swing.JTextPane TextPaneCodificar

TextPaneDecodificar
private javax.swing.JTextPane TextPaneDecodificar

jLabel1
private javax.swing.JLabel jLabel1

72

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

jLabel2
private javax.swing.JLabel jLabel2

jLabel3
private javax.swing.JLabel jLabel3

jLabel4
private javax.swing.JLabel jLabel4

jLabel5
private javax.swing.JLabel jLabel5

jLabel6
private javax.swing.JLabel jLabel6

jScrollPane1
private javax.swing.JScrollPane jScrollPane1

jScrollPane2
private javax.swing.JScrollPane jScrollPane2

spinnerTamano
private javax.swing.JSpinner spinnerTamano

Constructor
QRCodeEncoderDecoderGUI
public QRCodeEncoderDecoderGUI()

Creates new form NewJFrame

Mtodos
initComponents
private void initComponents()

This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The content of this method is always regenerated by the Form Editor.

73

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

BotonCodificarActionPerformed
private void BotonCodificarActionPerformed(java.awt.event.ActionEvent evt)

BotonGuardarActionPerformed
private void BotonGuardarActionPerformed(java.awt.event.ActionEvent evt)

BotonAbrirActionPerformed
private void BotonAbrirActionPerformed(java.awt.event.ActionEvent evt)

BotonDecodificarActionPerformed
private void BotonDecodificarActionPerformed(java.awt.event.ActionEvent evt)

jp.sourceforge.qrcode

6.2.2 Clase QRCodeDecoder


java.lang.Object jp.sourceforge.qrcode.QRCodeDecoder public class QRCodeDecoder extends java.lang.Object

Clase ncleo para el proceso de decodificacin.

Sumario de Clases Anidadas


(package QRCodeDecoder.DecodeResult private) Clase para mostrar el resultado class la correccin de errores.

de la decodificacin e informacin de

Sumario de Atributos
(package private) canvas static DebugCanvas (package private) correctionSucceeded boolean Flag de correccin (package private) imageReader QRCodeImageReader (package private) lastResults java.util.Vector (package private) numLastCorrections int

exitosa.

74

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

(package private) numTryDecode int Contador de intentos (package private) qrCodeSymbol QRCodeSymbol Almacena (package private) results java.util.Vector

de decodificacin.

el smbolo QRCode a decodificar.

Constructor
QRCodeDecoder()

Constructor.

Sumario de Mtodos
(package private) int[] correctDataBlocks(int[] blocks)

Corrige parmetro.

los

datablocks

pasados

como

byte[] decode(QRCodeImage qrCodeImage)

Mtodo que decodifica la imagen QRCode pasada como parametro.


(package private) decode(QRCodeImage qrCodeImage, QRCodeDecoder.DecodeResult Point adjust)

Mtodo que decodifica la imagen QRCode pasada como parametro.


(package private) Point[] getAdjustPoints()

Calcula los puntos de ajuste: (0,0), (2,3), (3,4), (1,2), (2,1), (1,1), (-1,-1).
static DebugCanvas getCanvas()

Obtiene el Canvas, es un atributo static.


(package private) byte[] getDecodedByteArray(int[] blocks, int version, int numErrorCorrectionCode)

Obtiene el mensaje decodificado en array de bytes a partir de los bloques de un QRCode.


(package private) getDecodedString(int[] blocks, int version, java.lang.String int numErrorCorrectionCode)

Obtiene el mensaje decodificado en String a partir de los bloques de un QRCode.


(package private) int[][] imageToIntArray(QRCodeImage image)

Transforma 1 imagen QRCodeImage en una matriz de int.


static void setCanvas(DebugCanvas canvas)

Establece el Canvas, es un atributo static. Methods inherited from class java.lang.Object

75

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

clone, equals, finalize, toString, wait, wait, wait

getClass,

hashCode,

notify,

notifyAll,

Detalles de Atributos
numTryDecode
int numTryDecode

Contador de intentos de decodificacin.

qrCodeSymbol
QRCodeSymbol qrCodeSymbol

Almacena el smbolo QRCode a decodificar.

results
java.util.Vector results

lastResults
java.util.Vector lastResults

canvas
static DebugCanvas canvas

imageReader
QRCodeImageReader imageReader

numLastCorrections
int numLastCorrections

correctionSucceeded
boolean correctionSucceeded

Flag de correccin exitosa.

Detalles de Constructor
QRCodeDecoder
public QRCodeDecoder()

Constructor.

Detalles de Mtodos

76

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

setCanvas
public static void setCanvas(DebugCanvas canvas)

Establece el Canvas, es un atributo static. Parameters: canvas -

getCanvas
public static DebugCanvas getCanvas()

Obtiene el Canvas, es un atributo static. Returns: DebugCanvas

decode
public byte[] decode(QRCodeImage qrCodeImage) throws DecodingFailedException

Mtodo que decodifica la imagen QRCode pasada como parametro. Internamente llama al otro decode N veces hasta que la decodificacin es correcta, variando en cada caso los puntos de ajuste Si despues de todos los intentos ninguna decodificacin resulta sin errores, se devuelve el resultado con menor error. Parameters: qrCodeImage - imagen QRCode que se decodifica Returns: array de byte con el mensaje decodificado, se puede asignar a un String Throws: DecodingFailedException - se lanza por no encontrar los patrones localizadores o por no poder descifrar el mensaje ni con correccin de errores

getAdjustPoints
Point[] getAdjustPoints()

Calcula los puntos de ajuste: (0,0), (2,3), (3,4), (1,2), (2,1), (1,1), (-1,-1). Returns: Point[] array de puntos(x,y)

decode
QRCodeDecoder.DecodeResult decode(QRCodeImage qrCodeImage, Point adjust) throws DecodingFailedException

Mtodo que decodifica la imagen QRCode pasada como parametro. Parameters: qrCodeImage - imagen QRCode que se decodifica adjust - Point punto de ajuste Returns: DecodeResult

77

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Throws:
DecodingFailedException

imageToIntArray
int[][] imageToIntArray(QRCodeImage image)

Transforma 1 imagen QRCodeImage en una matriz de int. Parameters: image - QRCodeImage imagen a transformar Returns: int[][]

correctDataBlocks
int[] correctDataBlocks(int[] blocks)

Corrige los datablocks pasados como parmetro. Parameters: blocks - int[] con datablocks a corregir Returns: int[] con datablocks corregidos

getDecodedByteArray
byte[] getDecodedByteArray(int[] blocks, int version, int numErrorCorrectionCode) throws InvalidDataBlockException

Obtiene el mensaje decodificado en array de bytes a partir de los bloques de un QRCode. Llama a QRCodeDataBlockReader.reader Parameters: blocks - int[] los bloques de datos de un QRCode version - int versin del QRCode numErrorCorrectionCode - int Returns: byte[] Throws:
InvalidDataBlockException

getDecodedString
java.lang.String getDecodedString(int[] blocks, int version, int numErrorCorrectionCode) throws InvalidDataBlockException

Obtiene el mensaje decodificado en String a partir de los bloques de un QRCode. Llama a QRCodeDataBlockReader.reader Parameters: blocks - int[] los bloques de datos de un QRCode version - int versin del QRCode

78

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

numErrorCorrectionCode

- int

Returns: String Throws:


InvalidDataBlockException

jp.sourceforge.qrcode

6.2.3 Clase QRCodeEncoder


java.lang.Object jp.sourceforge.qrcode.QRCodeEncoder public class QRCodeEncoder extends java.lang.Object

Clase encargada del proceso de codificacin QRCode.

Sumario de Atributos
private qrCodeBackgroundColor java.awt.Color Color de fondo private private int qrcodeEncodeMode

Modo de codificacin
int qrcodeErrorCorrect

Nivel de correccin de errores


private qrCodeForegroundColor java.awt.Color Color de mdulos private private private int qrCodeScale

ancho en pixeles de cada mdulo


int qrcodeStructureappendM int qrcodeStructureappendN

private qrcodeStructureappendOriginaldata java.lang.String private private int qrcodeStructureappendParity int qrcodeVersion

Constructor
QRCodeEncoder()

Constructor, establece parmetros por defecto.

79

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Sumario de Mtodos
private static byte[] calculateByteArrayBits(byte[] xa, java.lang.String ind) byte[] xb,

Mtodo privado auxiliar para el clculo de los ECC codewords.


private static byte[] calculateRSECC(byte[] codewords, byte rsEccCodewords, byte[] rsBlockOrder, int maxDataCodewords, int maxCodewords)

Mtodo privado que genera los codewords de correccin de error para cada bloque del smbolo QRCode.
boolean[][] calQrcode(byte[] qrcodeData)

Crea una matriz de booleanos que representa a un smbolo QRCode que codifica la informacion recibida como datos de entrada.
int calStructureappendParity(byte[] originaldata)

Calcula la paridad para structure append en funcin de los datos a codificar.


private static byte[] divideDataBy8Bits(int[] data, int maxDataCodewords) byte[] bits,

Mtodo privado que divide los datos en conjuntos de 8 bits para crear los codewords, y aade el relleno (padding) s es necesario.
java.awt.image.Buffer Encode(java.lang.String cadena) edImage Codifica una cadena segn parmetros,

en un

smbolo QRCode.
java.awt.Color getQrCodeBackgroundColor()

Obtiene el color de fondo del smbolo.


int getQrcodeEncodeMode()

Obtiene el modo de codificacin.


int getQrcodeErrorCorrect()

Obtiene el nivel de correccin de errores.


java.awt.Color getQrCodeForegroundColor()

Obtiene el color de mdulo.


int getQrCodeScale()

Obtiene la escala de mdulo.


int getQrcodeVersion()

Obtiene la versin del QRCode.


private static byte selectMask(byte[][] matrixContent, int maxCodewordsBitWithRemain)

Mtodo privado para calcular la mscara de datos ptima.


void setQrCodeBackgroundColor(java.awt.Color qrCodeB ackgroundColor)

Establece el color de fondo del smbolo.


void setQrcodeEncodeMode(int qrcodeEncodeMode)

80

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Establece el modo de codificacin.


void setQrcodeErrorCorrect(int qrcodeErrorCorrect)

Establece el nivel de correccin de errores.


void setQrCodeForegroundColor(java.awt.Color qrCodeF oregroundColor)

Establece el color de mdulo.


void setQrCodeScale(int qrCodeScale)

Establece la escala de mdulo.


void setQrcodeVersion(int qrcodeVersion)

Establece la versin del QRCode.


void setStructureappend(int m, int n, int p)

Establece los valores para crear QRCodes structure append. Methods inherited from class java.lang.Object
clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
qrcodeErrorCorrect
private int qrcodeErrorCorrect

Nivel de correccin de errores

qrcodeEncodeMode
private int qrcodeEncodeMode

Modo de codificacin

qrcodeVersion
private int qrcodeVersion

qrcodeStructureappendN
private int qrcodeStructureappendN

qrcodeStructureappendM
private int qrcodeStructureappendM

qrcodeStructureappendParity
private int qrcodeStructureappendParity

81

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

qrCodeBackgroundColor
private java.awt.Color qrCodeBackgroundColor

Color de fondo

qrCodeForegroundColor
private java.awt.Color qrCodeForegroundColor

Color de mdulos

qrCodeScale
private int qrCodeScale

ancho en pixeles de cada mdulo

qrcodeStructureappendOriginaldata
private java.lang.String qrcodeStructureappendOriginaldata

Detalles de Constructor
QRCodeEncoder
public QRCodeEncoder()

Constructor, establece parmetros por defecto.

Detalles de Mtodos
getQrCodeBackgroundColor
public java.awt.Color getQrCodeBackgroundColor()

Obtiene el color de fondo del smbolo. Returns: Color

setQrCodeBackgroundColor
public void setQrCodeBackgroundColor(java.awt.Color qrCodeBackgroundColor)

Establece el color de fondo del smbolo. Parameters: qrCodeBackgroundColor -

getQrcodeEncodeMode
public int getQrcodeEncodeMode()

Obtiene el modo de codificacin. Returns: int

82

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

setQrcodeEncodeMode
public void setQrcodeEncodeMode(int qrcodeEncodeMode)

Establece el modo de codificacin. Parameters: qrcodeEncodeMode -

getQrcodeErrorCorrect
public int getQrcodeErrorCorrect()

Obtiene el nivel de correccin de errores. Returns: int

setQrcodeErrorCorrect
public void setQrcodeErrorCorrect(int qrcodeErrorCorrect)

Establece el nivel de correccin de errores. Parameters: qrcodeErrorCorrect -

getQrCodeForegroundColor
public java.awt.Color getQrCodeForegroundColor()

Obtiene el color de mdulo. Returns: Color

setQrCodeForegroundColor
public void setQrCodeForegroundColor(java.awt.Color qrCodeForegroundColor)

Establece el color de mdulo. Parameters: qrCodeForegroundColor -

getQrCodeScale
public int getQrCodeScale()

Obtiene la escala de mdulo. Returns: int

setQrCodeScale
public void setQrCodeScale(int qrCodeScale)

Establece la escala de mdulo. Parameters: qrCodeScale -

83

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

getQrcodeVersion
public int getQrcodeVersion()

Obtiene la versin del QRCode. Returns: int

setQrcodeVersion
public void setQrcodeVersion(int qrcodeVersion)

Establece la versin del QRCode. Parameters: qrcodeVersion -

setStructureappend
public void setStructureappend(int m, int n, int p)

Establece los valores para crear QRCodes structure append. Parameters: m - valor m de structure append (1-16) n - valor n de structure append (2-16) p - paridad (0-255)

calStructureappendParity
public int calStructureappendParity(byte[] originaldata)

Calcula la paridad para structure append en funcin de los datos a codificar. Parameters: originaldata - byte[] datos Returns: int structure append paridad

calQrcode
public boolean[][] calQrcode(byte[] qrcodeData)

Crea una matriz de booleanos que representa a un smbolo QRCode que codifica la informacion recibida como datos de entrada. Parameters: qrcodeData - byte[] con los datos a codificar Returns: boolean[][] matriz con el smbolo QRCode

divideDataBy8Bits
private static byte[] divideDataBy8Bits(int[] data,

84

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

byte[] bits, int maxDataCodewords) throws EncodingFailedException

Mtodo privado que divide los datos en conjuntos de 8 bits para crear los codewords, y aade el relleno (padding) s es necesario. Parameters: data - vector de int con los valores bits - vector de byte maxDataCodewords - n mximo de codewords de datos Returns: byte[] datos divididos en grupos de 8 bits Throws:
EncodingFailedException

calculateRSECC
private static byte[] calculateRSECC(byte[] codewords, byte rsEccCodewords, byte[] rsBlockOrder, int maxDataCodewords, int maxCodewords)

Mtodo privado que genera los codewords de correccin de error para cada bloque del smbolo QRCode. Parameters: codewords - byte[] con los codewords de datos ya calculados rsEccCodewords - byte nmero de codewords de ECC rsBlockOrder - byte[] con el orden de los bloques maxDataCodewords - int numero mximo de Codewords de datos para esta versin maxCodewords - int numero mximo de Codewords para esta versin Returns: byte[] con los codewords de ECC

calculateByteArrayBits
private static byte[] calculateByteArrayBits(byte[] xa, byte[] xb, java.lang.String ind)

Mtodo privado auxiliar para el clculo de los ECC codewords. Parameters: xa - byte[] xb - byte[] ind - String Returns: byte[]

selectMask
private static byte selectMask(byte[][] matrixContent, int maxCodewordsBitWithRemain)

85

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Mtodo privado para calcular la mscara de datos ptima. Parameters: matrixContent - byte[][] maxCodewordsBitWithRemain - int mximo de bits con relleno para esta versin Returns: byte que representa el tipo de mscara seleccionada

Encode
public java.awt.image.BufferedImage Encode(java.lang.String cadena)

Codifica una cadena segn parmetros, en un smbolo QRCode. Parameters: cadena - String cadena a codificar Returns: BufferedImage imagen RGB con el smbolo QRcode

jp.sourceforge.qrcode.data

6.2.4 Interface QRCodeImage


public interface QRCodeImage

Sumario de Mtodos
int getHeight() int getPixel(int x, int getWidth() int y)

Detalles de Mtodos
getWidth
int getWidth()

getHeight
int getHeight()

getPixel
int getPixel(int x, int y)

86

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

jp.sourceforge.qrcode.data

6.2.5 Clase QRCodeConstantes


java.lang.Object jp.sourceforge.qrcode.data.QRCodeConstantes public class QRCodeConstantes extends java.lang.Object

Contenedor de constantes habituales de QRCode.

Sumario de Atributos
static int EncodeModeAlphanumeric

Constante para definir el modo de codificacin con caracteres alfanumricos


static int EncodeModeByte

Constante para definir el modo de codificacin con bytes.


static int EncodeModeKanji

Constante para definir el modo de codificacin Kanji.


static int EncodeModeNumeric

Constante para definir el modo de codificacin con caracteres numricos. (0-9)


static int ErrorCorrectH

Constante para definir el grado de correccin H (Alto, mximo).


static int ErrorCorrectL

Constante para definir el grado de correccin L (bajo).


static int ErrorCorrectM

Constante para definir el grado de correccin M (medio).


static int ErrorCorrectQ

Constante para definir el grado de correccin Q (Calidad).

Constructor
QRCodeConstantes()

Sumario de Mtodos
Methods inherited from class java.lang.Object
clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
87

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

ErrorCorrectL
public static final int ErrorCorrectL

Constante para definir el grado de correccin L (bajo). Puede corregir hasta el 7% de los codewords del smbolo. See Also: Constant Field Values

ErrorCorrectM
public static final int ErrorCorrectM

Constante para definir el grado de correccin M (medio). Puede corregir hasta el 15% de los codewords del smbolo. See Also: Constant Field Values

ErrorCorrectQ
public static final int ErrorCorrectQ

Constante para definir el grado de correccin Q (Calidad). Puede corregir hasta el 25% de los codewords del smbolo. See Also: Constant Field Values

ErrorCorrectH
public static final int ErrorCorrectH

Constante para definir el grado de correccin H (Alto, mximo). Puede corregir hasta el 30% de los codewords del smbolo. See Also: Constant Field Values

EncodeModeAlphanumeric
public static final int EncodeModeAlphanumeric

Constante para definir el modo de codificacin con caracteres alfanumricos. (09, A-Z y otros 9 caracteres: espacio, $, %, *, +, -, ., /, :) See Also: Constant Field Values

EncodeModeNumeric
public static final int EncodeModeNumeric

Constante para definir el modo de codificacin con caracteres numricos. (0-9) See Also: Constant Field Values

88

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

EncodeModeByte
public static final int EncodeModeByte

Constante para definir el modo de codificacin con bytes. (por defecto ISO/IEC 8859-1) See Also: Constant Field Values

EncodeModeKanji
public static final int EncodeModeKanji

Constante para definir el modo de codificacin Kanji. Caracteres de la escritura japonesa, compactados en 13 bits. See Also: Constant Field Values

jp.sourceforge.qrcode.data

6.2.6 Clase QRCodeSymbol


java.lang.Object jp.sourceforge.qrcode.data.QRCodeSymbol public class QRCodeSymbol extends java.lang.Object

Clase que Representa a un smbolo QRCode y contiene toda la informacin necesario para representarlo.

Sumario de Atributos
(package alignmentPattern private) Matriz de puntos Point[][] alineamiento. (package dataCapacity private) Capacidad int

con las posiciones de los patrones de

de datos del smbolo QRCode. de errores, hay 4 niveles.

(package errorCorrectionLevel private) Nivel de correccin int (package height private) Altura del int

smbolo en mdulos. patrn de mscara representa los mdulos que forman el

(package maskPattern private) Indice referencia del int

(package moduleMatrix private) Matriz booleana que boolean[][] smbolo (blanco y negro).

89

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

(package numErrorCorrectionCode private) Matriz constante con el nmero de correcciones de int[][] correspondiente a cada versin y nivel de correccin de errores.

error,

(package numRSBlocks private) Matriz constante con el nmero de bloques Reed Solomon, int[][] correspondiente a cada versin y nivel de correccion de errores. (package version private) Tamao del smbolo que puede ir desde int mdulos hasta la 40 con 177x177 mdulos. (package width private) Ancho int

la versin 1 con 21x21

del smbolo en mdulos.

Constructor
QRCodeSymbol(boolean[][] moduleMatrix)

Constructor de clase.

Sumario de Mtodos
private int calcDataCapacity()

Calcula y devuelve la capacidad de almacenamiento de datos que tiene el smbolo QRCode.


(package private) decodeFormatInformation(boolean[] formatInformation) void Decodifica la informacin de formato para asignar el nivel

de correccin de error y el patrn de mscara


(package private) generateMaskPattern() boolean[][] Genera el patrn de

mscara en funcin del tipo ledo en la

informacin de formato.
Point[][] getAlignmentPattern()

Devuelve la matriz de puntos que indica las posiciones de los patrones de alineamiento.
int[] getBlocks()

Obtiene los codewords devolviendolos en un array de int.


int getDataCapacity()

del

smbolo

QRCode

Devuelve la capacidad de almecenaje de datos del smbolo QRCode.


boolean getElement(int x, int getErrorCorrectionLevel() int y)

Devuelve el mdulo del smbolo de la posicin (x,y). Devuelve el nivel de correccin de errores.
int getHeight()

Devuelve la altura del QRCode


int getMaskPatternReferer()

Devuelve el indice referencia del patrn de mscara. 90

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

java.lang.String getMaskPatternRefererAsString()

Devuelve el cdigo del tipo de patrn de mascara.


int getNumErrorCorrectionCode()

Calcula y devuelve el numero de colecciones de error del smbolo en funcin de su versin y nivel de correccin de errores.
int getNumRSBlocks()

Calcula y devuelve el numero de bloques RS del smbolo en funcin de su versin y nivel de correccin de errores.
int getVersion()

Devuelve la versin del smbolo QRCode.


java.lang.String getVersionReference()

Devuelve una cadena con la versin y el nivel de correccin de error del smbolo.
int getWidth()

Devuelve el ancho del QRCode


private void initialize()

Mtodo privado auxiliar para calcular el resto de valores del smbolo.


boolean isInFunctionPattern(int targetX, int targetY)

Indica si un mdulo dado del smbolo pertenece o no a los patrones de funcin del smbolo.
(package private) readFormatInformation() boolean[] Obtiene la informacin void reverseElement(int x, (package private) unmask() void Desenmascara

de formato del QRCode y corrige posibles errores que pueda contener.


int y)

invierte el valor del mdulo (x,y) del smbolo QRCode. los mdulos del Smbolo QRCode con

patrn de mscara. Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
version
int version

Tamao del smbolo que puede ir desde la versin 1 con 21x21 mdulos hasta la 40 con 177x177 mdulos.

errorCorrectionLevel
int errorCorrectionLevel

91

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Nivel de correccin de errores, hay 4 niveles.

maskPattern
int maskPattern

Indice referencia del patrn de mscara

dataCapacity
int dataCapacity

Capacidad de datos del smbolo QRCode.

moduleMatrix
boolean[][] moduleMatrix

Matriz booleana que representa los mdulos que forman el smbolo (blanco y negro).

width
int width

Ancho del smbolo en mdulos.

height
int height

Altura del smbolo en mdulos.

alignmentPattern
Point[][] alignmentPattern

Matriz de puntos con las posiciones de los patrones de alineamiento.

numErrorCorrectionCode
final int[][] numErrorCorrectionCode

Matriz constante con el nmero de correcciones de error, correspondiente a cada versin y nivel de correccin de errores. es una matriz de 40x4.

numRSBlocks
final int[][] numRSBlocks

Matriz constante con el nmero de bloques Reed Solomon, correspondiente a cada versin y nivel de correccion de errores. es una matriz de 40x4.

Detalles de Constructor

92

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

QRCodeSymbol
public QRCodeSymbol(boolean[][] moduleMatrix)

Constructor de clase. Se calculan los valores del smbolo: versin, capacidad de datos, patrones de alineamiento, informacin de formato. Y se desenmascaran los datos. Parameters: moduleMatrix - matriz de booleanos q representa los mdulos del smbolo

Detalles de Mtodos
getElement
public boolean getElement(int x, int y)

Devuelve el mdulo del smbolo de la posicin (x,y). Parameters: xyReturns: boolean true s el mdulo es negro

getNumErrorCorrectionCode
public int getNumErrorCorrectionCode()

Calcula y devuelve el numero de colecciones de error del smbolo en funcin de su versin y nivel de correccin de errores. Returns: int

getNumRSBlocks
public int getNumRSBlocks()

Calcula y devuelve el numero de bloques RS del smbolo en funcin de su versin y nivel de correccin de errores. Returns: int

initialize
private void initialize()

Mtodo privado auxiliar para calcular el resto de valores del smbolo.

getVersion
public int getVersion()

Devuelve la versin del smbolo QRCode. Returns: int

93

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

getVersionReference
public java.lang.String getVersionReference()

Devuelve una cadena con la versin y el nivel de correccin de error del smbolo. Returns: String

getAlignmentPattern
public Point[][] getAlignmentPattern()

Devuelve la matriz de puntos que indica las posiciones de los patrones de alineamiento. Returns: Point[][]

readFormatInformation
boolean[] readFormatInformation()

Obtiene la informacin de formato del QRCode y corrige posibles errores que pueda contener. Returns: boolean[5] con la informacin de formato

unmask
void unmask()

Desenmascara los mdulos del Smbolo QRCode con patrn de mscara.

generateMaskPattern
boolean[][] generateMaskPattern()

Genera el patrn de mscara en funcin del tipo ledo en la informacin de formato. Returns: boolean[width][Height] con la mscara

calcDataCapacity
private int calcDataCapacity()

Calcula y devuelve la capacidad de almacenamiento de datos que tiene el smbolo QRCode. Returns: int

getDataCapacity
public int getDataCapacity()

Devuelve la capacidad de almecenaje de datos del smbolo QRCode.

94

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Returns: int

decodeFormatInformation
void decodeFormatInformation(boolean[] formatInformation)

Decodifica la informacin de formato para asignar el nivel de correccin de error y el patrn de mscara Parameters: formatInformation - boolean[] array con la informacin de formato

getErrorCorrectionLevel
public int getErrorCorrectionLevel()

Devuelve el nivel de correccin de errores. Returns: int

getMaskPatternReferer
public int getMaskPatternReferer()

Devuelve el indice referencia del patrn de mscara. Returns: int

getMaskPatternRefererAsString
public java.lang.String getMaskPatternRefererAsString()

Devuelve el cdigo del tipo de patrn de mascara. Returns: String

getWidth
public int getWidth()

Devuelve el ancho del QRCode Returns: int

getHeight
public int getHeight()

Devuelve la altura del QRCode Returns: int

95

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

getBlocks
public int[] getBlocks()

Obtiene los codewords del smbolo QRCode devolviendolos en un array de int. Returns: int[] array con los codewords del smbolo en formato int

reverseElement
public void reverseElement(int x, int y)

invierte el valor del mdulo (x,y) del smbolo QRCode. Parameters: x - int n de fila -1 y - int n de columna -1

isInFunctionPattern
public boolean isInFunctionPattern(int targetX, int targetY)

Indica si un mdulo dado del smbolo pertenece o no a los patrones de funcin del smbolo. Parameters: targetX - int posicion X de un mdulo de un smbolo QRCode targetY - int posicion Y de un mdulo de un smbolo QRCode Returns: boolean devuelve true s el mdulo dado pertenece a patrones de funcin
jp.sourceforge.qrcode.ecc

6.2.7 Clase BCH15_5


java.lang.Object jp.sourceforge.qrcode.ecc.BCH15_5 public class BCH15_5 extends java.lang.Object

Clase para corregir errores de la informacin de formato y transformarla de 15 bits a 5 bits.

Sumario de Atributos
(package private) bitName static java.lang.String[] (package private) gf16 int[][] (package private)

Matriz de enteros con el gf16. Nmero de errores corregidos.

int numCorrectedError

96

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

(package private) receiveData boolean[] Array de

booleanos para almacenar los datos recibidos con la informacin de formato.

Constructor
BCH15_5(boolean[] source)

Constructor.

Sumario de Mtodos
(package addGF(int arg1, private) Suma el gf16 int int arg2)

de los 2 argumentos pasados como parmetros. errores.

(package calcErrorPositionVariable(int[] s) private) Calcula las posiciones de los bits con int[] private calcSyndrome(boolean[] y) int[] Calcula los 5 bits de datos boolean[] correct()

a partir de 15, usando (5,15)BCH pasado como parmetro y los devuelve en un array. Corrige los errores que pueda contener la informacin de formato recibida.

(package correctErrorBit(boolean[] y, private) Corrige los errores detectados boolean[] actualiza el atributo numCorrectedError. private createGF16() int[][] Crea la matriz

int[] errorPos)

previamente invirtindolos y

GF16. con error.

(package detectErrorBitPosition(int[] s) private) Detecta las posiciones de los bits int[] (package getCode(int input) private) int[] int getNumCorrectedError()

Devuelve el nmero de errores corregidos en la informacin de formato.


(package searchElement(int[] x) private) Devuelve la posicin del int

elemento de x que coincide con el gf16.

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
97

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

gf16
int[][] gf16

Matriz de enteros con el gf16.

receiveData
boolean[] receiveData

Array de booleanos para almacenar los datos recibidos con la informacin de formato.

numCorrectedError
int numCorrectedError

Nmero de errores corregidos.

bitName
static java.lang.String[] bitName

Detalles de Constructor
BCH15_5
public BCH15_5(boolean[] source)

Constructor. Parameters: source - boolean[] array de booleanos con la informacin de formato de un QRCode

Detalles de Mtodos
correct
public boolean[] correct()

Corrige los errores que pueda contener la informacin de formato recibida. Returns: boolean[] con la informacin de formato corregida

createGF16
private int[][] createGF16()

Crea la matriz GF16. Mtodo privado auxiliar. Returns: int[16][4] matriz de enteros

calcSyndrome
private int[] calcSyndrome(boolean[] y)

Calcula los 5 bits de datos a partir de 15, usando (5,15)BCH pasado como parmetro y los devuelve en un array.

98

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Parameters: y - boolean[] array con los 15 modulos de la informacion de formato Returns: int[5]

searchElement
int searchElement(int[] x)

Devuelve la posicin del elemento de x que coincide con el gf16. Parameters: x - int[] Returns: int posicin

detectErrorBitPosition
int[] detectErrorBitPosition(int[] s)

Detecta las posiciones de los bits con error. Parameters: s - int[5] Returns: int[4]

calcErrorPositionVariable
int[] calcErrorPositionVariable(int[] s)

Calcula las posiciones de los bits con errores. Parameters: s - int[5] Returns: int[4]

addGF
int addGF(int arg1, int arg2)

Suma el gf16 de los 2 argumentos pasados como parmetros. Parameters: arg1 - int arg2 - int Returns: int

correctErrorBit
boolean[] correctErrorBit(boolean[] y, int[] errorPos)

99

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Corrige los errores detectados previamente invirtindolos y actualiza el atributo numCorrectedError. Parameters: y - boolean[] array con los bits de la informacin de formato a corregir errorPos - int[] array con las posiciones de los bits erroneos Returns: y boolean[] array de bits con los errores corregidos

getNumCorrectedError
public int getNumCorrectedError()

Devuelve el nmero de errores corregidos en la informacin de formato. Returns: int

getCode
int[] getCode(int input)

Parameters: input - int Returns: int[]

jp.sourceforge.qrcode.exception

6.2.8 Clase EncodingFailedException


java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IllegalArgumentException jp.sourceforge.qrcode.exception.EncodingFailedException

All Implemented Interfaces: java.io.Serializable


public class EncodingFailedException extends java.lang.IllegalArgumentException

Excepcin que indica fallo durante la codificacin. See Also: Serialized Form

Sumario de Atributos
(package private) message java.lang.String

100

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

private serialVersionUID static long ID serial versin.

Constructor
EncodingFailedException(java.lang.String message)

Sumario de Mtodos
java.lang.String getMessage()

Methods inherited from class java.lang.Throwable


fillInStackTrace, getCause, initCause, printStackTrace, setStackTrace, toString getLocalizedMessage, getStackTrace, printStackTrace, printStackTrace,

Methods inherited from class java.lang.Object


clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Detalles de Atributos
serialVersionUID
private static final long serialVersionUID

ID serial versin. See Also: Constant Field Values

message
java.lang.String message

Detalles de Constructor
EncodingFailedException
public EncodingFailedException(java.lang.String message)

Detalles de Mtodos
getMessage
public java.lang.String getMessage()

Overrides:
getMessage

in class java.lang.Throwable

101

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

jp.sourceforge.qrcode.exception

6.2.9 Clase DecodingFailedException


java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IllegalArgumentException jp.sourceforge.qrcode.exception.DecodingFailedException

All Implemented Interfaces: java.io.Serializable


public class DecodingFailedException extends java.lang.IllegalArgumentException

See Also: Serialized Form

Sumario de Atributos
(package private) message java.lang.String private serialVersionUID static long ID serial version.

Constructor
DecodingFailedException(java.lang.String message)

Sumario de Mtodos
java.lang.String getMessage()

Detalles de Atributos
serialVersionUID
private static final long serialVersionUID

ID serial version. See Also: Constant Field Values

message
java.lang.String message

102

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Detalles de Constructor
DecodingFailedException
public DecodingFailedException(java.lang.String message)

Detalles de Mtodos
getMessage
public java.lang.String getMessage()

Overrides:
getMessage

in class java.lang.Throwable

jp.sourceforge.qrcode.geom

6.2.10 Clase Axis


java.lang.Object jp.sourceforge.qrcode.geom.Axis public class Axis extends java.lang.Object

Clase para mover un Point en funcin del eje independiente.

Sumario de Atributos
(package cos private) int (package modulePitch private) int (package origin private) Point (package sin private) int

Constructor
Axis(int[] angle, int modulePitch)

Sumario de Mtodos
void setModulePitch(int modulePitch)

103

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

void setOrigin(Point origin) Point translate(int moveX, Point translate(Point offset) Point translate(Point origin, Point translate(Point origin, Point translate(Point origin, int moveX, int modulePitch, int moveX, int moveY) int moveY) int moveY)

Point offset)

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
sin
int sin

cos
int cos

modulePitch
int modulePitch

origin
Point origin

Detalles de Constructor
Axis
public Axis(int[] angle, int modulePitch)

Detalles de Mtodos
setOrigin
public void setOrigin(Point origin)

104

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

setModulePitch
public void setModulePitch(int modulePitch)

translate
public Point translate(Point offset)

translate
public Point translate(Point origin, Point offset)

translate
public Point translate(Point origin, int moveX, int moveY)

translate
public Point translate(Point origin, int modulePitch, int moveX, int moveY)

translate
public Point translate(int moveX, int moveY)

jp.sourceforge.qrcode.geom

6.2.11 Clase Line


java.lang.Object jp.sourceforge.qrcode.geom.Line public class Line extends java.lang.Object

Representa una linea formada por dos puntos.

Sumario de Atributos
(package x1 private) int

105

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

(package x2 private) int (package y1 private) int (package y2 private) int

Constructor
Line() Line(int x1, Line(Point p1, int y1, int x2, int y2) Point p2)

Sumario de Mtodos
Point getCenter() int getLength() static Line getLongest(Line[] lines) Point getP1() Point getP2() static boolean isCross(Line line1, boolean isHorizontal() static boolean isNeighbor(Line line1, boolean isVertical() void setLine(int x1, void setP1(int x1, void setP1(Point p1) void setP2(int x2, int y2) int y1, int x2, int y2) int y1) Line line2) Line line2)

106

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

void setP2(Point p2) java.lang.String toString() void translate(int dx, int dy)

Methods inherited from class java.lang.Object


clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Detalles de Atributos
x1
int x1

y1
int y1

x2
int x2

y2
int y2

Detalles de Constructor
Line
public Line()

Line
public Line(int int int int x1, y1, x2, y2)

Line
public Line(Point p1, Point p2)

107

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Detalles de Mtodos
getP1
public Point getP1()

getP2
public Point getP2()

setLine
public void setLine(int int int int x1, y1, x2, y2)

setP1
public void setP1(Point p1)

setP1
public void setP1(int x1, int y1)

setP2
public void setP2(Point p2)

setP2
public void setP2(int x2, int y2)

translate
public void translate(int dx, int dy)

isNeighbor
public static boolean isNeighbor(Line line1, Line line2)

isHorizontal
public boolean isHorizontal()

108

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

isVertical
public boolean isVertical()

isCross
public static boolean isCross(Line line1, Line line2)

getCenter
public Point getCenter()

getLength
public int getLength()

getLongest
public static Line getLongest(Line[] lines)

toString
public java.lang.String toString()

Overrides: toString in class java.lang.Object

jp.sourceforge.qrcode.geom

6.2.12 Clase Point


java.lang.Object jp.sourceforge.qrcode.geom.Point public class Point extends java.lang.Object

Representa a un punto en el plano.

Sumario de Atributos
static int BOTTOM static int LEFT static int RIGHT

109

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

static int TOP (package x private) int (package y private) int

posicin X del punto en el plano. posicin Y del punto en el plano.

Constructor
Point()

Constructor, crea el punto (0,0).


Point(int x, int y)

Constructor con parmetros.

Sumario de Mtodos
int distanceOf(Point other)

Devuelve un entero con la distancia del punto a un punto pasado como parmetro.
boolean equals(Point compare)

Indica si el punto y el punto pasado como parmetro tienen la misma posicin.


static Point getCenter(Point p1, Point p2)

Obtiene la posicin media a dos puntos dados como parmetros.


int getX()

Devuelve la posicin X del punto.


int getY()

Devuelve la posicin Y del punto.


void set(int x, int y)

Establece la posicin X e Y del punto.


void setX(int x)

Establece la posicin X del punto.


void setY(int y)

Establece la posicin X del punto.


java.lang.String toString()

Convierte a String el objeto Point.


void translate(int dx, int dy)

Incrementa la posicin del punto en (X + dx, Y + dy). Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

110

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Detalles de Atributos
RIGHT
public static final int RIGHT

See Also: Constant Field Values

BOTTOM
public static final int BOTTOM

See Also: Constant Field Values

LEFT
public static final int LEFT

See Also: Constant Field Values

TOP
public static final int TOP

See Also: Constant Field Values

x
int x

posicin X del punto en el plano.

y
int y

posicin Y del punto en el plano.

Detalles de Constructor
Point
public Point()

Constructor, crea el punto (0,0).

Point
public Point(int x, int y)

Constructor con parmetros.

111

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Parameters: xy-

Detalles de Mtodos
getX
public int getX()

Devuelve la posicin X del punto. Returns: int

getY
public int getY()

Devuelve la posicin Y del punto. Returns: int

setX
public void setX(int x)

Establece la posicin X del punto. Parameters: x - int

setY
public void setY(int y)

Establece la posicin X del punto. Parameters: y - int

translate
public void translate(int dx, int dy)

Incrementa la posicin del punto en (X + dx, Y + dy). Parameters: dx dy -

set
public void set(int x, int y)

Establece la posicin X e Y del punto. Parameters:

112

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

x y

toString
public java.lang.String toString()

Convierte a String el objeto Point. Overrides: toString in class java.lang.Object Returns: String

getCenter
public static Point getCenter(Point p1, Point p2)

Obtiene la posicin media a dos puntos dados como parmetros. Parameters: p1 - Point p2 - Point Returns: Point

equals
public boolean equals(Point compare)

Indica si el punto y el punto pasado como parmetro tienen la misma posicin. Parameters: compare - Point Returns: boolean true si son iguales

distanceOf
public int distanceOf(Point other)

Devuelve un entero con la distancia del punto a un punto pasado como parmetro. Parameters: other - Point Returns: int

jp.sourceforge.qrcode.geom

6.2.13 Clase SamplingGrid


java.lang.Object jp.sourceforge.qrcode.geom.SamplingGrid public class SamplingGrid

113

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

extends java.lang.Object

Permite que un rea tenga un tamao diferente de otra

Sumario de Clases Anidadas


private SamplingGrid.AreaGrid class grid para un rea simple

Sumario de Atributos
private grid SamplingGrid.AreaGrid[][]

Constructor
SamplingGrid(int sqrtNumArea)

Sumario de Mtodos
void adjust(Point adjust) int getHeight() int getHeight(int ax, int getTotalHeight() int getTotalWidth() int getWidth() int getWidth(int ax, int getX(int ax, Line getXLine(int ax, Line[] getXLines(int ax, int getY(int ay, Line getYLine(int ax, int ay, int ay, int ay) int x) int x) int ay) int y) int y) int ay)

114

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Line[] getYLines(int ax, void initGrid(int ax, void setXLine(int ax, void setYLine(int ax, int ay, int ay, int ay, int width, int x, int y,

int ay) int height) Line line) Line line)

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
grid
private SamplingGrid.AreaGrid[][] grid

Detalles de Constructor
SamplingGrid
public SamplingGrid(int sqrtNumArea)

Detalles de Mtodos
initGrid
public void initGrid(int int int int ax, ay, width, height)

setXLine
public void setXLine(int ax, int ay, int x, Line line)

setYLine
public void setYLine(int ax, int ay, int y, Line line)

115

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

getXLine
public Line getXLine(int ax, int ay, int x) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

getYLine
public Line getYLine(int ax, int ay, int y) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

getXLines
public Line[] getXLines(int ax, int ay)

getYLines
public Line[] getYLines(int ax, int ay)

getWidth
public int getWidth()

getHeight
public int getHeight()

getWidth
public int getWidth(int ax, int ay)

getHeight
public int getHeight(int ax, int ay)

getTotalWidth
public int getTotalWidth()

116

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

getTotalHeight
public int getTotalHeight()

getX
public int getX(int ax, int x)

getY
public int getY(int ay, int y)

adjust
public void adjust(Point adjust)

jp.sourceforge.qrcode.pattern

6.2.14 Clase AlignmentPattern


java.lang.Object jp.sourceforge.qrcode.pattern.AlignmentPattern public class AlignmentPattern extends java.lang.Object

Clase que representa a un patrn de alineamiento dentro de un smbolo QRCode.

Sumario de Atributos
(package private) BOTTOM static int (package private) canvas static DebugCanvas (package private) center Point[][] (package private) LEFT static int (package private) patternDistance int (package private) RIGHT static int (package private) TOP static int

117

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Constructor
AlignmentPattern(Point[][] center, int patternDistance)

Sumario de Mtodos
static AlignmentPattern findAlignmentPattern(boolean[][] image, FinderPattern finderPattern) Point[][] getCenter() (package private) getCenter(boolean[][] image, static Point[][] FinderPattern finderPattern, Point[][] logicalCenters) static Point[][] getLogicalCenter(FinderPattern finderPattern)

Obtiene las coordenadas del punto central de un patron de alineamiento


int getLogicalDistance() (package private) getPrecisionCenter(boolean[][] image, static Point Point targetPoint) void setCenter(Point[][] center) (package private) targetPointOnTheCorner(boolean[][] image, static boolean int x, int y, int nx, int ny)

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
RIGHT
static final int RIGHT

See Also: Constant Field Values

BOTTOM
static final int BOTTOM

See Also: 118

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Constant Field Values

LEFT
static final int LEFT

See Also: Constant Field Values

TOP
static final int TOP

See Also: Constant Field Values

canvas
static DebugCanvas canvas

center
Point[][] center

patternDistance
int patternDistance

Detalles de Constructor
AlignmentPattern
AlignmentPattern(Point[][] center, int patternDistance)

Detalles de Mtodos
findAlignmentPattern
public static AlignmentPattern findAlignmentPattern(boolean[][] image, FinderPattern finderPattern) throws AlignmentPatternNotFoundException, InvalidVersionException

Throws:
AlignmentPatternNotFoundException InvalidVersionException

getCenter
public Point[][] getCenter()

119

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

setCenter
public void setCenter(Point[][] center)

getLogicalDistance
public int getLogicalDistance()

getCenter
static Point[][] getCenter(boolean[][] image, FinderPattern finderPattern, Point[][] logicalCenters) throws AlignmentPatternNotFoundException

Throws:
AlignmentPatternNotFoundException

getPrecisionCenter
static Point getPrecisionCenter(boolean[][] image, Point targetPoint) throws AlignmentPatternNotFoundException

Throws:
AlignmentPatternNotFoundException

targetPointOnTheCorner
static boolean targetPointOnTheCorner(boolean[][] image, int x, int y, int nx, int ny)

getLogicalCenter
public static Point[][] getLogicalCenter(FinderPattern finderPattern)

Obtiene las coordenadas del punto central de un patron de alineamiento Parameters: finderPattern - FinderPattern Returns: Point[][]

jp.sourceforge.qrcode.pattern

6.2.15 Clase FinderPattern


java.lang.Object jp.sourceforge.qrcode.pattern.FinderPattern public class FinderPattern extends java.lang.Object

120

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Sumario de Atributos
(package private) canvas static DebugCanvas (package private) center Point[] static int DL (package private) moduleSize int[] (package private) sincos int[] static int UL static int UR (package private) version int (package private) VersionInfoBit static int[] (package private) width int[]

Constructor
FinderPattern(Point[] center, int version, int[] sincos, int[] width, int[] moduleSize)

Sumario de Mtodos
int[] angle, (package private) calcExactVersion(Point[] centers, static int int[] moduleSize, boolean[][] image) (package private) calcRoughVersion(Point[] center, static int (package private) cantNeighbor(Line line1, static boolean (package private) checkPattern(int[] buffer, static boolean (package private) checkVersionInfo(boolean[] target) static int static FinderPattern findFinderPattern(boolean[][] image) int[] width) Line line2) int pointer)

121

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

(package private) findLineAcross(boolean[][] image) static Line[] (package private) findLineCross(Line[] lineAcross) static Line[] int[] getAngle() (package private) getAngle(Point[] centers) static int[] Point[] getCenter() Point getCenter(int position) (package private) getCenter(Line[] crossLines) static Point[] int getModuleSize() int getModuleSize(int place) (package private) getPointAtSide(Point[] points, static Point int side2) int getSqrtNumModules() (package private) getURQuadrant(int[] angle) static int int getVersion() (package private) getWidth(boolean[][] image, static int[] int[] sincos) int getWidth(int position) (package private) sort(Point[] centers, static Point[] int[] angle) Point[] centers, int side1,

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
UL
public static final int UL

See Also: 122

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Constant Field Values

UR
public static final int UR

See Also: Constant Field Values

DL
public static final int DL

See Also: Constant Field Values

VersionInfoBit
static final int[] VersionInfoBit

canvas
static DebugCanvas canvas

center
Point[] center

version
int version

sincos
int[] sincos

width
int[] width

moduleSize
int[] moduleSize

Detalles de Constructor
FinderPattern
FinderPattern(Point[] center, int version, int[] sincos, int[] width,

123

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

int[] moduleSize)

Detalles de Mtodos
findFinderPattern
public static FinderPattern findFinderPattern(boolean[][] image) throws FinderPatternNotFoundException, VersionInformationException

Throws:
FinderPatternNotFoundException VersionInformationException

getCenter
public Point[] getCenter()

getCenter
public Point getCenter(int position)

getWidth
public int getWidth(int position)

getAngle
public int[] getAngle()

getVersion
public int getVersion()

getModuleSize
public int getModuleSize()

getModuleSize
public int getModuleSize(int place)

getSqrtNumModules
public int getSqrtNumModules()

findLineAcross
static Line[] findLineAcross(boolean[][] image)

124

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

checkPattern
static boolean checkPattern(int[] buffer, int pointer)

findLineCross
static Line[] findLineCross(Line[] lineAcross)

cantNeighbor
static boolean cantNeighbor(Line line1, Line line2)

getAngle
static int[] getAngle(Point[] centers)

getCenter
static Point[] getCenter(Line[] crossLines) throws FinderPatternNotFoundException

Throws:
FinderPatternNotFoundException

sort
static Point[] sort(Point[] centers, int[] angle)

getURQuadrant
static int getURQuadrant(int[] angle)

getPointAtSide
static Point getPointAtSide(Point[] points, int side1, int side2)

getWidth
static int[] getWidth(boolean[][] image, Point[] centers, int[] sincos) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

125

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

calcRoughVersion
static int calcRoughVersion(Point[] center, int[] width)

calcExactVersion
static int calcExactVersion(Point[] centers, int[] angle, int[] moduleSize, boolean[][] image) throws InvalidVersionInfoException, InvalidVersionException

Throws:
InvalidVersionInfoException InvalidVersionException

checkVersionInfo
static int checkVersionInfo(boolean[] target) throws InvalidVersionInfoException

Throws:
InvalidVersionInfoException

jp.sourceforge.qrcode.pattern

6.2.16 Clase LogicalSeed


java.lang.Object jp.sourceforge.qrcode.pattern.LogicalSeed public class LogicalSeed extends java.lang.Object

Clase para consultar donde se colocan los patrones.

Sumario de Atributos
private seed static int[][]

Matriz que contendr las posiciones de los patrones para cada versin QRCode.

Constructor
LogicalSeed()

Sumario de Mtodos
126

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

static int[] getSeed(int version)

Devuelve las posiciones de los patrones de una versin QRCode dada.


static int getSeed(int version, int patternNumber)

Devuelve la posicin de uno de los patrones de una versin QRCode dada. Methods inherited from class java.lang.Object
clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
seed
private static int[][] seed

Matriz que contendr las posiciones de los patrones para cada versin QRCode.

Detalles de Constructor
LogicalSeed
public LogicalSeed()

Detalles de Mtodos
getSeed
public static int[] getSeed(int version) throws java.lang.IndexOutOfBoundsException

Devuelve las posiciones de los patrones de una versin QRCode dada. Parameters: version - int Returns: int[] array de enteros con las semillas Throws:
java.lang.IndexOutOfBoundsException

getSeed
public static int getSeed(int version, int patternNumber) throws java.lang.IndexOutOfBoundsException

Devuelve la posicin de uno de los patrones de una versin QRCode dada. Parameters: version - int patternNumber - int nmero de patrn Returns: int Throws: 127

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

java.lang.IndexOutOfBoundsException

jp.sourceforge.qrcode.reader

6.2.17 Clase QRCodeDataBlockReader


java.lang.Object jp.sourceforge.qrcode.reader.QRCodeDataBlockReader public class QRCodeDataBlockReader extends java.lang.Object

Sumario de Atributos
(package bitPointer private) int (package blockPointer private) int (package blocks private) int[] (package canvas private) DebugCanvas (package dataLength private) int (package dataLengthMode private) int (package MODE_8BIT_BYTE private) static int (package MODE_KANJI private) static int (package MODE_NUMBER private) static int (package MODE_ROMAN_AND_NUMBER private) static int (package numErrorCorrectionCode private) int (package sizeOfDataLengthInfo private) int[][]

128

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Constructor
QRCodeDataBlockReader(int[] blocks, int numErrorCorrectionCode) int version,

Sumario de Mtodos
byte[] get8bitByteArray(int dataLength) (package private) get8bitByteString(int dataLength) java.lang.String byte[] getDataByte() (package private) getDataLength(int modeIndicator) int java.lang.String getDataString() (package private) getFigureString(int dataLength) java.lang.String (package private) getKanjiString(int dataLength) java.lang.String (package private) getNextBits(int numBits) int (package private) getNextMode() int (package private) getRomanAndFigureString(int dataLength) java.lang.String (package private) guessMode(int mode) int

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
blocks
int[] blocks

dataLengthMode
int dataLengthMode

129

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

blockPointer
int blockPointer

bitPointer
int bitPointer

dataLength
int dataLength

numErrorCorrectionCode
int numErrorCorrectionCode

canvas
DebugCanvas canvas

MODE_NUMBER
static final int MODE_NUMBER

See Also: Constant Field Values

MODE_ROMAN_AND_NUMBER
static final int MODE_ROMAN_AND_NUMBER

See Also: Constant Field Values

MODE_8BIT_BYTE
static final int MODE_8BIT_BYTE

See Also: Constant Field Values

MODE_KANJI
static final int MODE_KANJI

See Also: Constant Field Values

sizeOfDataLengthInfo
final int[][] sizeOfDataLengthInfo

Detalles de Constructor
130

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

QRCodeDataBlockReader
public QRCodeDataBlockReader(int[] blocks, int version, int numErrorCorrectionCode)

Detalles de Mtodos
getNextBits
int getNextBits(int numBits) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

getNextMode
int getNextMode() throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

guessMode
int guessMode(int mode)

getDataLength
int getDataLength(int modeIndicator) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

getDataByte
public byte[] getDataByte() throws InvalidDataBlockException

Throws:
InvalidDataBlockException

getDataString
public java.lang.String getDataString() throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

getFigureString
java.lang.String getFigureString(int dataLength) throws java.lang.ArrayIndexOutOfBoundsException

131

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Throws:
java.lang.ArrayIndexOutOfBoundsException

getRomanAndFigureString
java.lang.String getRomanAndFigureString(int dataLength) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

get8bitByteArray
public byte[] get8bitByteArray(int dataLength) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

get8bitByteString
java.lang.String get8bitByteString(int dataLength) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

getKanjiString
java.lang.String getKanjiString(int dataLength) throws java.lang.ArrayIndexOutOfBoundsException

Throws:
java.lang.ArrayIndexOutOfBoundsException

jp.sourceforge.qrcode.reader

6.2.18 Clase QRCodeImageReader


java.lang.Object jp.sourceforge.qrcode.reader.QRCodeImageReader public class QRCodeImageReader extends java.lang.Object

Clase para realizar el pretratamiento a un smbolo QRCode antes de decodificarlo.

ested Class Summary


132

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

protected QRCodeImageReader.ModulePitch class Clase para almacenar el grado

de inclinacin de un mdulo respecto a

cada borde.

Sumario de Atributos
(package bitmap private) Matriz boolean[][] binarizada. (package canvas private) DebugCanvas static int DECIMAL_POINT

de booleanos para almacenar la imagen QRCode

Punto decimal.
static boolean POINT_DARK

Cte. booleana para el modulo negro.


static boolean POINT_LIGHT

Cte. booleana para el modulo blanco.


(package samplingGrid private) rejilla de area. SamplingGrid

Constructor
QRCodeImageReader()

Constructor.

Sumario de Mtodos
(package applyCrossMaskingMedianFilter(boolean[][] image, private) int threshold) boolean[][] Aplica a una imagen binaria un filtro de media. (package applyMedianFilter(boolean[][] image, private) Aplica un filtro de media a una imagen boolean[][] (package filterImage(int[][] image) private) Pasa una imagen almacenada boolean[][] grises y luego la binariza. int threshold)

binaria.

en matriz de enteros a escala de


Point end,

(package getAreaModulePitch(Point start, private) int int logicalDistance)

Obtiene el pitch de mdulo de un rea.


(package getMiddleBrightnessPerArea(int[][] image) private) Obtiene el brillo medio de cada area de una imagen. int[][] (package getQRCodeMatrix(boolean[][] image, private) SamplingGrid gridLines) boolean[][] obtiene la matriz de un smbolo QRCode.

133

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

QRCodeSymbol getQRCodeSymbol(int[][] image)

Construye un QRCodeSymbol a partir de una matriz de int.


QRCodeSymbol getQRCodeSymbolWithAdjustedGrid(Point adjust)

Obtiene un QRCodeSymbol usando un grid de ajuste.


(package getSamplingGrid(FinderPattern finderPattern, private) AlignmentPattern alignmentPattern) SamplingGrid Obtiene un sampling grid genrico. (package grayScaleToBitmap(int[][] grayScale) private) Binariza una imagen en escala de grises. boolean[][] (package imageToGrayScale(int[][] image) private) Pasa una imagen almacenada en void de grises.

una matriz de enteros a escala

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
canvas
DebugCanvas canvas

DECIMAL_POINT
public static int DECIMAL_POINT

Punto decimal.

POINT_DARK
public static final boolean POINT_DARK

Cte. booleana para el modulo negro. See Also: Constant Field Values

POINT_LIGHT
public static final boolean POINT_LIGHT

Cte. booleana para el modulo blanco. See Also: Constant Field Values

samplingGrid
SamplingGrid samplingGrid

rejilla de area.

134

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

bitmap
boolean[][] bitmap

Matriz de booleanos para almacenar la imagen QRCode binarizada.

Detalles de Constructor
QRCodeImageReader
public QRCodeImageReader()

Constructor.

Detalles de Mtodos
applyMedianFilter
boolean[][] applyMedianFilter(boolean[][] image, int threshold)

Aplica un filtro de media a una imagen binaria. Parameters: image - boolean[][] imagen de entrada threshold - int umbral para distinguir blanco de negro Returns: boolean[][] imagen binaria

applyCrossMaskingMedianFilter
boolean[][] applyCrossMaskingMedianFilter(boolean[][] image, int threshold)

Aplica a una imagen binaria un filtro de media. Parameters: image - boolean[][] imagen de entrada threshold - int umbral para distinguir blanco de negro Returns: boolean[][] imagen binaria

filterImage
boolean[][] filterImage(int[][] image)

Pasa una imagen almacenada en matriz de enteros a escala de grises y luego la binariza. Parameters: image - int[][] Returns: boolean[][] imagen binaria filtrada

imageToGrayScale
void imageToGrayScale(int[][] image)

135

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Pasa una imagen almacenada en una matriz de enteros a escala de grises. Parameters: image - int[][]

grayScaleToBitmap
boolean[][] grayScaleToBitmap(int[][] grayScale)

Binariza una imagen en escala de grises. Parameters: grayScale - int[][] imagen en escala de grises Returns: boolean[][] imagen binarizada

getMiddleBrightnessPerArea
int[][] getMiddleBrightnessPerArea(int[][] image)

Obtiene el brillo medio de cada area de una imagen. Parameters: image - int[][] imagen de entrada Returns: int[][] brillo medio de cada area

getQRCodeSymbol
public QRCodeSymbol getQRCodeSymbol(int[][] image) throws SymbolNotFoundException

Construye un QRCodeSymbol a partir de una matriz de int. Parameters: image - int[][] imagen QRcode en formato de matriz de int Returns: QRCodeSymbol con el simbolo QRcode pasado como parmetro Throws:
SymbolNotFoundException

getQRCodeSymbolWithAdjustedGrid
public QRCodeSymbol getQRCodeSymbolWithAdjustedGrid(Point adjust) throws java.lang.IllegalStateException, SymbolNotFoundException

Obtiene un QRCodeSymbol usando un grid de ajuste. Solo se debe llamar despues de llamar a getQRCodeSymbol. Parameters: adjust - Point Returns: QRCodeSymbol Throws:

136

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

java.lang.IllegalStateException

- se lanza cuando el mtodo se lanza

antes que getQRCodeSymbol


SymbolNotFoundException

getSamplingGrid
SamplingGrid getSamplingGrid(FinderPattern finderPattern, AlignmentPattern alignmentPattern)

Obtiene un sampling grid genrico. Parameters: finderPattern - FinderPattern alignmentPattern - AlignmentPattern Returns: SamplingGrid

getAreaModulePitch
int getAreaModulePitch(Point start, Point end, int logicalDistance)

Obtiene el pitch de mdulo de un rea. Parameters: start - Point punto inicial end - Point punto final logicalDistance - int Returns: int pitch de mdulo

getQRCodeMatrix
boolean[][] getQRCodeMatrix(boolean[][] image, SamplingGrid gridLines) throws java.lang.ArrayIndexOutOfBoundsException

obtiene la matriz de un smbolo QRCode. Parameters: image - boolean[][] gridLines - SamplingGrid Returns: boolean[][] Throws:
java.lang.ArrayIndexOutOfBoundsException

137

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

jp.sourceforge.qrcode.util

6.2.19 Interface Color


public interface Color

Interfaz con ints que representan colores en formato RGB.

Sumario de Atributos
static int BLACK static int BLUE static int DARKGRAY static int GRAY static int GREEN static int LIGHTBLUE static int LIGHTGRAY static int LIGHTGREEN static int LIGHTRED static int ORANGE static int RED static int WHITE

Detalles de Atributos
GRAY
static final int GRAY

See Also:

138

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Constant Field Values

LIGHTGRAY
static final int LIGHTGRAY

See Also: Constant Field Values

DARKGRAY
static final int DARKGRAY

See Also: Constant Field Values

BLACK
static final int BLACK

See Also: Constant Field Values

WHITE
static final int WHITE

See Also: Constant Field Values

BLUE
static final int BLUE

See Also: Constant Field Values

GREEN
static final int GREEN

See Also: Constant Field Values

LIGHTBLUE
static final int LIGHTBLUE

See Also: Constant Field Values

LIGHTGREEN
static final int LIGHTGREEN

See Also:

139

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Constant Field Values

RED
static final int RED

See Also: Constant Field Values

ORANGE
static final int ORANGE

See Also: Constant Field Values

LIGHTRED
static final int LIGHTRED

See Also: Constant Field Values

jp.sourceforge.qrcode.util

Interface DebugCanvas
All Known Implementing Classes: ConsoleCanvas, DebugCanvasAdapter
public interface DebugCanvas

Sumario de Mtodos
void drawCross(Point point, void drawLine(Line line, void drawLines(Line[] lines, void drawMatrix(boolean[][] matrix) void drawPoint(Point point, void drawPoints(Point[] points, void drawPolygon(Point[] points, void println(java.lang.String string) int color) int color) int color) int color) int color) int color)

140

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Detalles de Mtodos
println
void println(java.lang.String string)

drawPoint
void drawPoint(Point point, int color)

drawCross
void drawCross(Point point, int color)

drawPoints
void drawPoints(Point[] points, int color)

drawLine
void drawLine(Line line, int color)

drawLines
void drawLines(Line[] lines, int color)

drawPolygon
void drawPolygon(Point[] points, int color)

drawMatrix
void drawMatrix(boolean[][] matrix)

jp.sourceforge.qrcode.util

Clase ConsoleCanvas
java.lang.Object jp.sourceforge.qrcode.util.ConsoleCanvas

141

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

All Implemented Interfaces: DebugCanvas


public class ConsoleCanvas extends java.lang.Object implements DebugCanvas

Constructor
ConsoleCanvas()

Sumario de Mtodos
void drawCross(Point point, void drawLine(Line line, void drawLines(Line[] lines, void drawMatrix(boolean[][] matrix) void drawPoint(Point point, void drawPoints(Point[] points, void drawPolygon(Point[] points, void println(java.lang.String str) int color) int color) int color) int color) int color) int color)

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Constructor
ConsoleCanvas
public ConsoleCanvas()

Detalles de Mtodos
println
public void println(java.lang.String str)

Specified by: println in interface DebugCanvas 142

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

drawPoint
public void drawPoint(Point point, int color)

Specified by: drawPoint in interface DebugCanvas

drawCross
public void drawCross(Point point, int color)

Specified by: drawCross in interface DebugCanvas

drawPoints
public void drawPoints(Point[] points, int color)

Specified by: drawPoints in interface DebugCanvas

drawLine
public void drawLine(Line line, int color)

Specified by: drawLine in interface DebugCanvas

drawLines
public void drawLines(Line[] lines, int color)

Specified by: drawLines in interface DebugCanvas

drawPolygon
public void drawPolygon(Point[] points, int color)

Specified by:
drawPolygon

in interface DebugCanvas

drawMatrix
public void drawMatrix(boolean[][] matrix)

Specified by: drawMatrix in interface DebugCanvas

143

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

jp.sourceforge.qrcode.util

Clase ContentConverter
java.lang.Object jp.sourceforge.qrcode.util.ContentConverter public class ContentConverter extends java.lang.Object

Sumario de Atributos
(package n private) static char

Constructor
ContentConverter()

Sumario de Mtodos
static java.lang.Str convert(java.lang.String targetString) ing private convertDocomoAddressBook(java.lang.String targetS static java.lang.Str tring) ing private convertDocomoBookmark(java.lang.String targetStri static java.lang.Str ng) ing private convertDocomoMailto(java.lang.String s) static java.lang.Str ing private removeString(java.lang.String s, static java.lang.Str java.lang.String s1) ing private replaceString(java.lang.String s, static java.lang.Str java.lang.String s1, java.lang.String s2) ing

Methods inherited from class java.lang.Object


clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Atributos
144

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

n
static char n

Detalles de Constructor
ContentConverter
public ContentConverter()

Detalles de Mtodos
convert
public static java.lang.String convert(java.lang.String targetString)

convertDocomoBookmark
private static java.lang.String convertDocomoBookmark(java.lang.String targetString)

convertDocomoAddressBook
private static java.lang.String convertDocomoAddressBook(java.lang.String targetString)

convertDocomoMailto
private static java.lang.String convertDocomoMailto(java.lang.String s)

replaceString
private static java.lang.String replaceString(java.lang.String s, java.lang.String s1, java.lang.String s2)

removeString
private static java.lang.String removeString(java.lang.String s, java.lang.String s1)

jp.sourceforge.qrcode.util

Clase QRCodeUtility
java.lang.Object jp.sourceforge.qrcode.util.QRCodeUtility public class QRCodeUtility extends java.lang.Object

145

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Clase contenedora de mtodos tiles.

Constructor
QRCodeUtility()

Sumario de Mtodos
static int ReadInput(java.io.BufferedInputStream sourceStream, byte[] target, int start, int count)

Lee un nmero de caracteres de un BufferedInputStream y los escribe en un array de bytes a partir de una posicin dada
static int ReadInput(java.io.BufferedReader sourceTextReader, short[] target, int start, int count)

Lee un nmero de caracteres de un BufferedReader y los escribe en un array de bytes a partir de una posicin dada
static int sqrt(int val)

Calcula la raz cuadrada de un nmero.


static int URShift(int valor, static int URShift(int valor, static long URShift(long valor, static long URShift(long valor, int bits) long bits) int bits) long bits)

Realiza n desplazamientos a la derecha sin signo a un int Realiza n desplazamientos a la derecha sin signo a un int Realiza n desplazamientos a la derecha sin signo a un long Realiza n desplazamientos a la derecha sin signo a un long Methods inherited from class java.lang.Object
clone, equals, finalize, toString, wait, wait, wait getClass, hashCode, notify, notifyAll,

Detalles de Constructor
QRCodeUtility
public QRCodeUtility()

Detalles de Mtodos
sqrt
public static int sqrt(int val)

Calcula la raz cuadrada de un nmero. Parameters: val - int Returns: 146

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

int

ReadInput
public static int ReadInput(java.io.BufferedInputStream sourceStream, byte[] target, int start, int count)

Lee un nmero de caracteres de un BufferedInputStream y los escribe en un array de bytes a partir de una posicin dada Parameters: sourceStream - BufferedInputStream del que leer caracteres. target - byte[] donde se escribiran los caracteres ledos start - int posicin a partir de la cual se escribe en el array. count - int mximo de caracteres a leer del buffer. Returns: int nmero de caracteres ledos. -1 s no se leyo ningn caracter

ReadInput
public static int ReadInput(java.io.BufferedReader sourceTextReader, short[] target, int start, int count)

Lee un nmero de caracteres de un BufferedReader y los escribe en un array de bytes a partir de una posicin dada Parameters: sourceTextReader - BufferedReader del que leer caracteres. target - byte[] donde se escribiran los caracteres ledos start - int posicin a partir de la cual se escribe en el array. count - int mximo de caracteres a leer del buffer. Returns: int nmero de caracteres ledos. -1 s no se leyo ningn caracter

URShift
public static int URShift(int valor, int bits)

Realiza n desplazamientos a la derecha sin signo a un int Parameters: valor - int bits - int cantidad de bits que desplazar Returns: int

URShift
public static int URShift(int valor, long bits)

147

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Realiza n desplazamientos a la derecha sin signo a un int Parameters: valor - int bits - long cantidad de bits que desplazar Returns: int

URShift
public static long URShift(long valor, int bits)

Realiza n desplazamientos a la derecha sin signo a un long Parameters: valor - long bits - int cantidad de bits que desplazar Returns: long

URShift
public static long URShift(long valor, long bits)

Realiza n desplazamientos a la derecha sin signo a un long Parameters: valor - long bits - long cantidad de bits que desplazar Returns: long

148

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

149

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

7. Instalacin previa

La aplicacin es una aplicacin Java preparada para poder ser ejecutada en la mayora de sistemas operativos de escritorio. Lo nico necesario para poder ejecutarla es tener instalada la Maquina Virtual de Java correspondiente al sistema operativo en cuestin. Puede descargarla gratuitamente desde la pgina web oficial

http://www.java.com/es/download/ tambin aqu puede encontrar instrucciones sobre su instalacin. Una vez instalada para iniciar la aplicacin debemos ejecutar el archivo:

QRCodeProyecto.jar
Tenemos que abrirlo con el Java(TM ) Platform SE Binary, est debera ser la opcin por defecto del sistema para abrir los ficheros jar, despus de haber instalado la Mquina Virtual Java. Otra forma de ejecutarlo es escribir en la consola el siguiente comando: java jar [RUTA]QRCodeProyecto.jar Siendo [RUTA] la ruta del directorio donde se encuentra el fichero jar a ejecutar.

Es muy importante tener en cuenta que la aplicacin no es slo el fichero jar, sino tambin el directorio Resources, como se muestra en la imagen.

150

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Este directorio debe estar en la misma carpeta que el archivo jar, sino es as el programa no funcionar correctamente y saldrn mensajes de error al intentar codificar un QR Code.

151

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

152

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

8. Manual de usuario

Para iniciar la aplicacin ejecute el archivo:

QRCodeProyecto.jar
Si el programa no se inicia, pruebe a abrirlo con el Java(TM ) Platform SE Binary, est debera ser la opcin por defecto del sistema para abrir los ficheros jar, despus de haber instalado la Mquina Virtual Java. Si no pruebe a ejecutarlo escribiendo en la consola el siguiente comando: java jar [RUTA]QRCodeProyecto.jar Siendo [RUTA] la ruta del directorio donde se encuentra el fichero jar a ejecutar. Si esto no funciona probablemente no tenga instalada la Maquina Virtual de Java, lea la seccin Instalacin Previa para ms informacin. Una vez iniciada la aplicacin tendremos la siguiente ventana:

153

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Como generar un QR Code:

Podemos escribir los datos que queremos que nuestro QR Code contenga en el campo de texto, donde pone Datos a codificar.

En el campo versin QRCode podemos elegir la versin de QR Code a utilizar, a mayor versin mayor ser el espacio que ocupar el QR Code generado. Se recomienda usar la menor posible y para ello lo mejor es dejar este campo en Auto, as el programa ser el que se encargue de calcular cual es la versin menor posible.

154

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

En el campo Nivel de correccin de errores podemos elegir el nivel de correccin de error que tendr el smbolo generado, a mayor nivel ms posibilidad de poder interpretar sin errores el QR Code a generar. Existen 4 niveles que por orden de mayor efectividad son: L, M , Q, H. El recomendado es Q, hay que tener en cuenta que cuanto mayor sea el nivel mayor ser el espacio que ocupar el QR Code.

En el campo Modo de codificacin podemos elegir el modo en que se codificaran los datos. S slo vamos a codificar datos numricos (0123456789), se recomienda elegir Numrico. S slo vamos a codificar datos alfanumricos (0-9, A-Z y otros 9 caracteres: espacio, $, %, *, +, -, ., /, :), se recomienda usar Alfanumrico. Si vamos a usar caracteres que no estn entre los anteriores se recomienda usar Byte. Si no se tiene muy claro qu modo usar elegir Byte, en caso de elegir un modo de decodificacin errneo a la hora de interpretar el QR Code generado pueden aparecer el carcter [] sustituyendo a los caracteres que estn mal codificados.

En el campo Tamao en pxeles por modulo podemos elegir el tamao que tendr cada mdulo de los que formaran el QR Code a generar, se recomienda un tamao de 4 pxeles para QR Codes de versiones pequeas, y 6 para QR Codes con versiones ms grandes.

155

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Una vez introducidos todos los parmetros podemos hacer click en el botn Codificar para generar el QR Code deseado. Aparecer dibujado en la regin negra de la ventana. Si es demasiado grande para esta regin, la ventana entera crecer. Despus podemos clicar en el botn Guardar para almacenar la imagen generada en algn dispositivo de almacenamiento. Aparecer un cuadro de dilogo como este:

Podemos guardar la imagen en varios formatos: png, jpg, gif, bmp. Se recomienda el formato png, porque con este formato, la imagen conserva toda su calidad y ocupa mucho menos espacio en disco.

Como Interpretar un QR Code:

Para interpretar un QR Code lo primero es colocarse en la ficha Decodificar, para ello clicamos arriba en la pestaa derecha.

156

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

La ficha de decodificacin tiene el siguiente aspecto:

Si clicamos en el botn Abrir imagen nos aparecer una ventana para seleccionar el archivo de imagen que contiene el QR code que queremos interpretar. Este archivo puede ser de tipo bmp, jpg, png o gif.

157

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Una vez seleccionada el archivo de imagen, la imagen se mostrar en la regin negra de la ventana. Para interpretar el QR Code tendremos que hacer click en el botn Decodificar. Si no se encuentran errores en el proceso de decodificacin la cadena de caracteres que contena el QR Code aparecer escrita en el campo de texto Resultado.

Si hubiera algn error que provocara que no se pudiera interpretar un QR Code a partir de esa imagen, aparecer un mensaje de error indicando la razn.

158

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

159

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

9. Pruebas

Pruebas de caja blanca del cdigo fuente: Se han realizado pruebas de caja blanca utilizando el framework JUnit de Java a los mtodos de las clases del cdigo fuente para comprobar que individualmente funcionan correctamente. An as no existe la prueba perfecta capaz de detectar todos lo errores.

Pruebas temporales: Los tiempos de ejecucin de la codificacin y decodificacin son aparentemente inmediatos para la cantidad de datos mxima posible, en un pc de sobremesa comn.

Pruebas funcionales de decodificacin con imgenes creadas por el codificador: Se han realizado cientos de pruebas de codificacin y decodificacin de smbolos durante la implementacin y despus de esta, probando con diferentes parmetros de entrada. Se han obtenido algunos datos curiosos.

En general el decodificador no puede con imgenes QR code cuyo tamao de mdulo es inferior a 4x4 pxeles, ya que no encuentra los patrones localizadores o decodifica los datos errneamente. Por ejemplo si codificamos un smbolo con un tamao de 1x1 pxeles por mdulo, con los datos abcdefghijklmnopqrstuvwxyz

160

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

La decodifcacin se realiza con errores. Pero si generamos el mismo QR Code con un tamao de 2x2 s funciona.

Si repetimos el experimento con un smbolo de mayor versin que contiene mayor cantidad de datos como este

La decodificacin falla para un tamao de mdulo por debajo de 3x3 pxeles.

Cuanto mayor es la cantidad de datos del QR code, mayor debe ser el numero de pxeles por mdulo. Aumentar el grado de correccin de errores puede mejorar stos resultados. 4x4 pxeles por mdulo es una cantidad que garantiza una interpretacin correcta en general del QR code, al menos hasta los de versin 20-M, y reducido tamao de la imagen (1.87 KB para un QR code V1, 23 KB para un QR code V20, en formato png).

Para ste QR code no se ha elegido la versin ms adecuada sino q se ha forzado a usar la 7, aparecen bits en la regin de codificacin q se pueden confundir con patrones de alineamiento, sin embargo lo decodifica bien.

161

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Si cogemos este smbolo y lo rotamos 90 hacia la derecha, con un programa de dibujo, obtenemos la siguiente imagen:

La cual se consigue decodificar correctamente. El decodificar detecta su orientacin y la rota a su posicin original. Si giramos otra vez 90 el QR Code anterior, o sea, 180 en total, obtenemos la siguiente imagen:

El resultado de la decodificacin es positivo tambin. Y si la giramos 90 ms, o sea, 270 en total:

El resultado de la decodificacin es tambin positivo. Ahora si volteamos horizontalmente la imagen como en un espejo:

162

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

La decodificacin no tiene xito. Esto es, porque no est implementada la funcionalidad adicional Mirror imaging, de la especificacin QR Code.

Ahora, s generamos un QR Code con colores de fondo y mdulo diferentes a negro y blanco como el siguiente (ste ha sido generado ejecutando la clase prueba.java desde eclipse):

Al decodificarlo tenemos xito, esto quiere decir que el algoritmo de decodificacin ha realizado bien la binarizacin de la imagen.

Ahora s generamos el mismo QR Code pero con los colores invertidos:

La decodificacin falla. Lo mismo pasa si intentamos decodificar este QR Code:

163

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Esto es porque no est implementada la funcionalidad de reflectancia inversa en el algoritmo de decodificacin. El decodificador piensa siempre que los colores ms oscuros son mdulos con valor 1 y los colores mas claros son mdulos con valor 0.

Ahora vamos a generar un QR Code y con un programa de dibujo lo vamos rotar ligeramente, siendo este el resultado:

Al tratar de decodificarlo tenemos xito. Ahora probamos a ensanchar uno de los QR Code anteriores y deformarlo ligeramente:

164

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Para esta ligera deformacin de ensanchado tenemos xito pero si lo ensanchamos mas el smbolo deja de ser decodificable. A continuacin generamos un QR Code con ECC = L y le aadimos borrones con un programa de dibujo. Este smbolo contiene la siguiente informacin Estos datos se van a convertir en un QRCode

Al intentar decodificarlo el mensaje obtenido es Estos datos se van ` convertir%un un   Cofe, luego hay errores en la decodificacin que no se han detectado. Si hacemos lo mismo con un ECC = H, los errores disminuyen.

Por ultimo trataremos de decodificar un smbolo QR Code contenido en una fotografa borrosa:

165

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Al intentar decodificarlo el resultado es negativo, el decodificar no es capaz de localizar los patrones localizadores. Quiz si se mejora el pretratamiento de la imagen para eliminar ruido se pudiera decodificar.

166

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

167

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

10. Comparacin con otras alternativas


QR Code, es un estndar de cdigo de barras bidimensional, es decir, es capaz de contener informacin en ambas direcciones (verticalmente y horizontalmente) a diferencia de los tradicionales cdigos de barra (de una dimensin). Los cdigos de una sola dimensin slo son capaces de almacenar informacin en una direccin, por lo tanto necesitan mucho ms espacio de impresin para almacenar la misma cantidad de informacin. La unidad de informacin de un cdigo unidimensional es la barra, en uno bidimensional es el mdulo (cuadradito).

Existen varias tipos de cdigos de barras bidimensionales aparte del QR Code, hablaremos de ellos ms adelante y los compararemos con QR Code.

El xito probado del QR code, se debe precisamente a su estndar abierto. Tambin a que su decodificacin puede realizarse, con cualquier telfono mvil con cmara; sin ser importante la calidad de sta. Esto es debido a sus sistemas de correccin de errores basados en Reed Solomon. Los QR Code tienen 40 versiones diferentes ordenadas de menor a mayor tamao, cada una con un lmite de datos; siendo la ms grande capaz de almacenar hasta 7089 caracteres numricos o 2953 bytes).

El sistema de correccin de errores de QR Code permite restaurar los datos si parte del smbolo est daado o manchado. Existen cuatro niveles de correccin de errores, pudiendo llegar a restaurar hasta el 30% de la informacin perdida debido a la suciedad, deterioro del cdigo, etc. La correccin de errores se basa en Reed Solomon.

168

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Un QR Code puede ser ledo a alta velocidad (Quick Response) desde todas las orientaciones (en 360). Esto es debido a que posee unos patrones (patrones localizadores) que permiten detectar la posicin del cdigo. As, aunque es necesario mantener una lnea de visin directa entre el cdigo y el lector la posicin del smbolo no es crtica, a diferencia de por ejemplo los cdigos de barras. Si la imagen no esta recta se detecta su orientacin y se rota.

La publicacin de las especificaciones del cdigo, ha permitido la proliferacin de lectores de cdigo QR de muy bajo coste o incluso gratuitos. La posibilidad de utilizar las cmaras de los mviles y los PDAs, ha permitido que la mayora de los telfonos puedan leerlos descifrando la informacin contenida en los mismos. Muchos de los principales fabricantes de telefona mvil incorporar de serie en algunos de sus dispositivos aplicaciones para leer QR Codes.

Adems QR Code soporta los caracteres del alfabeto japons Kanji y viene preparado para poder soportar cualquier otro lenguaje, gracias a la implementacin del CIE (Canal de Interpretacin Extendida).

Alternativas unidimensionales a QR Code: El cdigo de barras tradicional fue inventado en 1952, sigue siendo la alternativa ms popular y extendida en el mundo, es unidimensional.

169

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Cdigo de barras EAN13

Codifica la informacin mediante un conjunto de lneas paralelas verticales de distinto grosor y espaciado. Actualmente, el cdigo de barras est implantado masivamente de forma global. La correspondencia o mapeo entre la informacin y el cdigo que la representa se denomina simbologa. Estas simbologas pueden ser clasificadas en dos grupos atendiendo a dos criterios diferentes: Continua o discreta: los caracteres en las simbologas continuas comienzan con un espacio y en el siguiente comienzan con una barra (o viceversa). Sin embargo, en los caracteres en las simbologas discretas, stos comienzan y terminan con barras y el espacio entre caracteres es ignorado, ya que no es lo suficientemente ancho.

Bidimensional

multidimensional:

las

barras

en

las

simbologas

bidimensionales pueden ser anchas o estrechas. Sin embargo, las barras en las simbologas multidimensionales son mltiplo de una anchura determinada (X). De esta forma, se emplean barras con anchura X, 2X, 3X, y 4X. Trminos:

Mdulo: Es la unidad mnima o bsica de un cdigo. Puede ser una barra o un espacio.

Barra: El elemento (oscuro) dentro del cdigo. Se hace corresponder con el valor binario 1. 170

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Espacio: El elemento (claro) dentro del cdigo. Se hace corresponder con el valor binario 0.

Carcter: Formado por barras y espacios. Normalmente se corresponde con un carcter alfanumrico.

Barras guarda: barras ms largas que aparecen en muchos cdigos de barras para dividir el cdigo en dos partes e informarle al computador o "scanner" qu es lo que necesita conocer para as reajustar su programa, de modo que interprete adecuadamente la otra parte remanente del cdigo.

Partes de un cdigo de barras

Los cdigos de barras se imprimen en negro sobre fondo blanco o tambin en azul sobre blanco. Su lectura no necesita una cmara o escner de imgenes sino un escner lser. ste solo mide el grosor de las lneas del cdigo mediante un haz laser con forma de lnea horizontal, el haz lser incide sobre el cdigo de barras y rebota de nuevo hacia el escner con diferentes energas cada punto del haz dependiendo de si rebot en un punto negro o blanco.

171

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Escner de cdigos de barras

Ventajas frente a QR Code: No necesita un dispositivo que capture imgenes para su interpretacin, sino un lser, aunque tambin pueden servir para interpretarlos. Aunque no tienen sistema de correccin de errores (slo un checksum para detectarlos), son bastante resistentes a defectos en la impresin ya que para leerlos solo es necesario que se pueda trazar una lnea libre de errores que lo atraviese horizontalmente. Mayor agilidad al tomar la captura a decodificar con el dispositivo lser.

Desventajas: Ocupan mayor espacio con menor capacidad de datos, ya que son unidimensionales Solo soporta caracteres alfanumricos o numricos. No tiene sistema de correccin de errores. Poco atractivos a la vista.

Algunos tipos de cdigos de barras lineales:


EAN Code 128 Code 39 Code 93

172

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Existen otros cdigos de informacin bidimensionales, como el DataMatrix tambin estandarizado.

Alternativas bidimensionales al QR Code:

A. DataMatrix: Est formado por mdulos cuadrados organizados dentro de una matriz al igual que QR Code. Cada smbolo tiene regiones de datos y patrones funcionales como QR Code. En smbolos grandes ECC 200, las regiones de datos estn separadas por patrones de alineamiento. Puede codificar hasta 2335 caracteres en una superficie pequea. Fue desarrollado en 1989 por International Data Matrix Inc. La versin de dominio pblico es la ECC 200, desarrollada tambin por International Data Matrix en 1995. A primera vista la diferencia ms notable respecto a QR Code, es qu DataMatrix, posee menos patrones de funcin y se ocupa menos espacio con ellos.

La principal ventaja de QR Code de respecto de DataMatrix y dems es la velocidad a la que se decodifica, de ah el nombre de Quick Response. Los QR Code poseen un patrn de localizacin que se coloca en la esquina superior izquierda, en la superior derecha y en la inferior izquierda. Esto ayuda a la deteccin de la orientacin del QR Code y sus lmites. No es necesario que la imagen tomada sea de gran calidad. La desventaja de esto es que se pierde espacio para almacenar datos. Por estas razones, DataMatrix es ms utilizado para uso industrial y QR Code para uso cotidiano.

DataMatrix

QR Code con los patrones localizadores resaltados

173

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

DataMatrix tambin tiene mecanismos de correccin de errores basados en Reed Solomon pero solo posee un nivel de ECC, mientras que QR Code tiene cuatro niveles. QR Code soporta caracteres Kanji del alfabeto japons y permite la implementacin de otras codificaciones, mientras que DataMatrix no.

El tamao mnimo de un cdigo DataMatrix es menor, tienen mayor eficiencia en la utilizacin del espacio. Esta ventaja de un mejor aprovechamiento del espacio entra en conflicto con los problemas de enfoque de las pticas de los dispositivos mviles. Que un cdigo sea muy pequeo lo hace muy difcil de enfocar y a menudo lo invalida. Por ello, queda relegado a uso industrial dnde se cuente con los lectores oportunos.

B. Micro QR Code Definido tambin junto al QR Code en el estndar JIS-X-0510 y el ISO/IEC 18004. Es una versin ms pequea del QR code con un solo patrn localizador y menos capacidad de datos. Tiene los mismos modos y grados de correccin pero solo tiene 4 versiones, M1 con un tamao de 11x11 mdulos, M2 con 13x13, M3 con 15x15 y M4 con 17x17. Para la versin 1 la correccin de errores no existe, slo se detecta la existencia de errores; tampoco contiene informacin de versin.

Su uso est poco extendido y las diferencias funcionales respecto a QR Code son menor capacidad de datos a cambio de menor espacio necesario.

174

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Ejemplos de smbolos Micro QR Code de versin M2: a) orientacin y reflectancia normal b) orientacin normal y reflectancia invertida c) orientacin transpuesta y reflectancia normal d) orientacin transpuesta y reflectancia invertida

Partes de Micro QR Code

175

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

C. PDF 417 (Portable Data File) Inventado por Ynjiun Wang (Symbol Technologies) en 1991. En l se combinan mdulos y barras, las barras almacenan la informacin de versin, mientras que los mdulos formando codewords almacenan los datos. Sus smbolos tienen dependiendo de la necesidad de almacenamiento entre tres y noventa filas. Tiene 9 niveles de correccin de errores. Es un cdigo bastante resistente a defectos tras la impresin puesto que tiene una alta capacidad de errores. Es muy usado por las empresas de correos. Su relacin capacidad de datos-espacio es menor que la de QR Code. El dispositivo lector requerido debe ser de mayor calidad que el necesario para QR Code. No soporta caracteres Kanji.

Ejemplo de smbolo PDF 417

D. MaxiCode: Creado originalmente por United Parcel Service, liber su especificacin en 1992. Es tambin conocido por el nombre de Ojo de pjaro. En vez de mdulos o barras, se compone de circulitos hexagonales y de tres circunferencias concntricas situadas en el centro; formando una diana. Este tipo de cdigo tambin cuenta con un estndar ISO, el ISO/IEC 16023. Puede almacenar hasta 93 bytes. La diana central sirve para detectar el centro del smbolo. No importa que el smbolo este rotado, la orientacin no es un problema para la decodificacin. Esto tambin pasa con QR Code pero con MaxiCode no es necesario ni siquiera rotar la imagen. Posee 7 modos con diferentes niveles de correccin de errores. La mayor desventaja es que su capacidad de almacenamiento es poca.

176

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Ejemplo de smbolo MaxiCode

Alternativas multicolores al QR Code Por ltimo comentamos que existen cdigos de barra bidimensionales de mltiples colores, no son en blanco y negro sino que pueden tener muchos ms colores. As se consigue mayor cantidad de informacin en el mismo espacio. De hecho podramos hablar de que son cdigos de barra tridimensionales si consideramos el color como una tercera dimensin. Un ejemplo de este tipo de cdigos, es el Colorcode. La desventaja de estos cdigos multicolor es que requieren capturas de imagen de mayor calidad y contraste para que no se confundan unos colores con otros. Ya en QR Code hay problemas de contraste cuando al tomar la imagen del smbolo las condiciones de luz y reflejos no son aceptables.

177

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

178

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

11. Posibles mejoras


Existen varias caractersticas adicionales descritas en el estndar que no son implementadas actualmente por la aplicacin realizada, dichas caractersticas podran implementarse en una futura versin. Son las siguientes:

1) Structure append: consiste en almacenar cantidades de datos elevadas en vez de en un solo QR Code (donde probablemente no quepan), en varios a la vez, concretamente hasta 16 QR Codes apilados en dos columnas. Este conjunto de smbolos QR Code lleva almacenada la informacin necesaria para reconstruir el mensaje completo ordenado.

2) Canal de Interpretacin Extendido (Extended Channel Interpretation): este mecanismo permite crear nuevos modos de codificacin con los que codificar los datos a almacenar. Por ejemplo se podran crear modos de codificacin para los caracteres de los alfabetos griego o ruso o cualquier otra codificacin que se pueda necesitar. 3) Reflectancia invertida: consiste en que, en vez de dibujar los mdulos del smbolo de color negro y el fondo de color blanco, se pinten de blanco los mdulos, y de negro el fondo. El decodificador debe ser capaz de detectar que el QR Code a decodificar, est con la reflectancia invertida y decodificarlo consecuentemente. El codificador actual, implementa esta funcionalidad pero no el decodificador. 4) Imagen espejo (Mirror imaging): consiste en codificar los smbolos QR Code como si los estuviramos viendo en un espejo. El decodificador debe ser capaz de detectar que el QR Code a decodificar, est usando esta caracterstica y decodificarlo consecuentemente.

179

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Otra posible mejora a realizar consiste en implementar en el codificador el modo de codificacin Kanji, para poder crear QR Codes que contengan datos con caracteres Kanji. Esta funcionalidad viene en el estndar como principal debido a que los QR Codes fueron creados por japoneses. Para los occidentales no es demasiado til y por eso no est implementada.

Una ampliacin evidente de este proyecto, consistira en reutilizar la librera con los mdulos de codificacin y decodificacin (todo menos la interfaz), para crear una aplicacin ejecutable en dispositivos mviles. Adems si el dispositivo mvil posee una cmara la aplicacin podra permitir capturar fotos de QR Codes y decodificarlos acto seguido. La aplicacin actual tambin podra conectarse a un escner o una cmara conectada al PC para tomar imgenes de QR Codes y decodificarlas.

Se podra pasar los mdulos de decodificacin y codificacin de QR Codes (sera todo menos la interfaz de usuario), de J2SE a J2ME, para poder programar un midlet y poder crear una aplicacin similar a la actual para dispositivos mviles.

El algoritmo de decodificacin siempre es mejorable, en el sentido de que sea capaz de decodificar imgenes de QR Codes de mala calidad que ahora mismo no es capaz de decodificar. Tambin se puede intentar mejorar su complejidad temporal.

En este sentido algunas mejoras posibles son:

Detectar si la imagen no posee una zona de silencio adecuada alrededor del smbolo QR Code y modificar la imagen para autogenerarla correctamente.

Detectar si la imagen es demasiado grande para redimensionarla y as reducir los pixeles a analizar en el proceso de decodificacin.

Mejorar el proceso de binarizacin de la imagen. En general mejorar el pretratamiento de la imagen antes de tratar de decodificarla, usando filtros y dems.

180

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

Otras mejoras consisten en mejorar la funcionalidad de la interfaz con objeto de mejorar la decodificacin. Permitiendo al usuario por ejemplo, rotar el mismo la imagen, recortarla, binarizarla eligiendo l mismo el color umbral, redimensionarla, etc.

181

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

182

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

12. Conclusiones

Para terminar este documento comentaremos las conclusiones obtenidas de este proyecto.

QR Code, es un estndar de cdigo de barras bidimensional, de estndar abierto y que es una gran alternativa al cdigo de barras y dems cdigos de una dimensin. QR Code es capaz de contener informacin en ambas direcciones (verticalmente y horizontalmente) a diferencia del cdigo de barras que slo es capaz de almacenar informacin en una direccin. La capacidad de almacenamiento es mayor en el caso del QR Code, as es posible almacenar hasta 7089 caracteres numricos.

Tambin es una gran alternativa a otros cdigos bidimensionales ya que su estructura y caractersticas, como son la correccin de errores o la capacidad de detectar su orientacin; le permite ser decodificado con imgenes de no demasiada calidad. Podemos tomar fotos a un smbolo QR Code con una cmara de mvil de poca resolucin o en unas condiciones lejanas a las de un estudio fotogrfico y un as ser capaces de decodificarlo sin errores. Adems se decodifican a gran velocidad, soportan caracteres del alfabeto japons Kanji y estn preparados para poder soportar cualquier otra decodificacin que se defina.

El coste de estas ventajas es una menor capacidad de almacenamiento, que otras alternativas bidimensionales como el DataMatrix. Por esto, DataMatrix es ms utilizado para uso industrial y QR Code para uso cotidiano.

En este proyecto se ha realizado una aplicacin de escritorio capaz de generar e interpretar QR Codes, y que es ejecutable en muchos sistemas operativos gracias a la tecnologa Java, esta aplicacin es de cdigo abierto. Ademas se ha creado una librera, 183

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

tambin de cdigo abierto, que es reutilizable para crear nuevas aplicaciones similares, o para crear una aplicacin para dispositivos mviles adaptndola. El cdigo fuente est comentado para facilitar su estudio.

En el punto 9 hemos comprobado que el algoritmo de decodificacin no es infalible y puede ser mejorado por ejemplo mediante un mejor pretratamiento de la imagen.

Tambin en este proyecto hemos realizado un estudio del estndar QR Code JIS-X-0510 y hemos resumido en espaol sus caractersticas. Buscando en internet se puede comprobar que a da de hoy no existe en la red ningn resumen o traduccin al espaol similar.

184

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

185

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

13. Costes de desarrollo y Anlisis temporal


Costes de desarrollo: Para que un proyecto sea satisfactorio, los costes de desarrollo deben estar dentro de los lmites establecidos durante la planificacin. En este tipo de proyecto los costes que se pueden tener en cuneta son:

Costes de Hardware

Gasto energtico

Coste de Software Manuales y documentos Mano de obra

Para realizar este proyecto solo se ha utilizado mi ordenador personal y mi porttil como estos ya los posea antes de empezar el proyecto no hay porqu contarlos como gasto. Simplemente se podra contar el desgaste por el uso que se les ha dado para la realizacin del proyecto.

Otro de los costes posibles a incluir que se han comentado es el gasto energtico, como el trabajo se ha realizado en casa o en la biblioteca de la facultad, tampoco lo tomartemos en cuenta.

El software utilizado para desarrollar es en su mayora libre y gratuito y el que no lo es se ha obtenido gratuitamente desde MSDN Alliance gracias a ser alumno de la Escuela Tecnica Superior de Ingenieros Informaticos de la Universidad de Sevilla. Como es el caso del sistema operativo Windows Vista, Windows Xp y Windows 7.

186

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

La mano de obra tampoco supone coste ya que soy el nico trabajador del proyecto junto con el tutor.

Sobre el coste en manuales, comentar que los manuales utilizados han sido, o bien apuntes o libros que ya posea por ser necesarios para las asignaturas de la carrera, o han sido consultados en pginas web gratutas.

Por tanto, se podran hacer varias estimaciones de costes, sobre el gasto por la utilizacin de los PCs, o el gasto de luz consumido pero son gastos que son tan pobres que son despreciables, por lo que el coste producido es mnimo. Anlisis temporal: Las horas estimadas para un proyecto de Ingeniera Informtica son 540 horas, ya que se calcula unas 30 horas de trabajo realizado por cada crdito de dicho proyecto. Esta estimacin, es un clculo aproximado, ya que puede variar mucho las horas empleadas en un proyecto que en otro, aunque el trabajo realizado debera coincidir cercanamente con esa estimacin

Para este proyecto, se ha invertido un total de 518 horas, lo que implica 22 horas invertidas menos que las estimadas. Eso implica un 4% menos de horas,

empleadas para finalizar el proyecto, de las estimadas.

Las horas invertidas en el proyecto se pueden dividir segn el tipo de tarea desempeada. Las tareas y sus horas invertidas son:

1) Recopilacin de informacin y tecnologas usadas y anlisis: 31 horas. Esta tarea consiste en consultar internet y libros para encontrar informacin necesaria para abordar el proyecto, como son informacin sobre QR Code, cdigos de barra, Java, Eclipse, Netbeans y dems teconologas alternativas. Y analizar como se va a realizar el proyecto.

187

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

2) Lectura, estudio, traduccin al espaol y resumen de la especificacin QR Code: 150 horas. 3) Diseo e implementacin de la aplicacin y la librera: 205 horas. 4) Pruebas: 22 horas. 5) Elaboracin de la memoria del proyecto: 76 horas. 6) Reuniones con el tutor del proyecto: 7 horas. 7) Maquetacin: 2 horas. Impresin, encuadernado y grabacin de los cds necesarios para hacer una entrega del proyecto correcta. 8) Preparacin de la exposicin del proyecto: 25 horas.

188

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

189

Gins Miguel Fernndez Ordez

Generador e intrprete de QR Code

14. Bibliografa
La mayora de la bibliografa utilizada ha sido obtenida a travs de pginas web.

Estndar QR Code 2004 JIS X-0510. Tratamiento de imgenes de Francisco Javier Molina Cantero www.denso-wave.com www.iso.org www.iec.ch www.qrcode.es www.andaluciaqr.com http://sourceforge.jp www.codeproject.com www.psytec.co.jp www.trendwatching.com

190

También podría gustarte