Generador e intérprete de QR Code ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA

191  23  Descargar (0)

Texto completo

(1)

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA

INGENIERÍA INFORMÁTICA

GENERADOR E INTERPRETE QR CODE

Realizado por:

Ginés Miguel Fernández Ordóñez

Dirigido por:

José Ramón Portillo Fernández

Departamento de

MATEMÁTICA APLICADA I

(2)

Índice

0. ¿Qué es QR Code?... 5

1. Definición de objetivos……….. 9

2. Resumen del estándar QR Code..……… 12

2.1 Términos y definiciones del estándar………. 12

2.2 Características principales………. 15

2.3 Estructura del símbolo……….. 16

2.4 Codificación de un QR Code……… 21

2.4.1 Análisis de los datos……….. 22

2.4.2 Codificación de los datos………. 23

2.4.2.1 Conversión de bits de datos a codewords……… 25

2.4.3 Corrección de errores……… 29

2.4.4 Construir la secuencia final de Codewords……….. 37

2.4.5 Colocación de Codewords en la matriz……… 37

2.4.6 Enmascarar los datos……….. 39

2.4.7 Información de formato……….………. 41

2.4.8 Información de versión………. 42

2.5 Decodificación de un QR Code………. 43

(3)

5. Diseño de la aplicación……… 58

5.1 Diseño de la interfaz gráfica………..59

5.2 Diseño de la Librería……… 63

6. Implementación de la aplicación………. 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 Axis……… 103

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

(4)

7. Instalación previa………150

8. Manual de usuario…..………. 153

9. Pruebas……….. 160

10. Comparación con otras alternativas……… 168

11. Posibles mejoras ……….. 179

12. Conclusiones………..………. 183

13. Costes de desarrollo y Análisis temporal………186

(5)
(6)

0.

¿Qué es QR Code?

QR Code o Quick Response Code (Código de Respuesta Rápida), es un estándar de

“código de barras bidimensional”.

Fue creado en Japón en el año 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

estándares de los QR Code, el japonés JIS X 0510, creado por la JIS y distribuido en

enero de 1999; y el correspondiente estándar 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 estándar abierto y a que su

decodificación puede realizarse con cualquier teléfono móvil con cámara sin ser

importante la calidad de ésta. En Japón está muy extendido su uso y es raro que los

móviles no vengan con software incorporado para decodificarlos.

Ventajas del QR Code:

El QR Code es capaz de contener información en ambas direcciones (verticalmente y

horizontalmente) a diferencia de los tradicionales códigos de barra (de una dimensión),

que tan sólo son capaces de almacenar información en una dirección. Precisamente por

este motivo, la capacidad de almacenamiento es mayor en el caso del QR Code (así es

posible almacenar 7089 caracteres numéricos o 2953 bytes). La unidad de información

de un código unidimensional es la barra, en uno bidimensional es el módulo

(7)

Además aporta otras características muy interesantes:

- Los QR Codes tiene la capacidad de corregir errores. Se pueden restaurar los

datos si parte del código está dañado o manchado. Existen varios niveles de

corrección de errores, pudiendo llegar a restaurar hasta el 30% de la información

perdida debido a la suciedad, deterioro del código, etc. El sistema de corrección

de errores se basa en Reed Solomon.

- Los QR Codes pueden ser leído 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 posición del código. Así, aunque es

necesario mantener una línea de visión directa entre el código y el lector la

posición de la etiqueta no es crítica, a diferencia de los códigos de barras. Si la

imagen no esta recta se detecta su orientación y se rota.

El uso del QR Code se ha popularizado (sobre todo en países como Japón) gracias a

la combinación de tres factores:

- La publicación de las especificaciones del código. Esto ha permitido la

proliferación de lectores de QR Code de muy bajo coste o incluso gratuitos.

Además, se han desarrollado aplicaciones de software que permiten descifrar el

QR Code. Muchas de ellas son gratuitas.

- La integración con dispositivos móviles (teléfonos y PDAs). Esto ha permitido

que la mayoría de los teléfonos puedan leer los QR Code, puesto que sólo

necesitan tener una cámara de fotos para la captura de los códigos y una

aplicación (que en muchos casos es gratuita) para descifrar la información

contenida en los mismos. Muchos de los principales fabricantes de telefonía

(8)

- Además QR Code soporta los caracteres del alfabeto japonés Kanji y viene

preparado para poder soportar cualquier otro lenguaje.

El factor común predominante en la gran parte de las aplicaciones existentes es la

utilización de los QR Codes como “almacén” de información, que al ser decodificada

mediante un dispositivo lector (que puede ser el propio teléfono móvil), redirige a una

página web que el usuario puede consultar a través de su dispositivo móvil.

Existen otros códigos de información bidimensionales, como el DataMatrix

también estandarizado. La principal diferencia de QR Code de respecto de DataMatrix y

demás es la velocidad a la que se decodifica, de ahí el nombre de Quick Response. Los

QR Code poseen un patrón de localización que se coloca en la esquina superior

izquierda, en la superior derecha y en la inferior izquierda. Esto ayuda a la detección de

la orientación del QR Code y sus límites. 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 más utilizado para uso industrial y QR Code para uso

(9)

DataMatrix QR Code con los patrones localizadores resaltados

(10)

1. Definición de objetivos

Los objetivos de este proyecto son tres principalmente:

1) Comprender y dar una explicación de la especificación del estándar QR Code

2006, su algoritmo de codificación y decodificación, así como las partes que

componen los símbolos, sus diferentes versiones y características.

2) Desarrollar una librería en Java que sirva tanto para generar símbolos QR Code

compatibles con el estándar QR Code 2006, como para interpretar un símbolo

QR Code 2006 compatible y ver su mensaje. La librería también debe

implementar algunos algoritmos de pretratamiento de imágenes para mejorar la

probabilidad de éxito en la interpretación. Además la complejidad temporal de la

generación y sobre todo de la interpretación debe ser óptima ya que debe poder

ejecutarse en dispositivos móviles y PDAs.

3) Desarrollar una aplicación Windows en lenguaje Java, que utilizando la librería

anterior sirva para generar e interpretar símbolos QR Code, y que permita

especificar y usar las características principales del estándar; como son las

diferentes versiones de símbolos, formatos de datos, niveles de corrección de

errores, etc.

Necesitamos información abundante y contrastada sobre el funcionamiento del

estándar QR Code 2006 para poder estudiar y comprender el funcionamiento de los QR

Code, su codificación y decodificación, y sus opciones.

La compañía japonesa Denso Wave, es la creadora de los QR Code y tras su

creación en 1994 decidió distribuir libremente su especificación y “regalarlo al mundo”.

(11)

documento; siendo la última versión la ISO/IEC 18004 2006 con título: “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 año antes en el 1999, la

JIS (Japanese Industrial Standards), creó otro documento oficial, el JIS X0510 con el mismo estándar QR Code, ambos estándares son compatibles. El JIS X0510 está escrito

en japonés pero es libre y su última versión es del 2004.

Como necesitamos desarrollar una librería de funciones capaz de emular el estándar

y que pueda ser utilizada por cualquier programa, necesitamos un lenguaje de alto nivel

moderno orientado a objetos, Java es una buena opción. Teniendo en cuenta el lenguaje

de alto nivel que utilizamos, se tiene la posibilidad de la fácil reutilización de código

para futuras mejoras, lo cual ayuda a un posterior desarrollo o estudio de la aplicación a

diseñar. Necesitamos que la librería a crear sea fácilmente portable y usable, el lenguaje

Java facilita la portabilidad de los programas implementados con él, gracias a su

tecnología basada en maquinas virtuales.

La ejecución de los procesos de codificación y de decodificación debe ser rápida, los

algoritmos deben tener una complejidad temporal lo más baja posible. Hay que

centrarse en comprobar la complejidad de los cuellos de botella. Aunque también hay

que tener en cuenta que para el caso de los QR Codes, el tamaño de los datos tiene un

límite, al menos a la hora de codificar. La versión de símbolo QR Code con mayor

capacidad de datos puede almacenar hasta 7089 caracteres numéricos (2953 en ASCII).

Para la decodificación el tamaño de los datos dependerá del número de pixeles de la

imagen que contiene el QR Code a decodificar.

La aplicación gráfica a crear será de tipo ventana para aumentar su usabilidad. Debe

ser capaz de mostrar y generar imágenes y fotos, ya que los códigos de barra QR Code

son imágenes normalmente obtenidas con cámaras. El programa contendrá controles

para poder especificar las diferentes opciones que nos ofrece el estándar para crear e

(12)
(13)

2. Resumen del estándar QR Code

2.1 Términos y definiciones del estándar

Comenzaremos dando una definición de los principales términos del estándar QR Code:

Bit de relleno:

Se usa para rellenar el codeword final después del terminador en una cadena de bits de

datos.

Bits restantes:

Usado para llenar posiciones de la región de codificación donde el espacio no se divide

exactamente en 8 bits.

Codeword:

Conjunto de 8 módulos que puede tener diferentes formas dependiendo de su

localización en el símbolo y que sirve para almacenar información codificada de los

datos o de la corrección de errores.

Codeword restante:

Codeword de relleno para llenar posiciones sin codeword asignado para completar la

capacidad total del símbolo. Va detrás de los codewords de corrección de error.

Contador de caracteres:

Secuencia de bits que define el numero de caracteres que contiene una cadena de datos

(14)

Enmascarado de los datos:

Proceso en el cual, a los módulos de la región de codificación, se les realiza una operación XOR con un patrón máscara. Esto sirve para aumentar la diferenciación entre

módulos blancos y negros y así mejorar la decodificación.

Indicador de modo:

Identificador de 4 bits que indica en qué modo está codificada la secuencia de bits que

le sigue.

Información de formato:

Patrón codificado que contiene información sobre el grado de corrección de errores con

el que se han codificado los datos de la región de codificación y el tipo de máscara que

se les ha aplicado.

Información de versión:

Patrón codificado en los símbolos de versión 7 o superior que contiene información que

indica la versión del símbolo.

Modo:

Forma en que se representa un conjunto de datos como cadena de bits. La cadena de bits

puede representar caracteres alfanuméricos, numéricos, bytes, Kanji o cualquier otro

que se defina.

Módulo:

Cuadrito blanco o negro que en conjunto componen el símbolo QR Code.

Patrón de alineamiento:

(15)

Patrón de función:

Partes del símbolo que no contiene los datos codificados, sino información necesaria para la decodificación de éstos. Los patrones de función son: patrón de localización,

separador, patrón de alineamiento y patrón temporizador.

Patrón localizador:

Patrón de función que existe por triplicado en el símbolo, situado en las esquinas superiores y la inferior izquierda. Sirven para calcular la orientación rotacional del

símbolo.

Patrón temporizador:

Secuencia de alternada de módulos blancos y negros que ayuda a calcular las coordenadas de los módulos del símbolo.

Región de codificación:

Región del símbolo no ocupada por patrones de función y sí por codewords de datos y

de corrección de errores, y también por la información de formato y versión.

Símbolo:

Es toda la imagen QR Code, formada por módulos, que conforman los datos en la región de codificación, y los patrones de función.

Separador:

Patrón de función formado por módulos blancos, cuyo ancho es de un módulo y que separa los patrones localizadores del resto del símbolo.

Terminador:

Secuencia de bits a 0 cuyo número varía según el símbolo y que sirve para señalar el fin

(16)

Versión:

Tamaño del símbolo que puede ir desde la versión 1 con 21x21 módulos hasta la 40

con 177x177 módulos. Dependiendo de la versión, el símbolo puede tener o no algunos

de los elementos descritos y en diferente número; especialmente patrones de alineamiento y la información de versión.

Zona de silencio:

Zona que rodea al símbolo que debe estar en blanco (negro en caso de reflectancia

inversa) para delimitar correctamente sus bordes, debe tener una anchura mínima de 4

módulos.

2.2 Características principales

Los símbolos QR Code tienen 40 versiones y 4 grados de corrección de error (L, M,

Q, H). Un símbolo 40-H sería un símbolo de versión 40 y corrección de errores H. Cada

versión tiene un tamaño, siendo la 1 de 21x21 módulos y la 40 de 177x177 módulos,

creciendo en 4 módulos el tamaño de cada versión (la versión 2 sería de 25x25

módulos).

Hay 4 modos de codificar los caracteres de datos:

1) Datos numéricos (0-9)

2) Datos alfanuméricos (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 símbolo 40-L el número máximo de datos que puede contener es:

- Datos numéricos: 7089 caracteres

(17)

El sistema corrección de errores se basa en Reed Solomon y tiene 4 niveles:

1) L (low) bajo, puede corregir hasta el 7% de los codewords del símbolo.

2) M (médium) medio, puede corregir hasta el 15% de los codewords del símbolo.

3) Q (quality) calidad, puede corregir hasta el 25% de los codewords del símbolo.

4) H (high) alto, puede corregir hasta el 30% de los codewords del símbolo.

Los módulos del símbolo 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 revés. QR Code puede soportar el que la imagen con el símbolo esté rotada

o transpuesta lateralmente (mirror image), tiene independencia de orientación.

Ejemplos de QR Codes: a) orientación y reflectancia normal b) orientación normal y reflectancia invertida c) orientación transpuesta y reflectancia normal d) orientación transpuesta y reflectancia invertida

2.3 Estructura del símbolo

Los QR Code 2005 están formados por módulos colocados en una estructura

cuadrada. Ésta estructura contiene la región de codificación y los patrones de función,

(18)

Estructura de un símbolo QR Code versión 7

Hay 40 versiones cada una con un número de módulos, la versión 1 tiene 21x21

módulos y la 40 177x177; el número de módulos se incrementa de 4 en 4 de una versión

a otra. Las versiones también se diferencian en el número 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 información de versión, la versión 1 no tiene ningún patrón

de alineamiento. Todas tienen tres patrones localizadores, dos patrones temporizadores,

(19)
(20)

El patrón localizador se sitúa en las esquinas superior izquierda, superior derecha e

inferior izquierda del símbolo QR Code. Está formado por un cuadrado relleno de 3x3

módulos negros, rodeado de un cuadrado de 5x5 módulos blancos que a su vez está

rodeado por otro cuadrado de 7x7 módulos negros. Será muy difícil encontrar un patrón

de módulos similar a este en otras partes del símbolo. Tener éxito en encontrar los 3

patrones localizadores de un símbolo supone poder calcular la orientación en el campo

de visión de éste.

Patrón localizador

Los separadores están formados por módulos blancos y rodean los bordes de los

patrones localizadores que dan a la parte interior del símbolo.

Los patrones temporizador son dos, uno vertical y otro horizontal. Están

formados por una línea o columna de módulos blancos y negros alternados,

comenzando y terminando en un módulo negro. Posibilitan que la versión del símbolo y

las coordenadas de los módulos puedan ser determinadas. El temporizador horizontal

cruza la fila número 6 entre los separadores superiores y el vertical igual pero cruzando

la columna 6.

Los patrones de alineamiento están formados por un módulo negro, rodeado de

un cuadrado de 3x3 módulos blancos que a su vez está rodeado por otro cuadrado de

(21)

La región de codificación contiene los codewords que representan los datos,

también contiene codewords de corrección de errores, la información de formato y la

información de versión en la mayoría de casos.

La zona de silencio debe tener un grosor de 4 módulos rodeando los cuatro bordes del

(22)

Capacidad de las diferentes versiones de QR Code

Versión 3úmero

de módulos por lado Módulos de patrones de función Módulos de información de formato y versión Módulos de datos Codewords de datos Bits restantes

1 21 202 31 208 26 0

2 25 235 31 359 44 7

3 29 243 31 567 70 7

4 33 251 31 807 100 7

5 37 259 31 1079 134 7

6 41 267 31 1383 172 7

7 45 390 67 1568 196 0

8 49 398 67 1936 242 0

9 53 406 67 2336 292 0

10 57 414 67 2768 346 0

11 61 422 67 3232 404 0

12 65 430 67 3728 466 0

13 69 438 67 4256 532 0

14 73 611 67 4651 581 3

15 77 619 67 5243 655 3

16 81 627 67 5867 733 3

17 85 635 67 6523 815 3

18 89 643 67 7211 901 3

19 93 651 67 7931 991 3

20 97 659 67 8683 1085 3

21 101 882 67 9252 1156 4

22 105 890 67 10068 1258 4

23 109 898 67 10916 1364 4

24 113 906 67 11796 1474 4

25 117 914 67 12708 1588 4

26 121 922 67 13652 1706 4

27 125 930 67 14628 1828 4

28 129 1203 67 15371 1921 3

29 133 1211 67 16411 2051 3

30 137 1219 67 17483 2185 3

31 141 1227 67 18587 2323 3

32 145 1235 67 19723 2465 3

33 149 1243 67 20891 2611 3

34 153 1251 67 22091 2761 3

35 157 1574 67 23008 2876 0

36 161 1582 67 24272 3034 0

37 165 1590 67 25568 3196 0

38 169 1598 67 26896 3362 0

39 173 1606 67 28256 3532 0

(23)

2.4 Codificación de un QR Code

El procedimiento de codificación se divide en 7 pasos:

1. Análisis 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 máximo espacio. El

estándar soporta varios modos de codificación, pudiendo usarse a la vez

diferentes modos para cada subconjunto de caracteres. Si no se especificó que

versión usar, se debería usar la menor necesaria.

2. Codificación 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

están codificados. También se inserta un terminador y se dividen los datos en

codewords de 8bit.

3. Codificación de corrección de errores

Se ejecuta el algoritmo de corrección de error, para generar los codewords de

corrección de errores. Éstos se añaden al final de los codewords de datos.

4. Estructurar mensaje

Entrelazar los codewords de datos y de error, y añadir bits restantes si es

necesario.

5. Colocación de módulos

Se colocan lo módulos de los codewords en la matriz QR Code junto a los

patrones de función para formar el símbolo QR Code.

(24)

Aplicar los patrones de enmascarado a la región de codificación. Evaluar los

resultados y seleccionar el patrón que optimice el equilibrio de módulos blancos

y negros y minimice la aparición de patrones indeseables.

7. Información de versión y formato

Generar la información de formato y la de versión si es necesario, y colocarla en

el símbolo para completarlo.

2.4.1 Análisis 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 están

y encontrar el modo óptimo en el cual codificarlos. Es posible cambiar de modo para

ahorrar espacio. Es más eficiente codificar los datos en el modo que requiere menos bits

por carácter 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 pequeño de caracteres no merecerá la pena

codificarlo a parte en un modo diferente. Además como las capacidades de los símbolos

QR Code, aumentan de manera discreta en cada versión, no siempre es necesaria

alcanzar la máxima eficiencia.

Modo numérico:

Codifica caracteres numéricos del conjunto [0,9]. Normalmente, 3 caracteres numéricos

se representan con 10 bits en este modo.

Modo alfanumérico:

Codifica un conjunto de 45 caracteres. Los 10 dígitos del modo numérico, los 26

caracteres del alfabeto internacional y 9 símbolos más (ESPACIO, $, %, *, +, -, . , /, :).

(25)

Modo byte:

Los datos se codifican con 8 bits por carácter en código ASCII, aunque podría definirse

un conjunto alternativo.

Modo Kanji:

Codifica los caracteres Kanji del alfabeto japonés de acuerdo con el sistema Shift Jis

basado en JIS X 0208. Cada carácter de 2 bytes es compactado en un codeword de 13

bits.

Modo interpretación de canal extendido (ICE):

Permite definir interpretaciones diferentes del conjunto de caracteres por defecto.

Provee un método consistente para especificar interpretaciones particulares.

2.4.2 Codificación de los datos

Los datos se convierten en un flujo de bits consistente en uno o más

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 más ICEs diferentes

del por defecto, el flujo de bits comenzaría 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 más 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 más

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 tamaño y lugar de inicio

están delimitados inequívocamente por el indicador de modo y el contador de

(26)

El indicador de modo tendrá los siguientes valores:

- Numérico = 0001

- Alfanumérico = 0010

- Byte = 0100

- Kanji = 1000

- ICE = 0111

- Fin de mensaje = 0000

Bits del contador de caracteres Versión Modo

numérico Alfanumérico Modo Modo byte Modo Kanji

1 - 9 10 9 8 8

10 - 26 12 11 16 10

27 - 40 14 13 16 12

Al final del último subconjunto de modo se añade un terminador fin de mensaje

consistente en 4 bits a cero. Puede ser omitido o reducido si la capacidad restante del

símbolo es menor.

En el modo numérico, los datos de entrada se dividen en grupos de tres dígitos,

cada grupo se convierte en su equivalente binario de 10 bits. Si el número de dígitos no

es múltiplo 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 alfanumérico, a cada carácter se le asigna un valor entre 0 y 44 acorde a la tabla siguiente:

(27)

Los caracteres se dividen en grupos de dos caracteres codificados en 11 bits.

Valor del primer carácter se multiplica por 45 y el valor del segundo se le suma al este

producto. La suma es entonces convertida en un número de 11 bits. Si el número de

caracteres de entrada no es múltiplo de dos, el último carácter se codifica en un número

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 carácter 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 codificación para los datos, y

así ahorrar espacio. Cada segmento de datos se codificaría como se indicó antes y luego

se concatenarían entre sí empezando cada segmento con su prefijo de indicador de

modo más indicador contador de caracteres.

Al final de los segmentos codificados se añade un terminador con una secuencia

de cuatro ceros. El terminador se puede omitir si los datos completan la capacidad del

símbolo o reducido a menos ceros si no caben los cuatro.

2.4.2.1 Conversión de bits de datos a codewords

(28)

Capacidad de un QR Code según su versión

Versión 3ivel de corrección de errores Codewords de datos Bits de

datos Capacidad de datos

3umérico Alfanumérico Byte Kanji

1 L

M Q H 19 16 13 9 152 128 104 72 41 34 27 17 25 20 16 10 17 14 11 7 10 8 7 4

2 L

M Q H 34 28 22 16 272 224 176 128 77 63 48 34 47 38 29 20 32 26 20 14 20 16 12 8

3 L

M Q H 55 44 34 26 440 352 272 208 127 101 77 58 77 61 47 35 53 42 32 24 32 26 20 15

4 L

M Q H 80 64 48 36 640 512 384 288 187 149 111 82 114 90 67 50 78 62 46 34 48 38 28 21

5 L

M Q H 108 86 62 46 864 688 496 368 255 202 144 106 154 122 87 64 106 84 60 44 65 52 37 27

6 L

M Q H 136 108 76 60 1 088 864 608 480 322 255 178 139 195 154 108 84 134 106 74 58 82 65 45 36

7 L

M Q H 156 124 88 66 1 248 992 704 528 370 293 207 154 224 178 125 93 154 122 86 64 95 75 53 39

8 L

M Q H 194 154 110 86 1 552 1 232 880 688 461 365 259 202 279 221 157 122 192 152 108 84 118 93 66 52

9 L

M Q H 232 182 132 100 1 856 1 456 1 056 800 552 432 312 235 335 262 189 143 230 180 130 98 141 111 80 60

10 L

M Q H 274 216 154 122 2 192 1 728 1 232 976 652 513 364 288 395 311 221 174 271 213 151 119 167 131 93 74

(29)

Versión 3ivel de corrección de errores Codewords de datos Bits de

datos Capacidad de datos

3umérico Alfanumérico Byte Kanji

12 L

M Q H 370 290 206 158 2 960 2 320 1 648 1 264 883 691 489 374 535 419 296 227 367 287 203 155 226 177 125 96

13 L

M Q H 428 334 244 180 3 424 2 672 1 952 1 440 1 022 796 580 427 619 483 352 259 425 331 241 177 262 204 149 109

14 L

M Q H 461 365 261 197 3 688 2 920 2 088 1 576 1 101 871 621 468 667 528 376 283 458 362 258 194 282 223 159 120

15 L

M Q H 523 415 295 223 4 184 3 320 2 360 1 784 1 250 991 703 530 758 600 426 321 520 412 292 220 320 254 180 136

16 L

M Q H 589 453 325 253 4 712 3 624 2 600 2 024 1 408 1 082 775 602 854 656 470 365 586 450 322 250 361 277 198 154

17 L

M Q H 647 507 367 283 5 176 4 056 2 936 2 264 1 548 1 212 876 674 938 734 531 408 644 504 364 280 397 310 224 173

18 L

M Q H 721 563 397 313 5 768 4 504 3 176 2 504 1 725 1 346 948 746 1 046 816 574 452 718 560 394 310 442 345 243 191

19 L

M Q H 795 627 445 341 6 360 5 016 3 560 2 728 1 903 1 500 1 063 813 1 153 909 644 493 792 624 442 338 488 384 272 208

20 L

M Q H 861 669 485 385 6 888 5 352 3 880 3 080 2 061 1 600 1 159 919 1 249 970 702 557 858 666 482 382 528 410 297 235

21 L

M Q H 932 714 512 406 7 456 5 712 4 096 3 248 2 232 1 708 1 224 969 1 352 1 035 742 587 929 711 509 403 572 438 314 248

22 L

(30)

Versión 3ivel de corrección de errores Codewords de datos Bits de

datos Capacidad de datos

3umérico Alfanumérico Byte Kanji

23 L

M Q H 1 094 860 614 464 8 752 6 880 4 912 3 712 2 620 2 059 1 468 1 108 1 588 1 248 890 672 1 091 857 611 461 672 528 376 284

24 L

M Q H 1 174 914 664 514 9 392 7 312 5 312 4 112 2 812 2 188 1 588 1 228 1 704 1 326 963 744 1 171 911 661 511 721 561 407 315

25 L

M Q H 1 276 1 000 718 538 10 208 8 000 5 744 4 304 3 057 2 395 1 718 1 286 1 853 1 451 1 041 779 1 273 997 715 535 784 614 440 330

26 L

M Q H 1 370 1 062 754 596 10 960 8 496 6 032 4 768 3 283 2 544 1 804 1 425 1 990 1 542 1 094 864 1 367 1 059 751 593 842 652 462 365

27 L

M Q H 1 468 1 128 808 628 11 744 9 024 6 464 5 024 3 517 2 701 1 933 1 501 2 132 1 637 1 172 910 1 465 1 125 805 625 902 692 496 385

28 L

M Q H 1 531 1 193 871 661 12 248 9 544 6 968 5 288 3 669 2 857 2 085 1 581 2 223 1 732 1 263 958 1 528 1 190 868 658 940 732 534 405

29 L

M Q H 1 631 1 267 911 701 13 048 10 136 7 288 5 608 3 909 3 035 2 181 1 677 2 369 1 839 1 322 1 016 1 628 1 264 908 698 1 002 778 559 430

30 L

M Q H 1 735 1 373 985 745 13 880 10 984 7 880 5 960 4 158 3 289 2 358 1 782 2 520 1 994 1 429 1 080 1 732 1 370 982 742 1 066 843 604 457

31 L

M Q H 1 843 1 455 1 033 793 14 744 11 640 8 264 6 344 4 417 3 486 2 473 1 897 2 677 2 113 1 499 1 150 1 840 1 452 1 030 790 1 132 894 634 486

32 L

M Q H 1 955 1 541 1 115 845 15 640 12 328 8 920 6 760 4 686 3 693 2 670 2 022 2 840 2 238 1 618 1 226 1 952 1 538 1 112 842 1 201 947 684 518

33 L

(31)

Versión 3ivel de corrección de errores Codewords de datos Bits de

datos Capacidad de datos

3umérico Alfanumérico Byte Kanji

34 L

M Q H 2 191 1 725 1 231 961 17 528 13 800 9 848 7 688 5 253 4 134 2 949 2 301 3 183 2 506 1 787 1 394 2 188 1 722 1 228 958 1 347 1 060 756 590

35 L

M Q H 2 306 1 812 1 286 986 18 448 14 496 10 288 7 888 5 529 4 343 3 081 2 361 3 351 2 632 1 867 1 431 2 303 1 809 1 283 983 1 417 1 113 790 605

36 L

M Q H 2 434 1 914 1 354 1 054 19 472 15 312 10 832 8 432 5 836 4 588 3 244 2 524 3 537 2 780 1 966 1 530 2 431 1 911 1 351 1 051 1 496 1 176 832 647

37 L

M Q H 2 566 1 992 1 426 1 096 20 528 15 936 11 408 8 768 6 153 4 775 3 417 2 625 3 729 2 894 2 071 1 591 2 563 1 989 1 423 1 093 1 577 1 224 876 673

38 L

M Q H 2 702 2 102 1 502 1 142 21 616 16 816 12 016 9 136 6 479 5 039 3 599 2 735 3 927 3 054 2 181 1 658 2 699 2 099 1 499 1 139 1 661 1 292 923 701

39 L

M Q H 2 812 2 216 1 582 1 222 22 496 17 728 12 656 9 776 6 743 5 313 3 791 2 927 4 087 3 220 2 298 1 774 2 809 2 213 1 579 1 219 1 729 1 362 972 750

40 L

M Q H 2 956 2 334 1 666 1 276 23 648 18 672 13 328 10 208 7 089 5 596 3 993 3 057 4 296 3 391 2 420 1 852 2 953 2 331 1 663 1 273 1 817 1 435 1 024 784

2.4.3 Corrección de errores

QR Code utiliza codificación de control de errores (EC) de Reed-Solomon para

detectar errores. Para ello se generan una serie de codewords de corrección de errores

(ECC), que se añaden a los de datos. Existen cuatro niveles de EC elegibles por el

usuario que quiere crear el símbolo. Los niveles son:

(32)

Este sistema puede corregir dos tipos de codewords erróneos, los que provocan

que un carácter no se pueda decodificar (borrón) y los que provocan que no se

decodifique en otro carácter erróneo (error). Por ejemplo un módulo que cambia de

negro a blanco provoca un error. El número de borrones y errores corregibles por cada

ECC es dado por la siguiente fórmula:

x + 2y <= a – b

Donde:

x = número de borrones

y = número de errores

a = número de ecc para borrones

b = número de ecc para errores

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

1 26

L M Q H 7 10 13 17 3 2 1 1 1 1 1 1 (26,19,2) (26,16,4) (26,13,6) (26,9,8)

2 44

L M Q H 10 16 22 28 2 0 0 0 1 1 1 1 (44,34,4) (44,28,8) (44,22,11) (44,16,14)

3 70

L M Q H 15 26 36 44 1 0 0 0 1 1 2 2 (70,55,7) (70,44,13) (35,17,9) (35,13,11)

4 100

L M Q H 20 36 52 64 0 1 2 2 4 (100,80,10) (50,32,9) (50,24,13) (25,9,8)

5 134

(33)

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

6 172

L M Q H 36 64 96 112 0 2 4 4 4 (86,68,9) (43,27,8) (43,19,12) (43,15,14)

7 196

L M Q H 40 72 108 130 0 2 4 2 4 4 1 (98,78,10) (49,31,9) (32,14,9) (33,15,9) (39,13,13) (40,14,13)

8 242

L M Q H 48 88 132 156 0 2 2 2 4 2 4 2 (121,97,12) (60,38,11) (61,39,11) (40,18,11) (41,19,11) (40,14,13) (41,15,13)

9 292

L M Q H 60 110 160 192 0 2 3 2 4 4 4 4 (146,116,15) (58,36,11) (59,37,11) (36,16,10) (37,17,10) (36,12,12) (37,13,12)

10 346

L M Q H 72 130 192 224 0 2 2 4 1 6 2 6 2 (86,68,9) (87,69,9) (69,43,13) (70,44,13) (43,19,12) (44,20,12) (43,15,14) (44,16,14)

11 404

L M Q H 80 150 224 264 0 4 1 4 4 4 3 8 (101,81,10) (80,50,15) (81,51,15) (50,22,14) (51,23,14) (36,12,12) (37,13,12

12 466

(34)

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

13 532

L M Q H 104 198 288 352 0 4 8 1 8 4 12 4 (133,107,13) (59,37,11) (60,38,11) (44,20,12) (45,21,12) (33,11,11) (34,12,11)

14 581

L M Q H 120 216 320 384 0 3 1 4 5 11 5 11 5 (145,115,15) (146,116,15) (64,40,12) (65,41,12) (36,16,10) (37,17,10) (36,12,12) (37,13,12)

15 655

L M Q H 132 240 360 432 0 5 1 5 5 5 7 11 7 (109,87,11) (110,88,11) (65,41,12) (66,42,12) (54,24,15) (55,25,15) (36,12,12) (37,13,12)

16 733

L M Q H 144 280 408 480 0 5 1 7 3 15 2 3 13 (122,98,12) (123,99,12) (73,45,14) (74,46,14) (43,19,12) (44,20,12) (45,15,15) (46,16,15)

17 815

L M Q H 168 308 448 532 0 1 5 10 1 1 15 2 17 (135,107,14) (136,108,14) (74,46,14) (75,47,14) (50,22,14) (51,23,14) (42,14,14) (43,15,14)

18 901

L

M

Q

180

338

504 0

(35)

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

19 991

L M Q H 196 364 546 650 0 3 4 3 11 17 4 9 16 (141,113,14) (142,114,14) (70,44,13) (71,45,13) (47,21,13) (48,22,13) (39,13,13) (40,14,13)

20 1 085

L M Q H 224 416 600 700 0 3 5 3 13 15 5 15 10 (135,107,14) (136,108,14) (67,41,13) (68,42,13) (54,24,15) (55,25,15) (43,15,14) (44,16,14)

21 1 156

L M Q H 224 442 644 750 0 4 4 17 17 6 19 6 (144,116,14) (145,117,14) (68,42,13) (50,22,14) (51,23,14) (46,16,15) (47,17,15)

22 1 258

L M Q H 252 476 690 816 0 2 7 17 7 16 34 (139,111,14) (140,112,14) (74,46,14) (54,24,15) (55,25,15) (37,13,12)

23 1 364

L M Q H 270 504 750 900 0 4 5 4 14 11 14 16 14 (151,121,15) (152,122,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

24 1 474

(36)

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

25 1 588

L M Q H 312 588 870 1050 0 8 4 8 13 7 22 22 13 (132,106,13) (133,107,13) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

26 1 706

L M Q H 336 644 952 1110 0 10 2 19 4 28 6 33 4 (142,114,14) (143,115,14) (74,46,14) (75,47,14) (50,22,14) (51,23,14) (46,16,15) (47,17,15)

27 1 828

L M Q H 360 700 1 020 1 200 0 8 4 22 3 8 26 12 28 (152,122,15) (153,123,15) (73,45,14) (74,46,14) (53,23,15) (54,24,15) (45,15,15) (46,16,15)

28 1 921

L M Q H 390 728 1 050 1 260 0 3 10 3 23 4 31 11 31 (147,117,15) (148,118,15) (73,45,14) (74,46,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

29 2 051

L M Q H 420 784 1 140 1 350 0 7 7 21 7 1 37 19 26 (146,116,15) (147,117,15) (73,45,14) (74,46,14) (53,23,15) (54,24,15) (45,15,15) (46,16,15)

30 2 185

L

M

Q

450

812

1 200 0

(37)

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

31 2 323

L M Q H 480 868 1 290 1 530 13 3 2 29 42 1 23 28 (145,115,15) (146,116,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

32 2 465

L M Q H 510 924 1 350 1 620 0 17 10 23 10 35 19 35 (145,115,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

33 2 611

L M Q H 540 980 1 440 1 710 0 17 1 14 21 29 19 11 46 (145,115,15) (146,116,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

34 2 761

L M Q H 570 1 036 1 530 1 800 0 13 6 14 23 44 7 59 1 (145,115,15) (146,116,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (46,16,15) (47,17,15)

35 2 876

L M Q H 570 1 064 1 590 1 890 0 12 7 12 26 39 14 22 41 (151,121,15) (152,122,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

36 3 034

(38)

Versión Codewords totales Nivel de ECC Número de ECCs Valor de b Number of error correction blocks Error correction code per block (f, g, h)

37 3 196

L M Q H 630 1 204 1 770 2 100 0 17 4 29 14 49 10 24 46 (152,122,15) (153,123,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

38 3 362

L M Q H 660 1 260 1 860 2 220 0 4 18 13 32 48 14 42 32 (152,122,15) (153,123,15) (74,46,14) (75,47,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

39 3 532

L M Q H 720 1 316 1 950 2 310 0 20 4 40 7 43 22 10 67 (147,117,15) (148,118,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

40 3 706

L M Q H 750 1 372 2 040 2 430 0 19 6 18 31 34 34 20 61 (148,118,15) (149,119,15) (75,47,14) (76,48,14) (54,24,15) (55,25,15) (45,15,15) (46,16,15)

f = total de codewords, g = número 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 según versión. Los ECC se calculan

para cada bloque y se añaden a los codewords de datos. Para generar los ECC, hay que

ver cada codeword de datos como un coeficiente que es término de un polinomio,

(39)

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. Después creamos la

secuencia final de codewords que tendría 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 Colocación de Codewords en la matriz

La mayoría de codewords se representaran en el símbolo como un bloque de 2x4

módulos o 4x2 módulos. Otros tendrán formas irregulares por tenerse colocar

adyacentes a algún patrón de función, como se muestra en la siguiente figura:

Tenemos que crear una matriz en blanco con el tamaño correspondiente a la

versión del símbolo a crear. A este tamaño hay que añadir la región de silencio

rodeando el símbolo que debe ser de 4 módulos de tamaño. Añadimos los tres patrones

(40)

versión y de formato, los dejaremos en blanco de momento; recordar que la información

de versión no es necesaria en todas las versiones de símbolo. Los patrones de

alineamiento también los podemos colocar, ver el estándar JIS para ver cómo.

La región de codificación se rellena con la secuencia de codewords (los

codewords normalmente tendrán la forma de 2x4 módulos), empezando por la parte

inferior derecha del símbolo, subiendo primero hacia arriba hasta llegar al patrón

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 sería la colocación de codewords en un símbolo versión 2.

El orden de los bits de cada codeword varía cuando el codeword se coloca hacia

arriba o hacia abajo:

Si la capacidad total del símbolo no se llena con los codewords, se rellena con

(41)

2.4.6 Enmascarar los datos

Para mejorar la decodificación de los símbolos es preferible que el número de

módulos blancos y negros del símbolo este equilibrado. El patrón 1011101 debe ser

evitado ya que se puede confundir con el patrón localizador. Para conseguir esto

después de crear la matriz del símbolo, debemos aplicar una máscara de datos a esta. La

máscara no se aplica a los patrones de función ni a la información de formato y versión.

Existen varios patrones de máscara que podemos aplicar, para ver cuál es el mejor

para nuestro símbolo, lo que hay que hacer es aplicarlos todos y luego evaluar el que da

mejor resultado. La máscara se aplica a los módulos mediante una operación XOR.

Los patrones posibles y su código para la información de formato son los

siguientes:

Código de patrón de máscara de Datos Fórmula

000 (i + j) mod 2 = 0

001 i mod 2 = 0

010 j mod 3 = 0

011 (i + j) mod 3 = 0

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

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

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

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

(42)

Los módulos grises pertenecen a patrones de función, o son de información de

versión o formato, y no se les debe aplicar la máscara.

Después de aplicar las máscaras, para evaluar el mejor patrón, 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 símbolo, no solo la zona a la que se

aplicaron las máscaras.

(43)

2) Bloque de módulos 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 patrón 1011101 seguido o precedido del 0000:

Su valor es igual a N3 si se produce una o más veces

4) Proporción de módulos negros en todo el símbolo:

Si es alta el valor será igual a N4 (ver JIS para más información)

2.4.7 Información de formato

La información 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 corrección de error usado:

L = 01, M = 00, Q = 11, H = 10

Los otros tres bits indican el patrón de la máscara de datos usada.

Una vez calculados los 15 bits se les debe aplicar mediante XOR la máscara

101010000010010, esto es para evitar que pudiera generarse una información de

formato compuesta solo por ceros.

La información de formato se coloca en la matriz del símbolo por duplicado en

las zonas establecidas. La siguiente figura muestra como sería en un símbolo de versión

(44)

Es esencial que la decodificación de la información de formato sea correcta, para

el éxito en la decodificación del símbolo.

2.4.8 Información de versión

Esta información solo se aplica a los símbolos de versión 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 versión del símbolo con el bit más significativo primero. 000111 representaría la

versión 7, 101000 representaría la versión 40. No es necesario enmascarar esta

información como pasaba en el apartado anterior puesto que las versiones que

provocarían una cadena de ceros no tienen información de versión.

Es esencial que la decodificación de la información de versión sea correcta, para

el éxito en la decodificación del símbolo. La información de versión se coloca en la

matriz del símbolo por duplicado en las zonas establecidas. Los posicionamientos

(45)

Abajo a la izquierda Arriba derecha

2.5 Decodificación de un QR Code

El proceso de decodificación es el inverso al de codificación. A partir de un

símbolo obtenemos unos datos en forma de caracteres. Este proceso se puede dividir en

8 pasos.

1) Obtener una imagen del símbolo y a partir de ella crear una matriz de unos y

ceros, reconociendo los módulos negros y blancos. Para eso hay que binarizar

correctamente la imagen.

2) Leer la información de formato, detectar y corregir posibles errores en esta. Si

no hay éxito probar a decodificar el símbolo usando mirror imaging. Obtener el

nivel de corrección de errores y el tipo de patrón de mascara de datos usado.

3) Leer la información de versión si está, para determinar la versión del símbolo.

4) Pasar la máscara de datos a la matriz de unos y ceros, en la región de

codificación, mediante una operación XOR, esto deshará la máscara.

5) Obtener los codewords de datos y de error de la región de codificación teniendo

en cuenta su orden de colocación.

6) Detectar los posibles errores en los codewords de datos, utilizando los

(46)

8) Decodificar los caracteres de acuerdo a su modo de codificación 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 serán negros o blancos, correctamente.

Para localizar los patrones de localización debemos buscar el patrón 1011101.

Pero ahora cada módulo está formado por pixeles, tenemos que buscar una proporción

de píxeles alternados en negro y blanco de 1 : 1 : 3 : 1 : 1, dejando un margen de más

menos 0,5 por posible deformación de la imagen. Una vez encontrado un candidato a

patrón localizador tenemos que analizarlo.

Una vez localizados los tres patrones localizadores, hay que determinar la

orientación del símbolo. Para ello se analizan las posiciones de los centros de cada

patrón y se detecta cuál de ellos es el patrón superior izquierda. El hecho de haber

detectado los patrones, nos da una idea de cuál es el ancho de módulo en pixeles de la

imagen.

Cuando el símbolo es de versión inferior a la siete, la forma de calcular la

versión, ante la ausencia de información sobre esta, es calcular el ancho del símbolo

esto se hace calculando la distancia entre los dos patrones localizadores superiores.

Sabiendo la versión del símbolo, ya sabemos cuántos patrones de alineamiento

posee el símbolo y su posición, en estas posiciones debemos buscar los patrones 11111,

10101 y el 10001.

Para definir bien la región de codificación es necesario encontrar los patrones

temporizadores. Estos patrones nacen y terminan en un borde de los patrones

(47)

encontramos en la línea un patrón altérnate de unos y ceros esa línea será candidata a

(48)
(49)

3. Análisis de antecedentes y aportación

realizada

Existen varias aplicaciones de pago, que realizan la codificación y decodificación de

QR Codes. Estas aplicaciones suelen ser para sistemas de sobremesa. También hay

muchas para móviles o PDAs que dispongan de una cámara fotográfica, aunque estas

aplicaciones decodifican símbolos, no los suelen codificar. Por ejemplo existe el

I-Nigma Reader, véase www.i-nigma.com.

También hay páginas web que ofrecen servicios para codificar símbolos como por

ejemplo http://qrcode.es y también http://zxing.org/w/decode.jspx que nos permite

decodificar QR Codes online. El blog qrcode.es utiliza la librería QR Code Perl CGI &

PHP scripts ver. 0.50 para generar los QR code. Esta librería es japonesa y la

documentación está en japonés.

En la web http://www.psytec.co.jp se puede descargar gratuitamente el programa

PSQRedit para Windows totalmente en japonés que codifica y decodifica QR code.

También se puede conseguir una versión de la aplicación open source programada en

C++ pero solo genera QR code no los interpreta y además la documentación y los

escasos comentarios del código están en japonés.

En la página de Sourceforge http://qrcode.sourceforge.jp, existe un proyecto open

source en Java que decodifica símbolos QR Code pero no los codifica. Es compatible

con J2SE, J2ME MIDP2.0/CLDC1.0. La documentación y comentarios de código están

en inglés.

En esta web http://www.codeproject.com/KB/cs/qrcode.aspx existe otro proyecto

open source en inglés. Está programado en .NET lo que le hace altamente portable

como pasa con Java. Soporta la codificación y decodificación de símbolos en una sola

(50)

El objetivo de este proyecto es realizar una aplicación que codifique y decodifique

símbolos QR code en lenguaje Java. La interfaz ha sido programada, para que funcione

en sistemas operativos Windows para sistemas de sobremesa y ordenadores portátiles,

centrándonos en los más usados actualmente que son Windows XP y Windows Vista.

Las aportaciones de la aplicación realizada son:

1) La aplicación será libre y open source

2) Realizará la codificación y la decodificación, en un solo programa con una

interfaz común sencilla, con todas las características principales del estándar y

compatible con cualquier otro programa que cumpla el estándar ISO/IEC 18004

2006 ó el JIS-X0510.

3) El código fuente está ampliamente comentado en español, además todas las

clases, interfaces y atributos contienen comentarios javadoc que son de gran

ayuda durante la programación. Esto hace que el código sea altamente reusable y

fácil de estudiar.

4) La aplicación al estar programada en Java puede ejecutarse en cualquier

plataforma de escritorio que tenga instalada la máquina virtual de Java: Linux,

MAC, Solaris, Windows 7, Windows Vista, Windows XP, etc.

5) Al estar programado en lenguaje Java los módulos de codificación y

decodificación se pueden aprovechar fácilmente para realizar nuevas interfaces

para otras plataformas, como móviles o PDAs. El resultado es fácilmente

portable. La nueva interfaz sólo tiene que utilizar una clase de la librería para

codificar y a otra clase para decodificar. Los métodos Decode y Encode de las

clases QRCodeDecoder y QRCodeEncoder, se encargan de realizar todos los

cálculos necesarios llamando internamente al resto de clases y métodos de la

(51)
(52)

4.

Análisis de requisitos

Como vimos en el primer apartado de este documento los objetivos de este proyecto

son tres principalmente:

1) Comprender y dar una explicación de la especificación del estándar QR

Code 2006, su algoritmo de codificación y decodificación, así como las

partes que componen los símbolos, sus diferentes versiones y características.

2) Desarrollar una librería en Java que sirva, tanto para generar símbolos QR

Code compatibles con el estándar QR Code 2006, como para interpretar un

símbolo QR Code 2006 compatible y ver su mensaje. La librería también

debe implementar algunos algoritmos de pretratamiento de imágenes para

mejorar la probabilidad de éxito en la interpretación. Además la complejidad

temporal de la generación y sobre todo de la interpretación debe ser óptima

ya que debe poder ejecutarse en dispositivos móviles y PDAs.

3) Desarrollar una aplicación de escritorio en lenguaje Java, que utilizando la

librería anterior sirva para generar e interpretar símbolos QR Code, y que

permita especificar y usar las características principales del estándar; como

son las diferentes versiones de símbolos, formatos de datos, niveles de

corrección de errores, etc.

Cada uno de estos objetivos se pueden dividir en requisitos.

Para el primer objetivo necesitamos obtener información abundante y contrastada

sobre el funcionamiento del estándar QR Code 2006. Una vez conseguida esta

información se requiere su estudio en profundidad. Cumplir estos dos requisitos es vital

(53)

Para el segundo objetivo es necesario haber cumplido el primer objetivo. Después de

comprender como funciona el estándar QR Code 2006 necesitamos analizar cómo

desarrollar una librería de funciones capaz de emularlo y que pueda ser utilizada por

cualquier programa. El hecho de usar Java como lenguaje de programación facilitará el

cumplir este requisito. Teniendo en cuenta el lenguaje de alto nivel que utilizamos, se

tiene la posibilidad de la fácil reutilización de código para futuras mejoras, lo cual

ayuda a un posterior desarrollo o estudio de la aplicación a diseñar.

También es requisito que la ejecución de los procesos de codificación y

decodificación sea rápida. 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 más

veces se ejecutan. Hay que tener en cuenta que para el caso de los QR Codes, el tamaño

de datos tiene un límite. La versión de símbolo QR Code más grande es la 40, que está

compuesta por 177x177 módulos y puede almacenar codificados hasta 7089 caracteres

en modo numérico (2953 en modo byte). Luego N tiene límite. Para la decodificación el

tamaño de los datos dependerá del número 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

librería para ser llamada y utilizada por el programa generador e intérprete de QR

Codes. Es requisito que esta aplicación sea gráfica, de tipo ventana para aumentar su

usabilidad. Es requisito el que sea capaz de mostrar y generar imágenes y fotos, ya que

los códigos de barra QR Code son imágenes normalmente obtenidas con cámaras. Es

requisito que el programa contenga los controles necesarios para poder especificar las

diferentes opciones que nos ofrece el estándar para crear e interpretar un símbolo QR

Code 2006. La aplicación debe poder ser ejecutable en el mayor número posible de

sistemas operativos, empezando por los de la familia Windows por ser los más

utilizados hoy en día.

(54)

Para el requisito de obtener información sobre el estándar QR Code la principal

fuente de información y sobre todo más cercana es internet y sus buscadores. Utilicé

Google para obtener información sobre los QR Code y pronto descubrí que en la página

de la compañía japonesa Denso Wave (http://www.denso-wave.com), existe gran

cantidad de información. Esta compañía es la creadora de los QR Code y tras su

creación decidió liberar su estándar, hacerlo público y “regalarlo al mundo”. También

encontré un blog español http://www.qrcode.es dedicado a los QR Code con

información actualizada y gran cantidad de enlaces a otras páginas relacionadas.

Después descubrí que existen dos documentos oficiales estándar que explican a

fondo cómo funcionan los QR Codes y sus características uno de estos documentos es el

estándar 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 inglés y por desgracia no es

libre; posee copyright y se puede conseguir por el “módico” precio de 190 dólares. El

otro documento es el estándar 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 japonés y además conseguirlo no es fácil ya que las páginas que lo ofrecen

están en japonés. Después de mucho buscar encontré una traducción al inglés del

documento JIS X0510 con la que obtuve la principal información necesaria para

completar el primer objetivo. Se expone un resumen en español 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 librería. Uno de los requisitos es que la librería sea

fácilmente portable y usable, el lenguaje Java facilita la portabilidad de los programas

implementados con él, gracias a su tecnología basada en maquinas virtuales. Otra

(55)

proyecto tiene mayor experiencia en tecnología Java que en tecnología .NET. Otra

razón 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 código en clases y capas para

mejorar la reusabilidad del código; ayudando así a un posible posterior estudio de la

aplicación o mantenimiento.

Una vez tenido claro que iba a usar tecnología Java había que elegir el IDE con el

que desarrollar el software. Para Java los IDEs más conocidos son Net Beans y Eclipse,

existen otros IDEs pero estos dos son los más 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 estructuración de las diferentes

paletas de la ventana y el outlining del código también son parecidos en ambos IDEs,

esto hace que si los desarrolladores están familiarizados con Visual Studio les resulte

más fácil adaptarse a NetBeans que a eclipse. La principal ventaja de NetBeans sobre

eclipse, es que en él resulta mucho más sencillo implementar aplicaciones gráficas de

escritorio con swing. NetBeans trae herramientas para crear formularios y ventanas de

diálogo 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 instalación. Otra ventaja de

Eclipse es, que su uso está más extendido que NetBeans y es más probable que los

desarrolladores tengan más experiencia en esta, como es mi caso. Las últimas versiones

de Eclipse, como por ejemplo Eclipse Galileo, están mejor adaptadas a las nuevas

resoluciones de pantalla, y los entornos gráficos 3D de los sistemas operativos. Esto

aumenta el atractivo visual de Eclipse. También eclipse puede aportar más

funcionalidades para programar y depurar código que NetBeans.

(56)

objetivo. Después para realizar la aplicación gráfica del tercer objetivo utilizaremos

mejor NetBeans por sus mayores facilidades para crear interfaces gráficas de escritorio.

También es importante decidir el sistema operativo, en el cual se va a poder ejecutar

la aplicación de ventana. En nuestro caso al estar programada en Java J2SE, podrá ser

ejecutada en cualquier sistema operativo de escritorio, que disponga de una máquina

virtual de Java. La aplicación puede ejecutarse en: Linux, MAC OS, Solaris, Windows

7, Windows Vista, Windows XP, etc.

Aunque la aplicación 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 más seguros de su correcto funcionamiento para este

sistema operativo. De las opciones posibles, la mejor opción será el sistema operativo

más extendido entre los usuarios porque este será probablemente el sistema operativo en

el que más veces se ejecutará la aplicación.

Según un estudio realizado en Junio de 2007, con los accesos realizados a una

(57)

Windows sigue estando a la cabeza con una diferencia abrumadora en

utilización por los usuarios comunes. Por lo que lo más lógico es desarrollar

esta aplicación en sistemas operativos Windows, ya que probablemente será

(58)

Figure

Actualización...

Referencias

Actualización...