View
0
Download
0
Category
Preview:
Citation preview
GABRIEL YOSHIHARU RODRIGUES USSUY
ADOÇÃO DE QR CODE COMO PROPOSTA PARA REPRESENTAÇÃO
VISUAL E INTERAÇÃO EM GRANDES VOLUMES DE DADOS
Assis/SP 2016
GABRIEL YOSHIHARU RODRIGUES USSUY
ADOÇÃO DE QR CODE COMO PROPOSTA PARA REPRESENTAÇÃO
VISUAL E INTERAÇÃO EM GRANDES VOLUMES DE DADOS
Projeto de pesquisa apresentado ao curso de Ciência da Computação do Instituto Municipal de Ensino Superior de Assis – IMESA e a Fundação Educacional do Município de Assis – FEMA, como requisito parcial à obtenção do Certificado de Conclusão.
Orientando(a): Gabriel Yoshiharu Rodrigues Ussuy Orientador(a): Prof. Msc. Guilherme de Cleva Farto
Assis/SP 2016
FICHA CATALOGRÁFICA
USSUY, Gabriel Yoshiharu Rodrigues Adoção de QR Code como proposta para representação visual e interação em grandes volumes de dados / Gabriel Yoshiharu Rodrigues Ussuy. Fundação Educacional do Município de Assis – FEMA – Assis, 2016. 62p. Orientador: Prof. Msc. Guilherme de Cleva Farto Trabalho de Conclusão de Curso – Instituto Municipal de Ensino Superior de Assis – IMESA.
1. QR Code. 2. Grandes Volumes de Dados. 3. QR Code Colorido
CDD: 001.6 Biblioteca da FEMA
ADOÇÃO DE QR CODE COMO PROPOSTA PARA REPRESENTAÇÃO
VISUAL E INTERAÇÃO EM GRANDES VOLUMES DE DADOS
GABRIEL YOSHIHARU RODRIGUES USSUY
Trabalho de Conclusão de Curso apresentado ao Instituto Municipal de Ensino Superior de Assis, como requisito do Curso de Graduação, avaliado pela seguinte comissão examinadora:
Orientador:
Prof. Msc. Guilherme de Cleva Farto
Examinador:
Prof. Dr. Luiz Carlos Begosso
Assis/SP 2016
DEDICATÓRIA
Dedico este trabalho a toda a minha família, principalmente aos
meus pais e a meu irmão, por todo apoio, carinho e puxões de
orelhas que me foram dados, fazendo com que eu não
desistisse nos momentos mais difíceis.
AGRADECIMENTOS
Agradeço à minha mãe Hodene Lopes Rodrigues Ussuy e meu pai Agnaldo Yoshiharu
Ussuy por sempre estarem ao meu lado me apoiando e orientando.
Ao meu amigo e Professor Msc. Guilherme de Cleva Farto, por me orientar e colaborar
nesta fase acadêmica tão importante.
E por fim agradeço a todos que colaboraram de forma direta ou indireta para a conclusão
deste trabalho.
“A persistência é o caminho do êxito”
Charlie Chaplin
(1889 – 1977)
RESUMO
De acordo com dados apresentados pela IBM (2015), todos os dias são gerados 2.5
quintilhões de bytes de dados. Visando este aumento exponencial da quantidade de dados,
este trabalho propõe a utilização de uma nova abordagem para o aumento da capacidade
de armazenamento de códigos de barras 2D. Por meio da implementação de uma API em
Java para Layer Colored QR Code, possibilitando a criação de QR Codes com maior
capacidade de armazenamento. Com a conclusão da implementação da abordagem
proposta em Layer Colored QR Code, foi possível codificar uma maior quantidade de
informações em um QR Code. Devido a possibilidade de utilizar um N número de cores,
Layer Colored QR Code armazena mais dados que grande parte das abordagens para QR
Code, que utilizam apenas 4 cores. Um N número de cores podem ser utilizadas. Todavia,
para a leitura do Layer Colored QR Code o dispositivo utilizado para captação dos dados,
deve ser capaz de reconhecer todas as cores utilizadas na geração do símbolo.
Palavras-chave: QR Code, QR Code Colorido, Capacidade de armazenamento, Grandes
volumes de dados.
ABSTRACT
According to data presented by IBM (2015), every day is generated 2.5 quintillion bytes of
data. Aiming this exponential increase in the amount of data, this work proposes the use of
a new approach to increase the storage capacity of 2D barcodes. Through the
implementation of a Java API for Colored Layer QR Code, allowing the creation of QR codes
with higher storage capacity. With the completion of the implementation of the proposed
approach in Layer Colored QR Code, it was possible to encode a larger amount of
information in a QR Code. Because of the possibility of using an N number of colors, Layer
Colored QR Code stores more data than many of the approaches to QR Code, using only
four colors. An N number of colors may be used. However, for reading the QR code Colored
Layer device used to capture the data, must be able to recognize all the colors used in the
symbol generation.
Keywords: QR Code, Colored QR Code, Storage Capacity, Large data volumes.
LISTA DE ILUSTRAÇÕES
Figura 1: QR Code ....................................................................................................................................... 19
Figura 2: Módulos QR Code ...................................................................................................................... 20
Figura 3: Versões do QR Code ................................................................................................................. 21
Figura 4: Tamanho de impressão ............................................................................................................. 22
Figura 5: Resistência a sujeira e danos ................................................................................................... 24
Figura 6: QR Code distorcido .................................................................................................................... 25
Figura 7: Distribuição de um QR Code .................................................................................................... 26
Figura 8: Microsoft’s High Capacity Color Barcode ............................................................................. 27
Figura 9: Funcionamento da máquina virtual do Java ........................................................................... 29
Figura 10: Representação de uma imagem digital ................................................................................. 31
Figura 11: Estrutura de uma PlanarImage ............................................................................................... 34
Figura 12: Estrutura geral da API ImageJ. .............................................................................................. 35
Figura 13: Módulos em Colored Qr Code ................................................................................................ 41
Figura 14: Módulos em Layer Colored QR Code ................................................................................... 42
Figura 15: QR Code gerado em Layer Colored Qr Code. ..................................................................... 42
Figura 16: Exemplo de Layer Colored QR Code .................................................................................... 43
Figura 17: QR Code 3 Layers .................................................................................................................... 44
Figura 18: QR Code 5 Layers .................................................................................................................... 44
Figura 19: Mapa de Cores e seu respectivo código ............................................................................... 51
Figura 20: Layer Colored QR Code com 3,5 e 8 camadas ................................................................... 54
Figura 21: Layer Colored QR Codes danificados ................................................................................... 55
Figura 22: Danos do Colored QR Code Replicados aos QR Codes resultantes .............................. 55
LISTA DE TABELAS
Tabela 1: Características de alguns tipos de códigos 2D.................................................. 19
Tabela 2: Tamanho do módulo de impressão ................................................................... 23
Tabela 3: Scanners e tamanho do módulo de leitura ........................................................ 23
Tabela 4: Capacidade de Correção de erros de acordo com o nível ................................ 24
Tabela 5: Formatos de códigos de barras suportados em ZXing ...................................... 36
SUMÁRIO
1. INTRODUÇÃO ........................................................................................ 14
1.1 OBJETIVOS ...................................................................................................... 15
1.2 JUSTIFICATIVAS .............................................................................................. 16
1.3 MOTIVAÇÃO ..................................................................................................... 16
1.4 PERSPECTIVAS DE CONTRIBUIÇÃO ............................................................ 17
1.5 METODOLOGIA DE PESQUISA ...................................................................... 17
1.6 RECURSOS NECESSÁRIOS ........................................................................... 17
1.7 ESTRUTURA DO TRABALHO .......................................................................... 18
2. REPRESENTAÇÃO DE DADOS COM QR CODE .................................. 19
2.1 CÓDIGOS GRÁFICOS ...................................................................................... 19
2.2 VANTAGENS E BENEFÍCIOS .......................................................................... 22
2.2.1 TAMANHO DE IMPRESSÃO .................................................................................... 22
2.2.2 RESISTÊNCIA A SUJEIRA E DANOS ..................................................................... 23
2.2.3 CORREÇÃO DE ERROS ......................................................................................... 24
2.2.4 LEGIBILIDADE ......................................................................................................... 25
2.2.5 ARMAZENAMENTO DISTRIBUÍDO ......................................................................... 26
2.2.6 CÓDIGO ABERTO .................................................................................................... 26
2.3 COLORED QR CODE ....................................................................................... 27
3. PLATAFORMA JAVA ............................................................................. 29
3.1 INTRODUÇÃO .................................................................................................. 29
3.2 ANÁLISE E PROCESSAMENTO DE IMAGENS .............................................. 31
3.3 APIS E BIBLIOTECAS PARA QR CODE .......................................................... 35
3.3.1. ZEBRA CROSSING (ZXING) .................................................................................. 35
3.3.2. QRGen ..................................................................................................................... 38
3.3.3. IMPLEMENTAÇÃO NATIVA .................................................................................... 38
4. PROPOSTA DO TRABALHO ................................................................. 41
4.1 LAYER-COLORED QR-CODE: ABORDAGEM MULTI-COLORIDA PARA QR-
CODE ...................................................................................................................... 41
4.2. PROJETO ARQUITETURAL PARA LAYER-COLORED QR CODE ............... 43
4.3. TECNOLOGIAS E RECURSOS ADOTADOS .................................................. 45
5. DESENVOLVIMENTO DO TRABALHO .................................................. 46
5.1 IMPLEMENTAÇÃO DA ABORDAGEM LAYER COLORED QR-CODE ........... 46
5.1.1 GERAÇÃO DE UM QR CODE EM LAYER COLORED QR-CODE ............... 46
5.1.2 LEITURA DE UM QR CODE EM LAYER COLORED QR-CODE .................. 51
5.2. EXPERIMENTOS E ADOÇÃO REAL DE LAYER COLORED QR CODE ....... 53
6. CONCLUSÃO ......................................................................................... 57
6.1. CONSIDERAÇÕES FINAIS ............................................................................. 57
6.2. TRABALHOS FUTUROS ................................................................................. 58
14
1. INTRODUÇÃO
A utilização do código de barras tornou-se amplamente popular em virtude de sua
velocidade, precisão e características funcionais de leitura. Em consequência de sua
popularização e aceitação mundial, o mercado passou a exigir códigos capazes de
armazenar mais informações, maior variedade de caracteres e menor espaço de
impressão. No entanto, os esforços realizados em aumentar a capacidade de
armazenamento do código de barras resultaram em um aumento da complexidade de
leitura, além do aumento nos custos de impressão (GRILLO et al.,2010).
Devido às limitações do código de barras, uma equipe de desenvolvimento da DENSO
WAVE iniciou a implementação de um novo código bidimensional, anunciando em 1994 o
lançamento do Quick Response Code, associado a sua grande velocidade de leitura,
introduzindo seu conceito de funcionamento (QRCODE, 2015a).
Desde o lançamento do QR Code em 1994, embora originalmente designado para
catalogação de componentes da indústria automobilística, sua utilização tem sido
generalizada, expandindo rapidamente às mais diversas áreas, tais como (DENSO
ADC,2011):
Manufatura: Rastreamento de produtos, controle de processos, gestão de estoques
e equipamentos
Varejo: Identificação de produtos, gerenciamento de vendas e controle de inventário
Saúde: Gerenciamento de registros médicos, identificação de pacientes,
rastreamento de medicações e equipamentos
Biologia: Catalogação e rastreamento de espécies, bem como seus hábitos e
comportamentos
Transporte: Gerenciamento e rastreamento de frotas, emissão de bilhetes e cartões
de embarque
Marketing e Propaganda: Marketing em aparelhos mobile, tickets eletrônicos,
cupons, pagamentos e programas de lealdade
O QR Code possui vários modos de utilização que variam desde processos de manufatura
com rastreamento de produtos e controle de processos à marketing e propaganda, sendo
15
útil às mais diversas áreas, devido a sua capacidade de armazenamento de dados e forma
de iteração, necessitando apenas de um dispositivo móvel com câmera (DENSO
ADC,2011).
Atualmente, um dos grandes desafios na área de computação se refere à manipulação e
ao processamento de grandes quantidades de dados no contexto de Big Data. O conceito
Big Data pode ser definido como um conjunto de bases de dados tão complexo e volumoso
que resulta no aumento da complexidade de algumas operações de consultas aos dados
gerados (VIEIRA et al.,2012).
De acordo com dados da IBM (2015), todos os dias são gerados 2.5 quintilhões de bytes
de dados, sendo que 90% dos dados no mundo, obtidos por meio de sensores climáticos,
redes sociais, fotos digitais, vídeos, registros de transações de compras, sinais de telefone
celular e GPS foram gerados nos últimos dois anos. Essa exorbitante quantidade de dados,
acaba por gerar novos grandes desafios no que se refere à maneira de manipulação,
armazenamento e processamento de dados nas mais variadas áreas da computação
(VIEIRA et al.,2012).
Visando uma futura necessidade de novos instrumentos e abordagens para lidar com esses
dados complexos e volumosos, este trabalho propõe o desenvolvimento de uma API em
Java para a geração e a leitura de QR Codes multicoloridos focando na utilização para
processamento de grandes volumes de dados.
1.1 OBJETIVOS
Este projeto tem por objetivo desenvolver uma API para Layer-Colored QR Code em Java,
bem como, a pesquisa e exploração dos conceitos e recursos de QR Code, além de sua
aplicação prática, vantagens e benefícios.
A partir dos artefatos deste trabalho, é possível gerar e interpretar QR Codes coloridos
utilizando a API Layer Colored desenvolvida, com a finalidade de expandir a capacidade de
armazenamento do QR Code padrão, ou seja, apenas nas cores preto e branco.
16
1.2 JUSTIFICATIVAS
Desenvolvido com a finalidade de suprir as necessidades do código de barras no
armazenamento de uma maior quantidade de informações, o QR Code possui muitas
vantagens e benefícios em relação ao convencional código de barras, tais como,
necessidade de menos espaço, maior capacidade de armazenamento, correção de erros e
armazenamento de mais tipos de dados(DENSO-ADC,2011).
Segundo Laney (2001), vários fatores contribuem para o aumento da quantidade de dados,
como streamings, utilização de redes sociais, sensores e aumento das informações
mantidas em transações de e-commerces.
De acordo com dados da IBM(2015), cerca de 90% dos dados gerados no mundo até hoje,
foram obtidos nos últimos dois anos. Com o aumento da geração de dados estruturados e
não estruturados produzidos a partir de iterações digitais, o volume de dados só tende a
aumentar.
Devido as vantagens do QR Code e à pouca quantidade de tecnologias e bibliotecas em
Java para Colored QR Code, este trabalho apoia e fornece uma API com recursos para a
adoção de QR Code em grandes volumes de dados, por meio da proposta de Layer-Colored
QR Code.
1.3 MOTIVAÇÃO
Devido à pouca pesquisa quanto a utilização de QR Code em grandes volumes de dados
no contexto de Big Data. Este projeto consiste em pesquisar e explorar a utilização de QR
Code para grande quantidade de dados.
Aplicar os conceitos estudados no desenvolvimento de uma API para Layer Colored QR
Code agregará, quanto a utilização de QR Code em grandes volumes de dados, uma maior
confiabilidade e estabilidade, visto que, com a implementação será possível avaliar e
apresentar seus rendimentos em relação a utilização com grandes quantidades de dados.
17
1.4 PERSPECTIVAS DE CONTRIBUIÇÃO
Ao término do desenvolvimento deste trabalho, será disponibilizado uma nova abordagem
baseada em Colored QR Code para pessoas e/ou instituições de ensino com o interesse
nesta área, com o objetivo de promover e compartilhar os conhecimentos e resultados
obtidos.
A API em Java para Colored QR Code, juntamente com as especificações para o uso de
Layer Colored QR Code que serão disponibilizadas, permitirá uma comparação e análise
dos resultados obtidos ao utilizar QR Code em grandes volumes de dados, com o objetivo
de contribuir com futuros projetos na área de Colored QR Code.
1.5 METODOLOGIA DE PESQUISA
A proposta e objetivos apresentados neste trabalho acadêmico serão obtidos por meio de
pesquisas teóricas, de forma a se alcançar os conhecimentos necessários por intermédio
da leitura de livros, artigos científicos/técnicos, monografias, dissertações e teses. Após,
será possível a elaboração e desenvolvimento de uma API para Layer-Colored QR Code
com a finalidade de comprovar a aplicabilidade do modelo proposto.
Inicialmente, serão pesquisadas ferramentas e abordagens existentes para a utilização de
QR Code colorido. Em consequência desta primeira etapa, será concebida uma proposta
de estudo de caso e implementação de ferramentas de apoio em Java. Por fim, serão
realizados testes e experimentos para validação da abordagem proposta.
1.6 RECURSOS NECESSÁRIOS
Para desenvolver a pesquisa serão necessários os recursos de hardware e software citados
a seguir:
Hardware
o Notebook Asus X550L
o Processador Intel Core i5 1.7 Ghz.
o Disco Rígido Toshiba 5400 RPM SATA de 1 TB.
18
o Memória de 1333 Mhz DDR3 8 GB.
Software
o Eclipse IDE – Ambiente de desenvolvimento para a tecnologia Java. Será
utilizada a versão Mars.
o Java Development Kit – Conjunto de ferramentas que possibilita o
desenvolvimento com a tecnologia Java.
o API Zebra Crossing (ZXing) – Biblioteca Open Source para leitura de
códigos de barra.
o QRGen – Ferramenta que permite a geração de QR Code
1.7 ESTRUTURA DO TRABALHO
A estrutura deste trabalho é composta das seguintes partes:
Capítulo 1 – Introdução: Neste capítulo é contextualizada a área de estudo e
apresentará os objetivos, justificativas, motivação, perspectivas de contribuição e
metodologia de pesquisa para o desenvolvimento deste trabalho.
Capítulo 2 – Representação de dados com QR Code: Neste capítulo, introduz-se
a representação de dados em QR Code, juntamente com as vantagens e benefícios
de sua utilização.
Capítulo 3 – Plataforma Java: Neste capítulo, é contextualizada a análise e
processamento de imagens, juntamente com as APIs Zebra Crossing e QRGen na
plataforma Java.
Capítulo 4 – Proposta de Trabalho: Neste capítulo, apresenta-se o Layer-Colored
QR Code como uma abordagem multicolorida para QR Code, bem como as
tecnologias e recursos adotados.
Capítulo 5 – Estudo de Caso: Neste capítulo, é apresentada a implementação da
abordagem proposta, bem como os experimentos e resultados da utilização da API
para manipulação de Layer-Colored QR Code.
Capítulo 6 – Conclusão: Neste capítulo, apresentam-se as vantagens e
desvantagens da adoção de QR Code para grandes quantidades de dados.
Referências
19
2. REPRESENTAÇÃO DE DADOS COM QR CODE
Este capítulo tem como objetivo conceituar a representação de dados em QR Code, bem
como suas vantagens e benefícios em relação ao tamanho de impressão, resistência a
sujeira e danos, legibilidade, correção de erros e armazenamento distribuído.
2.1 CÓDIGOS GRÁFICOS
Existem mais de 20 tipos de códigos 2D convencionais. A maior diferença encontrada entre
códigos, encontra-se na capacidade de armazenamento. O QR Code por exemplo, pode
armazenar até 7000 dígitos decimais, enquanto um Maxi Code 138 dígitos (GRILLO et
al.,2010). A Tabela 1 apresenta características de códigos gráficos.
Tipo de Código QR Code PDF417 Data Matrix Maxi Code
Desenvolvedor Denso Symbol Technologies RSVI Acuity CiMatrix UPS
Dados Numéricos 7.089 2.710 3.116 138
Dados Alfanuméricos 4.296 1.850 2.355 93
Dados Binários 2.953 1.018 1.556
Dados Kanji 1.817 554 778
Tabela 1: Características de códigos 2D
Fonte: GRILLO et al., 2010
Código QR ou Código de Resposta Rápida, do inglês Quick Response Code, é uma matriz
de símbolos, que consiste na representação gráfica dos dados, por meio de uma série de
módulos apresentados na forma de quadrados pretos e brancos, nominalmente distribuídos
em um quadrado maior, conforme pode ser observado na Figura 1 (ISO, 2015).
Figura 1: QR Code
Fonte: Denso ADC, 2011
20
Os módulos distribuídos pelo QR Code, são capazes de executar várias funções. Enquanto
alguns módulos são responsáveis por armazenar os dados reais codificados, outros são
agrupados em vários padrões de funções, melhorando o desempenho, alinhando o símbolo,
corrigindo erros e compensando a distorção (DENSO ADC,2011).
Todo QR Code deve ser construído com módulos nominalmente quadrados, dispostos em
uma matriz quadrada regular, composto de uma região de codificação e padrões de função,
detectores de posição, padrões de sincronismo e alinhamento. O símbolo também deve ser
cercado por uma “zona neutra”, cobrindo todos os lados do quadrado maior (ISO,2000). A
Figura 2 apresenta a separação dos módulos de um QR Code.
Figura 2: Módulos QR Code
Fonte: Denso ADC, 2011
Incluindo um padrão único de localização, o Código QR apresenta quadrados maiores,
localizados em três cantos do símbolo, que tem por objetivo facilitar a identificação de seu
posicionamento, tamanho e inclinação na interpretação dos dados (ISO, 2015).
Cada padrão de detecção de posição é composto de 7x7 módulos pretos, 5x5 módulos
brancos e 3x3 módulos pretos, podendo ser visualizado como três quadrados concêntricos
sobrepostos. O símbolo é codificado de uma forma em que a probabilidade de padrões
semelhantes aos padrões de detecção de posição serem encontrados em outras partes na
figura é muito baixa, permitindo uma rápida leitura e identificação da orientação e
localização do símbolo (ISO,2000).
21
Os padrões de temporização (Timing pattern), localizados na horizontal e vertical,
respectivamente, próximos aos quadrados de detecção de posição, permitem que o
dispositivo de leitura reconheça o tamanho do símbolo (DENSO ADC,2011).
O padrão de alinhamento, encontrado na parte inferior direita do QR Code, é semelhante
aos padrões de detecção de posição, mas em escala menor. Composto de 5x5 módulos
escuros, 3x3 módulos brancos e um único módulo central de cor preta, que também pode
ser visto como três quadrados concêntricos sobrepostos, a função do padrão de
alinhamento é de mostrar como a imagem deve ser lida e processada. A quantidade de
padrões de alinhamento que compõem um QR Code, variam de acordo com a versão e
devem ser colocados em símbolos da versão 2 a 40 (ISO,2000).
As regiões de informações de versões (version information), formato da informação (format
information) e área para correção de erros (data and error-corretion área) compõem a
região de codificação e abrange todos os dados de caracteres codificados (ISO,2000).
A “zona neutra” (quiet zone), é uma região que cerca o símbolo em seus quatro lados, que
não contém dados, assegurando que textos ou marcações não sejam confundidos com os
dados do QR Code (DENSO ADC,2011).
O QR Code apresenta versões que variam de 1 a 40. Em cada versão encontram-se
configurações ou quantidade de módulos diferentes, conforme apresentado na Figura 3. As
configurações de módulos referem-se a quantidade de módulos contidos no símbolo.
Iniciando na versão 1 (21x21 módulos) são acrescidos 4 módulos por versão até a versão
40 (177x177 módulos), aumentando a capacidade de armazenamento, tipos de caracteres
e nível de correção de erros (QRCODE, 2015b).
Figura 3: Versões do QR Code
Fonte: QRCODE, 2015b
22
2.2 VANTAGENS E BENEFÍCIOS
2.2.1 TAMANHO DE IMPRESSÃO
Enquanto códigos de barras convencionais (1-D), transmitem informações mediante o
tamanho e posições das barras em uma linha única horizontal. Os QR Codes são matrizes
bidimensionais que transmitem informações por meio de seus conjuntos de elementos
pretos e brancos em colunas e linhas. Como o QR Code carrega as informações tanto na
vertical quanto na horizontal, torna-se possível codificar a mesma quantidade de dados, de
um código de barras convencional, em um décimo do mesmo espaço (GRILLO et al. 2010).
Na Figura 4 é possível observar o tamanho de impressão de um QR Code em relação a um
código de barras padrão, com a mesma quantidade de informações codificadas.
Figura 4: Tamanho de impressão Fonte: Denso ADC, 2011
O tamanho de impressão de um QR Code é determinado por meio do tamanho de seus
módulos e a versão utilizada. Entretanto, caso necessário, é possível reduzir seu tamanho
de impressão tanto quanto necessário. Para isso, no entanto, são necessários uma
impressora de ultra precisão e um marcador a laser. Mesmo se isto for alcançado, a
resolução do leitor tem de corresponder a ultra resolução do código impresso. Caso sua
capacidade de leitura for insuficiente para ler o código, não se recomenda a impressão do
código em uma resolução tão reduzida. Considerando a capacidade de leitores e
impressoras atuais, o menor tamanho de impressão possível de um código QR seria
composto de módulos de 0,03mm. Lembrando que cada módulo do QR Code equivale a
um quadrado preto ou branco, a quantidade de módulos em um código QR varia de acordo
com a versão utilizada (QRCODE, 2015c).
Os módulos de uma impressora de transferência térmica ou térmica direta provém da
quantidade de pontos na cabeça de impressão, ou seja, se a densidade de cabeça for de
300 dpi e cada módulo for constituído de 5 pontos, o tamanho do módulo será de 0,42 mm.
23
O ponto é o elemento mínimo que compõem uma imagem renderizada, em impressoras e
scanners ele é expresso como dpi (Dots per inch) ou pontos por polegada. O aumento
dessa quantidade de pontos melhora a qualidade de impressão, elimina a distorção do eixo
e desfocagem (QRCODE, 2015d). A Tabela 2, apresenta o tamanho dos módulos de
impressão de um QR Code, levando em consideração o tipo da impressora, a densidade e
a configuração utilizada.
Impressora Densidade Configuração de 4 pontos
Configuração de 5 pontos
Configuração de 6 pontos
Laser 600 dpi 0,17mm 0,21mm 0,25mm
360 dpi 0,28mm 0,35mm 0,42mm
Térmica 300 dpi 0,33mm 0,42mm 0,5mm
200 dpi 0,5mm 0,63mm 0,75mm
Tabela 2: Tamanho do módulo de impressão Fonte: QRCODE, 2015d
Cada scanner apresenta um limite de tamanho do módulo legível diferente, definido pela
resolução do digitalizador. Por exemplo, se um QR Code for impresso em uma impressora
de 600dpi com a configuração de 4 pontos, o tamanho do módulo será de 0,17mm. Para
realizar a leitura deste QR Code será necessário um scanner com resolução abaixo de
0,17mm. Na Tabela 3, são apresentados alguns modelos de scanners com suas
respectivas resoluções.
Tipo de Sanner Modelo Resolução
Alta Resolução BHT-800Q Series 0,2mm
GT20QD-SM 0,1mm
Padrão
Bhat-710QWB-in 0,25mm
BHT-600Q Series 0,25mm
Série QK20 0,25mm
AT10Q-SM / SB 0,25mm
Tabela 3: Scanners e tamanho do módulo de leitura Fonte: QRCODE, 2015d
2.2.2 RESISTÊNCIA A SUJEIRA E DANOS
Mesmo que um símbolo esteja parcialmente sujo ou danificado, conforme apresentado na
Figura 5. O QR Code pode restaurar parte desses módulos, devido a implementação de
um código de correção de erros. A capacidade de restauração varia de 7 a 30% dos dados,
dependendo do tamanho e modelo do QR Code (GRILLO et al.,2010).
24
Figura 5: Resistência a sujeira e danos Fonte: Denso ADC, 2011
2.2.3 CORREÇÃO DE ERROS
O QR Code possui quatro níveis diferentes para correção de erros, apresentados na Tabela
4. A função de correção de erros é implementada por meio do código Reed-Solomon,
altamente resistente a rupturas e erros. Por meio desta funcionalidade de correção de erros,
os códigos podem ser lidos corretamente, mesmo quando eles são manchados ou
danificados. O nível de correção de erros pode ser configurado pelo usuário. Aumentar o
nível de correção de erros melhora a capacidade de correção, contudo, a quantidade de
dados contidos no QR Code também aumenta (SOON,2008).
Capacidade de correção de erros
Level L Aprox. 7%
Level M Aprox. 15%
Level Q Aprox. 25%
Level H Aprox. 30% Tabela 4: Capacidade de Correção de erros de acordo com o nível
Fonte: QRCODE, 2015b
Para escolher o nível de correção de erros, vários fatores como ambiente e tamanho de
impressão devem ser considerados. Recomendam-se os níveis Q e H para ambientes de
fábrica, onde o QR Code pode ficar sujo, e os níveis L e M para ambientes sem grandes
riscos de sujeira ou danos (QRCODE, 2015b).
A função de correção de erros é capaz de corrigir dois tipos de erros, módulos que não
podem ser escaneados (apagados ou rasurados) e módulos que são convertidos errados.
Como o QR Code é uma matriz simbológica, um defeito na conversão de um módulo preto
para branco, ou o inverso, afetará na decodificação dos caracteres, apresentando um
25
resultado válido, porém diferente. Devido ao QR ser uma matriz simbológica, são
necessários dois módulos corretos para cada módulo convertido erroneamente (ISO, 2000).
Por exemplo, utilizando um nível de correção M em um código com 148 símbolos, 44 deste
montante são reservados para correção de erros, sendo 22 o número de símbolos passíveis
de correção, portanto a capacidade de correção é de 22/148 ou aproximadamente 15%.
Ao se utilizar um nível de correção H em um código de 182 símbolos, 110 são os símbolos
de correção de erros e 72 o número de dados codificados, sendo possível a correção de
até 55/182 símbolos ou aproximadamente 30%.
2.2.4 LEGIBILIDADE
O QR Code apresenta uma leitura omnidirecional e de alta velocidade. Mesmo que uma
imagem esteja distorcida ou em uma superfície curva, por intermédio dos padrões de
detecção de posição nos três cantos do símbolo, o código pode ser lido a partir de qualquer
ângulo dentro de 360º, sem a necessidade de alinhamento entre o scanner e os símbolos
do código. Estes padrões de detecção garantem uma leitura rápida e estável, eliminando
quaisquer interferências de fundo (DENSO ADC, 2011). A Figura 6 apresenta um exemplo
de QR Code distorcido.
Figura 6: QR Code distorcido
Fonte: GRILLO et. al, 2010
A leitura dos símbolos da matriz, é realizada por meio da implementação de um sensor
CCD (Charge Coupled Device). Os dados da linha de varredura são capturados por este
sensor e armazenados na memória. Em seguida, um software identifica a posição, tamanho
e ângulo do símbolo detectado e inicia o processo de decodificação. Tradicionais símbolos
bidimensionais costumavam levar muito tempo para detectar a posição, ângulo e tamanho
de um símbolo. Mediante os padrões de detecção implementados em QR Code, dispostos
em três cantos do símbolo, a leitura se torna mais rápida, permitindo a identificação do
símbolo a partir de qualquer ângulo dentro de 360º. A relação entre preto e branco na linha
26
de digitalização em que percorrem os padrões de localização é sempre de 1: 1: 3: 1: 1, ao
detectar essa razão específica, o padrão de localização é detectado pelo sensor CCD,
identificando a posição do QR Code em um curto período de tempo. Ao dispor o padrão de
detecção nos três cantos do símbolo, a decodificação do QR Code pode ser realizada até
20 vezes mais rápida que outros códigos matriciais (SOON,2008).
2.2.5 ARMAZENAMENTO DISTRIBUÍDO
O QR Code apresenta uma funcionalidade de ligação, permitindo que um único símbolo
possa ser representado por vários outros símbolos, conforme pode ser observado na Figura
7. Um QR Code pode ser dividido em até 16 símbolos, possibilitando a impressão em áreas
menores. Independentemente da ordem em que forem analisados, os símbolos gerados
serão lidos como um único símbolo de dados (SOON,2008).
Figura 7: Distribuição de um QR Code
Fonte: QRCODE, 2015b
2.2.6 CÓDIGO ABERTO
QR Code é um código aberto, que qualquer pessoa pode utilizar. Com as regras para sua
utilização e a padronização do código, seu uso aumentou, expandindo para vários países
de todo o mundo. Devido ao modelo de desenvolvimento open source, melhorias são
constantemente desenvolvidas para os Códigos QR, de modo que, novos tipos de QR Code
que atendam às necessidades mais sofisticadas, são criados um após o outro (QRCODE,
2015a).
27
2.3 COLORED QR CODE
Segundo Grillo et al (2010) a capacidade de armazenar mais dados, sem o aumento da
área de impressão em um clássico código bidimensional, representa um dos maiores
desafios dos códigos de barras da próxima geração. Com a finalidade de expandir a
capacidade de dados armazenados, alguns códigos de barras 2D utilizam diferentes cores
para criar mais símbolos, resultando em uma maior capacidade para armazenamento de
dados dentro de uma mesma área de impressão. Exemplos de tais códigos de barras são
o Color Bar Code System of Imageid Ltd e o Microsoft’s High Capacity Color Barcode.
O High Capacity Color Barcode (HCCB), apresentado na Figura 8, aproveita-se de
dispositivos de computação de imagens avançados, juntamente com o poder de
processamento para permitir o armazenamento de uma maior densidade de dados em
mídias impressas analógicas. O aumento na densidade de dados, torna-se possível com a
utilização de triângulos coloridos nas linhas da matriz bidimensional, separados por uma
linha branca (MICROSOFT,2016).
Figura 8: Microsoft’s High Capacity Color Barcode Fonte: MICROSOFT, 2016
Enquanto o número de linhas de um HCCB podem variar, o número de módulos em cada
linha é sempre um múltiplo do número de linhas. Além das linhas separatórias de cor branca
o HCCB apresenta uma borda de limitação de cor preta. Esses padrões são projetados
para agira como marcos visuais, a fim de localizar o código de barras na imagem. A
limitação de cor preta na parte inferior da imagem é mais espessa que os limites sobre os
outros três lados. Como o código de barras pode estar em uma posição arbitrária a imagem,
essa parte inferior mais espessa age como um ponto de referência para a leitura da
28
imagem, Os últimos 8 símbolos na última linha, serão sempre compostos de uma ordem
fixa de cores, com 2 símbolos para cada cor, conforme pode ser observado na Figura 13.
A principal limitação do HCCB está relacionada a seus mecanismos de detecção e
alinhamento. Essas limitações dos mecanismos de detecção e alinhamento, derivam do
fato, de que nem todas imagens separadas pela borda branca sejam necessariamente
código (GRILLO et al. 2010).
29
3. PLATAFORMA JAVA
3.1 INTRODUÇÃO
A história do Java se inicia em 1991, quando um pequeno grupo de engenheiros da Sun
denominados “Green Team”, liderados por James Gosling, criaram a linguagem de
programação que revolucionaria nosso mundo. Em 1995, com o anúncio da incorporação
ao navegador de Internet Netscape, a tecnologia Java decolou (LINDHOLM; YELLIN,
2011).
Segundo (DEITEL; DEITEL, 2010) os programas em Java são constituídos em partes
denominadas classes. Estas classes consistem em partes denominadas métodos, que
realizam tarefas e retornam informações ao completa-las. Em Java é possível programar
várias funções separadas, que podem ser necessárias para formar um programa.
Entretanto, a maior parte dos programadores aproveitam-se das ricas coleções de classes
já existentes em bibliotecas de classes Java.
Em uma linguagem de programação, ao compilar um programa, o código fonte é
transformado em código de máquina específico para uma plataforma e sistema operacional.
O código binário resultante da compilação, será executado pelo sistema operacional, e por
esta razão, o código deve ser capaz de se comunicar com o sistema operacional em
questão. A linguagem Java utiliza-se de um conceito denominado máquina virtual, onde,
entre o sistema operacional e a aplicação, existe uma camada extra, responsável por
interpretar as ações da aplicação, para realizar as respectivas chamadas ao Sistema
Operacional (CAELUM,2016). Na Figura 9 é apresentado o funcionamento da máquina
virtual do Java.
.
Figura 9: Funcionamento da máquina virtual do Java Fonte: VIRALPATEL, 2008
30
A Java Virtual Machine (JVM) é uma máquina abstrata. Assim como uma máquina real de
computação, a JVM apresenta um conjunto de instruções e manipula várias áreas de
memória em tempo de execução. A JVM não é capaz de interpretar a linguagem de
programação Java, mas apenas um formato binário específico (LINDHOLM; YELLIN, 2011).
Esse código binário é gerado por um compilador Java, como o javac, e é conhecido como
“bytecode”, por existir menos de 256 códigos de operação dessa linguagem, e cada código
de operação consumir um byte. O compilador Java gera esse bytecode que, diferente das
linguagens sem máquina virtual, serve para diferentes sistemas operacionais, já que o
código gerado é interpretado pela JVM e não pelo Sistema Operacional (SO)
(CAELUM,2016).
De acordo com (DEITEL; DEITEL, 2010), normalmente, antes de serem executados, os
programas em Java passam por cinco fazes:
Fase 1: Consiste na edição de um arquivo, realizado por meio de um programa
editor. O programador escreve um programa em Java utilizando o editor e realiza
correções quando necessário.
Fase 2: Consiste na compilação do código, onde, o compilador Java traduz o
programa para bytecodes.
Fase 3: É denominada de carregamento. Antes de ser executado, o programa deve
ser primeiramente alocado na memória. Esta alocação é realizada pelo carregador
de classe, que pega o arquivo “.class” contendo os bytecodes e o transfere para a
memória.
Fase 4: Consiste na verificação dos bytecodes. Antes que o Interpretador Java
execute os bytecodes, os mesmos têm de ser verificados pelo verificados de
bytecodes, assegurando que os bytecodes para as classes que baixadas da internet,
são válidos e não violam as restrições de segurança do Java.
Fase 5: Consiste na execução do programa. O computador, sob o controle de sua
CPU, interpreta o programa, realizando assim as tarefas determinadas pelo
programa.
31
3.2 ANÁLISE E PROCESSAMENTO DE IMAGENS
Segundo (GONZALES; WOODS, 2008), uma imagem pode ser definida como uma função
f(x,y) de duas dimensões, onde x e y representam as coordenadas e f a intensidade ou
nível de cinza (brilho) da imagem no ponto em questão, de qualquer par de coordenadas
(x, y). Quando x,y e f representam valores finitos, denomina-se esta imagem de imagem
digital. A área de PDI (Processamento digital de imagens), refere-se ao processamento
digital de imagens por meio de um computador digital. Uma imagem digital é composta por
um número finito de elementos, cada um dos quais possui uma determinada localização e
valor. Esses elementos são chamados de elementos de imagens e pixel. A Figura 10 mostra
um exemplo de imagem digital.
Figura 10: Representação de uma imagem digital Fonte: ROCHA, 2013
Em imagem digital, o pixel é um ponto físico em um bitmap, o menor elemento de uma
fotografia representada na tela. O endereço de um pixel corresponde as suas coordenadas
físicas. Os pixels são construídos em uma tabela bidimensional, representados por pontos
ou quadrados (ROBBINS,2016).
Em computação gráfica, bitmaps, são estruturas de dados matriciais, responsáveis por
especificar a cor de cada pixel, geralmente representados por tabelas retangulares de
pixels, ou pontos de cor, que podem ser visualizados por meio de um monitor, papel ou
outro tipo de display (ROBBINS,2016).
32
De acordo com (GONZALES; WOODS, 2008), de um modo geral, o processamento de
imagens digitais apresenta 12 passos fundamentais:
Aquisição de imagem: É o primeiro passo no processamento de imagens, uma
técnica que captura e digitaliza uma imagem. Geralmente esta fase de aquisição da
imagem envolve o pré-processamento, como o dimensionamento.
Aperfeiçoamento de imagem: É o processo que manipula uma imagem de forma que
o resultado obtido é mais adequado que o original para uma aplicação específica.
Restauração de imagem: Assim como o aperfeiçoamento de imagem, a restauração
é um processo com o finalidade de melhorar a qualidade de uma imagem. No
entanto, diferente do aperfeiçoamento de imagem onde a melhora na qualidade é
subjetiva, na restauração as técnicas de recuperação baseiam-se em modelos
matemáticos e estatísticas de degradação de uma imagem.
Processamento de imagem colorida: Com o aumento significativo na utilização de
imagens digitais por meio da Internet, o processamento de imagem colorida é uma
área que vêm ganhando bastante importância.
Wavelets: Recursos para a representação de imagens em diversos graus de
resolução, compressão de dados de imagem e representação piramidal, onde as
imagens são dividias em regiões menores.
Compressão: É o processo que reduz o tamanho de armazenamento necessário
para salvar uma imagem.
Processamento morfológico: Por meio da utilização de algumas ferramentas, o
processamento morfológico, extrai os componentes de uma imagem, que são uteis
para representação e descrição da forma de uma região, como fronteiras e fechos
convexos, por exemplo.
Segmentação: É o procedimento para particionar uma imagem em suas partes
constituintes ou objetos. A segmentação é uma das tarefas mais difíceis em PDI,
apresentando uma solução para problemas de imagem onde, por exemplo,
requerendo a identificação individual dos objetos de uma imagem.
Representação e descrição: Converte os dados para um formato adequado, de
forma que um computador possa processa-los.
Reconhecimento: É o processo que atribui uma “etiqueta” (por exemplo, “humano”)
a um objeto, com a finalidade de identifica-los, baseado em suas descrições.
33
O termo análise refere-se ao tratamento da informação presente em uma imagem. Tal
tratamento da informação é denominado de parametrização e nele, várias medidas
quantitativas ou parâmetros são utilizados com a finalidade de descrever as diferentes
informações contidas dentro de uma imagem. As técnicas dedicadas a análise de imagens
podem variar significativamente de acordo com a complexidade e a necessidade em tempo
de processamento. Alguns exemplos da aplicação de análise de imagem são: a
determinação de um número de células presentes em um tecido biológico, o cálculo das
formas dos contornos de uma célula ou ainda a determinação da distribuição de uma
população específica de um conjunto de células (ALBUQUERQUE et al, 2000).
Tradicionalmente, uma imagem é a representação visual de um objeto do mundo real,
capturado por meio do uso de algum tipo de processo mecânico, eletrônico ou fotográfico.
Na computação gráfica, uma imagem se refere a um objeto em um dispositivo de saída
(MURRAY, 1996).
Nos ambientes de programação atuais, existem diversas Applications Programming
Interfaces (APIs) disponíveis, que fazem praticamente todos os aspectos da computação,
seja ele de rede, bancos de dados, gráficos, som ou imagem (Burger et al.,2009).
Em Java, uma alternativa para PDI é a utilização da API Java Advanced Imaging (JAI).
Embora a API não seja parte de um software completo de processamento de imagem, as
funções e extensões possibilitam a implementação de algoritmos de processamento de
imagens (SANTOS, 2004).
Em JAI, as imagens podem ser multidimensionais ou seja, com múltiplos valores
associados a um único pixel e pode apresentar pixels com valores inteiros ou de ponto
flutuante. Pixels podem ser compactados de diversas formas ou descompactados em uma
matriz de dados de imagem. Diferentes modelos de cores podem ser utilizados. Como é de
se esperar, a fim de representar uma variedade de dados de imagem que podem ser
tratados com uma variedade de classes (SANTOS,2004).
De acordo com Santos (2004), algumas classes básicas para representação de dados de
imagem, são abstratas ou subclasses concretas de objetos que se comportam de maneira
semelhante. Na JAI API a PlanarImage é a classe básica para representação de imagens,
apresentando uma maior flexibilidade que a classe BufferedImage do Java. Ambas as
classes armazenam seus pixels em uma instância de Raster que contém uma instância de
uma subclasse completa denominada DataBuffer. Uma PlanarImage também apresenta
uma instância de um ColorModel associado a ela, o qual contém uma instância de
34
ColorSpace, que determina como o valor de um pixel é associado ao valor de uma cor. Na
Figura 11 pode ser observado a estrutura de uma PlanarImage.
Figura 11: Estrutura de uma PlanarImage Fonte: SANTOS, 2004
Uma PlanarImage permite somente a leitura de uma imagem, ou seja, pode ser criada e
seus valores de pixels podem ser lidos de diversas maneiras diferentes, mas não existem
métodos implementados que permitam a modificação dos valores de seus elementos
(SANTOS,2004).
Outra alternativa solução para PDI em Java é a utilização da API ImageJ, que pode exibir,
editar, analisar, processar imagens, com suporte a vários formatos de imagem, incluindo
TIFF, GIFm JPEG, BMP e DICOM. ImageJ foi projetada com uma arquitetura aberta que
proporciona extensibilidade por meio de plug-in Java. Software de aquisição, analise e
processamento de imagens podem ser implementados utilizando a API construída e
compilada em um editor Java (RSB,2016).
Algumas classes da API ImageJ são definidas a partir da API AWT de interface gráfica do
Java, permitindo que o resultado de suas operações sejam visualizados também pela API
Swing, por herdar algumas características de AWT. Em relação aos plug-ins,
desenvolvedores tem a possibilidade de criar ou reaproveitar plug-ins já utilizados no
aplicativo. Isso fornece uma grande flexibilidade na criação de classes mas, não impede a
criação de código redundantes entre os trabalhos de diversos desenvolvedores
(JÚNIOR,2009). A Figura 12 apresenta a estrutura geral da API ImageJ.
35
Figura 12: Estrutura geral da API ImageJ. Fonte: JÚNIOR, 2009
Apesar desse problema, as classes nativas da API oferecem suporte à maior parte das
técnicas de PDI. ImagePlus e ByteProcessor são duas classes bastante utilizadas. A classe
ImagePlus geralmente exige um objeto de java.awt.Image na instanciação de seus objetos
e sempre carrega a imagem para a visualização na interface gráfica. A classe
ByteProcessor, é a base para execução das principais técnicas de processamento de
imagens com ImageJ (JÚNIOR,2009).
3.3 APIS E BIBLIOTECAS PARA QR CODE
3.3.1. ZEBRA CROSSING (ZXING)
Zxing (“Zebra Crossing”) é uma biblioteca open-source para geração e processamento de
códigos de barras, com suporte a diversos formatos de imagens 1D e 2D, implementado
em Java, com suporte a outras linguagens como: C++, Objective C, JRuby, entre outras
(OWEN,2016). Na Tabela 5, são apresentados os formatos de códigos de barras
suportados pela biblioteca Zxing.
36
Fromatos Suportados
1D Produtos 1D Industrial 2D
UPC-A Code 39 QR Code
UPC-E Code 93 Data Matrix
EAN-8 Code 128 Aztec (beta)
EAN-13 Codabar PDF 417 (beta)
ITF
RSS-14
RSS-Expanded Tabela 5: Formatos de códigos de barras suportados em ZXing
Fonte: OWEN, 2016
Códigos de barras 2D podem codificar diversos tipos de textos, que podem representar
muitas coisas. Normalmente, os códigos de barras 2D codificam textos que representam
uma URL (Uniform Resource Locator), que é o endereço de um recurso disponível em uma
rede de internet ou intranet, como http://google.com por exemplo. Essa expressão é
reconhecida pelo leitor como uma URL e pode ser aberta em um navegador (OWEN,2014).
Códigos de barras 2D também podem codificar textos do tipo acionáveis, textos que por
exemplo, representam informações de contato, que quando reconhecidas, podem executar
um pedido para adicionar o contato para um catálogo de endereços (OWEN,2014).
De acordo com Owen (2014), a API ZXing suporta todos estes formatos e mais alguns.
Entretanto, para que o leitor interprete o texto codificado, algumas normas e padrões devem
ser seguidos
URL: O tipo de texto mais codificado em códigos de barras 2D. Para a codificação
desse tipo de texto é necessário incluir corretamente o texto da URL no código de
barras, juntamente com o protocolo (http://endereço), garantindo que o texto
codificado seja reconhecido como uma URL.
Endereço de e-mail: Para codificar um endereço de e-mail, pode-se simplesmente
codificar seu endereço (exemplo@exemplo.com.br). No entanto, para garantir que o
e-mail seja realmente reconhecido como um endereço de e-mail, é aconselhável
criar uma propriedade “mailto”, obtendo-se desta maneira, o texto: “mailto:
exemplo@exemplo.com.br”. Dessa maneira, ao identificar o texto codificado como
um endereço de e-mail, o leitor abrirá uma mensagem de e-mail em branco para o
endereço indicado.
Números de telefone: Para a codificação de número de telefone, uma propriedade
“tel” deve ser utilizada, de forma a garantir que os dígitos codificados sejam
37
entendidos como um número de telefone. É aconselhável que também sejam
inclusos os prefixos que tornam o número acessível internacionalmente. Por
exemplo, para codificar um número de telefone do Brasil “3322-5596”, deve-se
codificar “tel: +55-18-3322-5596”, o prefixo “+55” torna o número utilizável fora do
Brasil.
SMS: Semelhante a codificação de endereço de e-mail, para a codificação de um
sms, é necessário a utilização da propriedade “sms”. Dessa forma, para criar um link
para o número 12345, por exemplo, o texto a ser codificado deverá seguir o seguinte
formato: “sms: 12345”.
Exemplo de código para criação de um QR Code com ZXing:
File myFile = new File(filePath);
try {
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new
Hashtable<EncodeHintType, ErrorCorrectionLevel>();
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix byteMatrix =
qrCodeWriter.encode(myCodeText,BarcodeFormat.QR_CODE, size, size, hintMap);
int CrunchifyWidth = byteMatrix.getWidth();
BufferedImage image = new BufferedImage(CrunchifyWidth, CrunchifyWidth,
BufferedImage.TYPE_INT_RGB);
image.createGraphics();
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, CrunchifyWidth, CrunchifyWidth);
graphics.setColor(Color.BLACK);
for (int i = 0; i < CrunchifyWidth; i++) {
for (int j = 0; j < CrunchifyWidth; j++) {
if (byteMatrix.get(i, j)) {
graphics.fillRect(i, j, 1, 1);
}
}
}
ImageIO.write(image, fileType, myFile);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("\n\nYou have successfully created QR Code.");
38
3.3.2. QRGen
QRGen é uma biblioteca Java que cria uma camada acima da ZXing. Ela apresenta uma
dependência de ZXing, portanto, para geração de QR Codes em Java são necessários os
arquivos da ZXing (GULLAKSEN,2016).
QRGen consiste em três módulos: Core, Javase e Android. Ao desenvolver um aplicativo
Java é necessário adicionar o módulo Java EE para a lista de dependências. Os módulos
centrais requeridos, serão adicionados automaticamente pelo sistema de compilação
utilizado (GULLAKSEN,2016).
Para a utilização do QRGern dentro de aplicativos Android é necessário adicionar o módulo
Android à lista de dependências. Assim como no módulo de Java EE, os módulos centrais
requeridos serão adicionados automaticamente pelo compilador utilizado
(GULLAKSEN,2016).
Exemplo de código para criação de QR Code com a API QRGen:
// get QR file from text using defaults
File file = QRCode.from("Hello World").file();
// get QR stream from text using defaults
ByteArrayOutputStream stream = QRCode.from("Hello World").stream();
// override the image type to be JPG
QRCode.from("Hello World").to(ImageType.JPG).file();
QRCode.from("Hello World").to(ImageType.JPG).stream();
// override image size to be 250x250
QRCode.from("Hello World").withSize(250, 250).file();
QRCode.from("Hello World").withSize(250, 250).stream();
// override size and image type
QRCode.from("Hello World").to(ImageType.GIF).withSize(250, 250).file();
QRCode.from("Hello World").to(ImageType.GIF).withSize(250, 250).stream();
3.3.3. IMPLEMENTAÇÃO NATIVA
Além das API’s QRGen e ZXing (Zebra Crossing), em Java, é possível a implementação de
uma API para QR Code, recorrendo a recursos gráficos da plataforma. Canvas, Java 2d e
outras classes do pacote AWT, SWT e Swing, são alguns exemplos de recursos que tornam
a implementação possível.
39
A API Java 2D fornece gráficos bidimensionais, textos e recursos de imagens para
programas Java por meio de extensões para o pacote AWT (Abstract Windowing Toolkit).
A classe Java 2D oferece diversas classes que definem objetos geométricos comuns, como
pontos, linhas, curvas e retângulos em uma estrutura flexível, com vários recursos para o
desenvolvimento de interfaces, programas de desenhos sofisticados e editores de imagem.
Em Java 2D, existem objetos em um plano denominado espaço de coordenadas do usuário
(user coordinate space) ou simplesmente espaço do usuário (user space). Quando os
objetos são processados em uma tela, as coordenadas de espaço do usuário são
transformadas em coordenadas espaciais no dispositivo (ORACLE, 2015).
De Acordo com a ORACLE (2015), a API Java 2D fornece as seguintes capacidades:
Um modelo de padronização para dispositivos de exibição e impressoras
Uma ampla gama de primitivas geométricas
Mecanismos para a detecção de formas, textos e imagens
Controle a sobreposição de objetos
Suporte a melhoria de cor
Suporte a impressão de documentos complexos
Na API Java 2D, uma imagem é uma matriz retangular bidimensional de pixels, onde cada
pixel representa uma cor nessa determinada posição da imagem, onde as dimensões dessa
matriz, representam a extensão horizontal (largura) e a extensão vertical (altura) da imagem
exibida. A classe de Imagem mais importante para a representação de tais imagens é a
java.awt.image.BufferedImage, onde a API Java 2D, armazena o conteúdo das imagens na
memória, para que as mesmas possam ser acessados diretamente (ORACLE, 2015).
Uma aplicação pode criar um objeto BufferedImage diretamente ou obter um formato de
imagem externo, como PNG ou GIF. Em ambos os casos, a aplicação pode desenhar sobre
a imagem utilizando chamadas gráficas de Java 2D. Assim, as imagens não ficam limitadas
a exibição de imagens do tipo fotográficas. Diferentes tipos de objetos, como, linha, texto,
e até mesmo outras imagens podem ser desenhadas sobre a primeira imagem desenhada.
A imagem resultante pode então ser enviada para uma tela de exibição, para uma
impressora ou salva em um formato gráfico, como PNG ou GIF (ORACLE, 2015).
Exemplo de desenho com Java2D:
protected void paintComponent(Graphics g) {
40
super.paintComponent(g);
Rectangle2D.Double r;
Graphics2D g2 = (Graphics2D) g.create();
//Define a cor de preenchimento do quadrado
g2.setColor(Color.BLACK);
// Define as dimensões do quadrado
r = new Rectangle2d.Double(x,y,largura,altura);
// Desenha o quadrado preenchido com a cor definida
g2.fill(r);
g2.dispose();
}
A classe Canvas do pacote AWT é uma sub-classe derivada da classe Component, que
quando colocado sobre um JFrame, exibe uma área em branco utilizada para a geração de
gráficos. Um componente Canvas representa uma área retangular branca na tela, onde a
aplicação pode desenhar a partir da captura de eventos de entrada, disparados pelo
usuário.
Exemplo de desenho com Canvas :
// Definindo o construtor canvas com largura e altura
Canvas canvas = new Canvas(300, 300);
//Define um GraphicsContext, objeto principal do Canvas, utilizado para desenhar
GraphicsContext ctx = canvas.getGraphicsContext2D();
//Define a cor de preenchimento da figura
ctx.setFill(Color.BLACK);
//Desenha no componente um quadrado preenchido com a cor definida
ctx.fillRect(x,y,largura,altura);
41
4. PROPOSTA DO TRABALHO
Este trabalho tem por objetivo abordar a proposta de QR Codes coloridos, para o aumento
da capacidade de armazenamento e a implementação de uma API para a geração e leitura
de dados do QR Colorido, definido como Layer Colored QR Code. A leitura desse QR Code
se dará por meio do mapa de cores, que será utilizado para separar os N QR Codes
combinados na geração.
A API desenvolvida em Java será utilizada para, principalmente, combinar QR Codes,
gerando uma versão colorida dos mesmos, com base num mapa de cores para N layers
combinados, assim como extrair informações de um QR Code colorido e gerar N QR Codes
com base em um QR Code colorido.
Para o desenvolvimento da abordagem proposta em Layer Colored QR Code, algoritmos e
estratégias serão estudadas e implementadas visando apoiar a combinação e geração de
cores.
4.1 LAYER-COLORED QR-CODE: ABORDAGEM MULTI-COLORIDA PARA QR-
CODE
Em um QR Code padrão, cada módulo representa um único bit, seguindo uma regra
simples: 1 para quadrados pretos e 0 para quadrados brancos. Com a finalidade de se obter
uma maior capacidade para o armazenamento de informações, introduz-se cores na
representação do QR Code. A maior parte das abordagens com QR Code coloridos utilizam
apenas o preto, o branco e mais duas cores, armazenando assim, 4 possíveis informações
diferentes: [00, 01, 10, 11].
Figura 13: Módulos em Colored Qr Code Fonte: Adaptado de GRILLO et al., 2010
42
Em Layer Colored QR Code, várias cores podem ser utilizadas, possibilitando assim uma
maior capacidade para armazenamento de dados. Quanto maior a quantidade de cores
utilizadas para a geração do Layer Colored QR Code maior será a capacidade de
armazenamento de dados.
Figura 14: Módulos em Layer Colored QR Code Fonte: Adaptado de GRILLO et al., 2010
A geração do QR Code multicolorido em Layer Colored QR Code ocorre mediante a
sobreposição de QR Codes padrões, aumentando a capacidade de armazenamento a cada
sobreposição realizada. A cada sobreposição realizada, aumenta-se o número de cores
utilizadas, juntamente com a capacidade de armazenamento. Para a identificação da
quantidade de cores e sobreposições realizadas durante o processo de leitura e
decodificação, é acrescentado um mapa de cores ao lado da imagem gerada.
Figura 15: QR Code gerado em Layer Colored Qr Code.
43
4.2. PROJETO ARQUITETURAL PARA LAYER-COLORED QR CODE
Com a finalidade de aumentar a capacidade de informações em QR Code, algumas
abordagens acrescentam cores na geração do QR Code, resultando em um QR Code
colorido. A maior parte dessas abordagens utilizam 4 cores para a geração do QR Code:
preto, branco e mais duas cores.
Com o objetivo de aumentar ainda mais a capacidade de armazenamento de dados, Layer
Colored QR Code possibilita a utilização de N cores. A cada sobreposição realizada
aumentam-se o número de cores utilizadas e a capacidade de armazenamento de dados
Para a identificação da versão do Layer Colored QR Code utilizada, juntamente com as
cores utilizadas, um mapa de cores será definido para a leitura do QR Code. Na geração
do QR Code, uma região específica será reservada para o mapa de cores no canto superior
direito, ao lado do QR Code, possibilitando que N cores sejam interpretadas. Na Figura 16
é apresentado um exemplo de Layer Colored QR Code.
Figura 16: Exemplo de Layer Colored QR Code
O mapa de cores, imagem adicional ao QR Code colorido, é exibido em forma de matriz
com 3 cores por linha, com um tamanho de bloco configurável. Para a criação de um Layer
Colored QR Code, com 3 Layers, apresentando a seguinte sintaxe [Layer][Layer]Layer].
Seguindo a fórmula 2 ^ [Quantidade de Layers], 8 cores serão utilizadas: branco (000),
vinho (001), ciano (010), vermelho (011), cinza (100), laranja (101), rosa (110) e preto (111).
Na Figura 17 é demonstrado um QR Code com 3 Layers.
44
Figura 17: QR Code 3 Layers
Para a criação de um Layer Colored QR Code, com 5 Layers, apresentando a seguinte
sintaxe [Layer][Layer]Layer] [Layer]Layer]. Seguindo a fórmula 2 ^ [Quantidade de Layers],
32 cores poderão ser utilizadas.
Figura 18: QR Code 5 Layers
Visando a utilização do QR Code proposto (Layer Colored QR Code), foi implementada
uma API em Java, para auxiliar a geração e interpretação de QR Codes coloridos, com
maior capacidade de armazenamento.
45
4.3. TECNOLOGIAS E RECURSOS ADOTADOS
Em um primeiro momento foi implementado um componente para a geração de uma
imagem representando o QR Code, possibilitando a geração de QR Codes normais. Com
base na abordagem proposta por este trabalho, em um segundo momento foi implementado
um outro componente para realizar a leitura e extração de dados, levando em consideração,
somente a proposta de QR Code colorido.
Para a implementação de ambos os componentes foram necessários como recurso de
software a IDE Eclipse versão Mars, para desenvolvimento em Java. Para a geração do
QR Code padrão (preto e branco), tanto quanto o colorido, foram utilizadas as API’s open
source, ZXing (Zebra Crossing) e QRGen, que auxiliam na geração de QR Codes.
46
5. DESENVOLVIMENTO DO TRABALHO
5.1 IMPLEMENTAÇÃO DA ABORDAGEM LAYER COLORED QR-CODE
Com o objetivo de aumentar a capacidade de armazenamento de um QR Code, este
trabalho, apresentou uma nova abordagem por meio da sobreposição de QR Codes,
possibilitando a geração de QR Codes multicoloridos com maior capacidade de
armazenamento de dados.
Para a implementação da API de manipulação de Layer Colored QR Code, foi utilizada a
biblioteca ZXing (“Zebra Crossing”), biblioteca open-source de processamento de código
de barras 2D, para a geração dos QR Codes, que serão sobrepostos, dando origem ao
Layer Colored QR Code.
5.1.1 GERAÇÃO DE UM QR CODE EM LAYER COLORED QR-CODE
Para a geração de um QR Code com múltiplas camadas, por intermédio da API Layer
Colored QR-Code implementa com base na abordagem proposta, é necessário instanciar
um objeto do tipo LayerColoredWriter, especificar os métodos de codificação das camadas,
gerar a paleta de cores, informar os textos que serão utilizados para a geração das camadas
e os caminhos para a saída dos QR Codes padrões que comporão o Colored QR Code, por
meio de um objeto de tipo List<>. Abaixo é possível observar um exemplo para a geração
do QR Code com múltiplas camadas mediante a API desenvolvida.
public static void main(String[] args) throws IOException{
// Lista com os textos para a geração do Colored QR Code
List<String> inputList = new ArrayList<>();
inputList.add("Texto para o QR Code de número 1");
inputList.add("Texto para o QR Code de número 2");
inputList.add("Texto para o QR Code de número 3");
// Lista com o caminho de saída para os QR Codes padrões
List<String> listPath = new ArrayList<>();
listPath.add("C:\\Users\\Gabriel Ussuy\\Desktop\\QR Codes\\QRCode1.png");
listPath.add("C:\\Users\\Gabriel Ussuy\\Desktop\\QR Codes\\QRCode2.png");
listPath.add("C:\\Users\\Gabriel Ussuy\\Desktop\\QR Codes\\QRCode3.png");
LayerColoredWriter lyr = new LayerColoredWriter();
47
// Informar metodos de codificação
lyr.setCharacterSet("UTF-8");
lyr.setErrorCorrection(ErrorCorrectionLevel.L);
lyr.setMargin(2);
// Gerar paleta de cores
lyr.generatePallete(3);
// Passar listas
lyr.generateQRCode(inputList);
lyr.generateColoredQRCode(listPath, 400);}
A classe LayerColoredWriter estende de EncodeType, que contém os métodos para
configuração do formato de codificação do QR Code:
public void setCharacterSet(String characterSet): Específica a codificação de
caracteres que será utilizada
public void setMargin(Integer margin): Específica o tamanho da margem do QR Code
public void setErrorCorrection(ErrorCorrectionLevel errorCorrectionLevel):
Específica o nível de correção de erros (L,M,Q ou H) que será utilizado para a
geração do QR Code.
Esses três métodos são responsáveis por criar um objeto do tipo Map<EncodeHintType,
Object>, necessário para a geração do QR Code por intermédio da biblioteca ZXing. A
seguir é apresentada a classe EncodeType:
public class EncodeType {
protected Map<EncodeHintType, Object> hintMap = new
EnumMap<EncodeHintType, Object>(EncodeHintType.class);
public void setCharacterSet(String characterSet){
hintMap.put(EncodeHintType.CHARACTER_SET, characterSet);
}
public void setMargin(Integer margin){
hintMap.put(EncodeHintType.MARGIN, margin);
}
public void setErrorCorrection(ErrorCorrectionLevel errorCorrectionLevel){
hintMap.put(EncodeHintType.ERROR_CORRECTION, errorCorrectionLevel);
}
}
48
O método generatePallete(Integer) é responsável por definir o número de sobreposições a
serem realizadas e gerar a referente paleta de cores. O método recebe como parâmetro,
um valor do tipo inteiro e, ao ser executado, gera um objeto colorMap do tipo Map<String,
Color>, a partir de uma instância da classe ColorMap, responsável pela geração automática
do mapa de cores. Que é possível observar no trecho de código a seguir:
public void generatePallete(Integer layers) throws IOException {
this.layers = layers;
colorMap = new ColorMap().generateColorMap(layers);
}
As classes responsável pelo mapeamento das cores, possui um objeto colorMap do tipo
Map<String, Color> e atribui as cores ao mapa juntamente com suas respectivas
combinações de bits. Ao executar o método generateColorMap é retornado o mapa de
cores referente ao respectivo número de layers. O exemplo a seguir refere-se ao método
generateColorMap, responsável pela criação do mapa de cores, para a geração do Colored
QR Code.
public Map generateColorMap(Integer layers) throws IOException{
colorMap = new HashMap<>();
String[] seqVet = generateCombinations(layers);
Integer colors = seqVet.length;
Integer range = maxColors/colors;
vetColors = new Color[colors];
colorMap.put(seqVet[0], Color.WHITE);
vetColors[0] = Color.WHITE;
Color c;
for(int i=1;i<colors-1;i++){
c = new Color((i+1)*range);
colorMap.put(seqVet[i], c);
vetColors[i] = c;
}
colorMap.put(seqVet[colors-1], Color.BLACK);
vetColors[colors-1] = Color.BLACK;
return colorMap;
}
49
O método generateQRCode(List<String>) recebe uma lista com os textos para a geração
dos QR Codes que serão sobrepostos e atribui a um objeto do tipo List<> da classe
LayerColoredWriter.
O método generateColoredQRCode(List<String>,Integer) deve receber como parâmetro
uma lista contendo o endereço de saída para os QR Codes padrões que serão sobrepostos
e seu tamanho em pixels. Ao ser executado o método cria uma matriz coloredMatriz, que
armazenará a representação dos bits binários dos QR Codes.
Em um primeiro momento será recuperado um endereço de saída da lista de endereços
informada e criado um arquivo myFile do tipo File. Após a criação do arquivo myFile é
instanciado um objeto qrCodeWriter do tipo QRCodeWriter. A classe QRCodeWriter
pertence a biblioteca ZXing e de acordo com a documentação da biblioteca, QRCodeWriter
é responsável por renderizar um QR Code como uma BitMatrix 2D em escala de cinza.
Em seguida é criada a BitMatrix a partir do método encode da classe QRCodeWriter que
irá receber como parâmetro um item da lista de textos de entrada, o formato
BarcodeFormat.QRCode que representa o formato de QR Code, altura, largura e o hintMap,
anteriormente criado a partir da classe EncodeType.
A seguir é criada uma BufferedImage, onde o tipo da imagem deve ser RGB e os tamanhos
de altura e largura devem ser iguais ao da BitMatrix. Segundo documentação da (Oracle,
2016) a classe BufferedImage, é um bloco de dados acessível em memória. Uma imagem
em memória, que torna possível, desenhar sobre esta imagem, aplicar efeitos ou desenha-
la em outra BufferedImage.
Após a criação da BufferedImage, é criado um objeto Graphics2D, apresentado na seção
3.3.2, para a pintura da imagem de acordo com a BitMatrix. É utilizado um laço “for” para a
verificação da BitMatrix, que adiciona a representação do bit na coloredMatriz e, quando o
valor de uma determinada posição da BitMatrix, obtida através do método get(x,y), for
verdadeira, pinta-se com o método fillRect da Graphics2D, essa determinada posição.
Em sequência a imagem é desenhada mediante o método write da classe ImageIO do Java
e, é realizada uma chamada ao método generetaColored da classe LayerColoredWriter,
responsável por desenhar o QR Code final, com um N número de camadas. A seguir é
apresentado o código de método generateColoredQRCode().
50
public void generateColoredQRCode(List<String> listPath, Integer size) {
StringBuilder[][] coloredMatriz = new StringBuilder[size][size];
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
coloredMatriz[i][j]=new StringBuilder();
try {
for(Integer i=0; i<this.layers; i++){
File myFile = new File(listPath.get(i));
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix byteMatrix = qrCodeWriter.encode(inputList.get(i),
BarcodeFormat.QR_CODE, size, size, hintMap);
// Cria a imagem de acordo com a largura da matiz
BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
image.createGraphics();
// Seta o fundo da imagem para cor branca
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.setColor(Color.WHITE);
// Pinta toda a imagem com a cor branca a partir de 0x0
graphics.fillRect(0, 0, size, size);
// seta cor de pintura para preto
graphics.setColor(Color.BLACK);
for (int j = 0; j < size; j++) {
for (int k = 0; k < size; k++) {
if (byteMatrix.get(j, k)) {
coloredMatriz[j][k].append("1");
graphics.fillRect(j, k, 1, 1);
}else
coloredMatriz[j][k].append("0");
}
}
ImageIO.write(image, "png", myFile);
}
// Gerar QR Colorido
generateColored(coloredMatriz, size);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("You have successfully created QR Code."); }
O método generateColored(), é responsável por gerar a versão final do QR Code colorido.
Esse método generateColored(), é semelhante ao generateColoredQRCode(), também
utiliza BufferedImage e Graphics2D para desenho, a diferença se encontra no laço for. Em
51
generateColored(), no laço for, a cor de pintura é alterada para a cor, que contém como
chave do mapa de cores, a representação da combinação de bits dos QR Codes
sobrepostos, como é possível observar no exemplo abaixo:
for (int j = 0; j < size; j++) {
for (int k = 0; k < size; k++) {
graphics.setColor(colorMap.get(coloredMatriz[j][k].toString()));
graphics.fillRect(j, k, 1, 1); } }
Ainda na geração do Layer Colored. É possível modificar a estrutura do mapa de cores da
imagem, alterando o tamanho em pixels das cores representadas no mapa e a quantidade
de cores impressas por linha. Para isso, é necessário instanciar um objeto do tipo
ColorMapSettings e realizar as modificações através de seus métodos set. Na figura 19 é
possível um mapa com as propriedades alteradas e seu respectivo código.
Figura 19: Mapa de Cores e seu respectivo código
5.1.2 LEITURA DE UM QR CODE EM LAYER COLORED QR-CODE
Para a leitura dos QR Codes com múltiplas camadas, por intermédio da API desenvolvida
é necessário instanciar um objeto do tipo LayerColoredReader, invocar o método
readPallete, para a identificação do mapa de cores utilizado, informar o caminho de saída
para os QR Codes por meio do método setOutputPath() e, por último, invocar o método
readLayerColored(), passando o caminho do QR Code que deve ser lido. A seguir é
apresentado um exemplo de código para a leitura na API.
52
public static void main(String[] args) throws IOException{
LayerColoredReader lyr = new LayerColoredReader();
lyr.readPallete("C:\\Users\\Gabriel Ussuy\\Desktop\\QR
Codes\\ColoredQRCode.png");
lyr.setOutputPath("C:\\Users\\Gabriel Ussuy\\Desktop\\QR Codes");
lyr.readLayerColored();
}
O método readPallete(), realiza uma leitura do mapa de cores, que se encontra ao lado do
QR Code, e identifica o padrão de cores utilizados para a geração do mapa de cores para
a tradução dos conjuntos de bits da imagem. Todas as cores identificadas dentro da área
do Mapa de Cores delimitada por uma borda de cor cinza, são adicionadas ao mapa
colorMap com suas respectivas combinações de bits. Em Layer Colored as cores dispostas
no mapa da imagem são ordenadas de acordo com sua combinação de bits, iniciando com
a cor branca (todos bits com valor 0) e finalizando com a cor preta (todos bits com valor 1).
O método setOutputPath, recebe como parâmetro uma String com o endereço de saída
para os QR Codes que serão geradas a partir da tradução do QR Code colorido e altera a
variável que armazena o endereço de saída da classe.
No método readLayerColored() é criada uma cópia da imagem em memória por intermédio
de uma BufferedImage e é realizada uma leitura pixel a pixel nessa BufferedImage,
identificando a cor de cada pixel.
A identificação da cor do pixel, é realizada por meio do método getRGB(x,y) da classe
BufferedImage. O método getRGB(x,y) retorna um número inteiro que representa a cor no
modelo de cores RGB, padrão (TYPE_INT_ARGB) e padrão sRGB de cores (Oracle,2016).
Em seguida a identificação da cor do pixel, é recuperada a combinação de bits no mapa de
cores de tradução e cada bit da combinação é atribuído a sua determinada BitMatrix. Após
a leitura dos pixels da imagem, obtém-se as BitMatrix dos QR Codes utilizados na
sobreposição. A seguir é apresentado o trecho de código, responsável pela identificação
da cor do pixel e a atribuição dos bits a BitMatrix.
BitMatrix[] bm = new BitMatrix[layers];
for (int i = 0; i < layers; i++) {
bm[i] = new BitMatrix(w, h);
bm[i].clear();
53
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
c = new Color(img.getRGB(i, j));
for (int k = 0; k < layers; k++) {
if (this.colorMap.get(c.getRGB()).substring(k, k + 1).equals("1")) {
bm[k].set(i, j);
}
}
}
}
Por intermédio das BitMatrix, as imagens dos QR Codes são geradas no diretório de saída
e em seguida decodificadas. Para a decodificação das imagens é instanciado um objeto
BinaryBitmap e a seguir um objeto Result que recebe um MultiFormatReader().decode()
como valor.
As classes BinaryBitmap, Result e MultiFormatReader pertencem a biblioteca ZXing.
BinaryBitmap é a classe bitmap principal de ZXing para representação de dados de 1 bit. A
classe MultiFormatReader é a classe principal de conveniência, que tenta descodificar
todos os formatos de códigos de barras suportados por ZXing. A classe Result, encapsula
o resultado da decodificação de uma imagem (ZXing, 2015). Após o objeto Result receber
o método decode(), que recebe um BinaryBitmap como parâmetro, da classe
MultiFormatReader os dados decodificados dos QR Codes são recuperados mediante o
método getText() da classe Result e impressos no console, conforme apresentado no
trecho de código a seguir.
for (int i = 0; i < layers; i++) {
bitmap = new BinaryBitmap(new HybridBinarizer(
new BufferedImageLuminanceSource(ImageIO.read(new FileInputStream(output +
i + ".png")))));
Result decodificado = new MultiFormatReader().decode(bitmap);
System.out.println(decodificado.getText());
}
5.2. EXPERIMENTOS E ADOÇÃO REAL DE LAYER COLORED QR CODE
O QR Code gerado a partir da API Layer Colored QR Code, implementada com base no
modelo proposto foi capaz de armazenar mais dados em relação ao QR Code padrão. Por
54
se tratar de uma sobreposição de vários QR Codes, a capacidade de armazenamento varia
de acordo com a versão dos QR Codes sobrepostos e a quantidade de sobreposições
realizadas. Quanto maior a quantidade de sobreposições realizadas maior será a
capacidade máxima de caracteres armazenados. Na Figura 20 são apresentados QR
Codes com 3,5 e 8 sobreposições, gerados a partir da API desenvolvida.
Figura 20: Layer Colored QR Code com 3,5 e 8 camadas
A cada sobreposição realizada o número de cores necessárias para codificação cresce
exponencialmente de acordo com a expressão 2^N, onde N é o número de sobreposições,
para a realização de 23 sobreposições, são necessárias 8.388.608 combinações de cores
(2^23). Cada cor do RGB (Red, Green e Blue) pode variar de 0 a 255, sendo possíveis
16.581.375 de combinações de cores (255x255x255), portanto o número máximo de
sobreposições possíveis, levando em consideração o padrão RGB é 23, pois para a
55
sobreposição de 24 QR Codes seriam necessárias 16.777.216 combinações de cores.
Embora sejam possíveis 23 sobreposições, o dispositivo de reconhecimento do QR Code
deve ser capaz de identificar todas as combinações utilizadas, caso contrário a codificação
torna-se inútil.
O QR Code gerado a partir da API Layer Colored QR Code, manteve a característica de
resistência a dano e sujeira, apresentados no QR Code padrão, podendo restaurar de 7 a
30% da imagem danificada, de acordo com o nível de correção de erros utilizado. Na Figura
21 são apresentados exemplos de QR Codes danificados, que puderam ser restaurados na
leitura do código.
Figura 21: Layer Colored QR Codes danificados
Quando um Colored QR Code danificado é interpretado pela API, seus danos são
replicados para os demais QR Codes que serão gerados no processo de descodificação da
imagem, como é possível observar na Figura 22.
Figura 22: Danos do Colored QR Code Replicados aos QR Codes resultantes
56
Apesar de interpretar QR Codes avariados em até 30%, danos a áreas críticas como os
padrões de detecção de posição, podem inviabilizar a leitura de um ou mais QR Codes que
foram sobrepostos.
Para uma análise mais detalhada do funcionamento de Layer Colored, novos testes podem
ser realizados para avaliar a combinação de QR Codes que armazenam grandes
quantidades de dados.
Novas funcionalidades e recursos podem ser adicionados a API, possibilitando a
comunicação entre sistemas mediante a codificação e descodificação de arquivos XML,
vCard, meCard, entre outros. Áreas como Realidade Aumentada e Marketing poderiam
influenciar o desenvolvimento de funcionalidades para tornar a leitura dos QR Codes mais
dinâmica e iterativa.
Em trabalhos futuros, a API proposta e desenvolvida pode ser integrada a dispositivos
móveis como, por exemplo, Android, iOS e Windows Phone.
57
6. CONCLUSÃO
6.1. CONSIDERAÇÕES FINAIS
Por meio da API desenvolvida, torna-se possível armazenar uma maior quantidade de
dados em um QR Code a partir da sobreposição de vários QR Codes como incialmente fora
proposto neste trabalho.
Apesar de a API proposta ter sido experimentada e aplicada apenas em um cenário fictício,
espera-se aplicá-la em contextos e ambiente reais. Assim, os resultados obtidos podem
contribuir com melhorias ao conceito inicialmente desenvolvido neste trabalho.
A utilização de QR Codes popularizou-se em virtude de sua velocidade, precisão e
características funcionais de leitura. Em consequência a essa popularização o mercado
passou a exigir códigos capazes de armazenar mais informações em um menor espaço de
impressão (GRILLO et al.,2010).
De acordo com VIEIRA et al (2012) a manipulação e processamento de grandes
quantidades de dados no contexto de Big Data é um dos grandes desafios na área de
Computação.
Com o aumento exponencial dos dados no contexto de Big Data, códigos de barras com
maiores capacidades de armazenamento podem vir a ser necessários. O projeto
desenvolvido contribui para o desenvolvimento desses códigos de barras apresentando
uma abordagem de sobreposição de QR Codes para o aumento da capacidade de
armazenamento.
Os QR Codes Coloridos gerados a partir da API foram capazes de armazenar mais dados
e mantiveram as características de resistência a dano e sujeira, apresentados no tradicional
QR Code. Mesmo com ruídos (defeitos) no QR Code colorido, a decodificação foi possível,
resultando nos N QR Codes que foram sobrepostos.
Desta forma, a implementação da API Layer Colored QR Code com base na abordagem
proposta, foi condizente com os objetivos propostos, permitindo a geração e leitura de QR
Codes coloridos, aumentando assim a capacidade de armazenamento.
58
6.2. TRABALHOS FUTUROS
A partir deste trabalho, pode-se desenvolver diversas implementações para a geração de
QR Codes multicoloridos, adicionando funcionalidades e aperfeiçoando o projeto ou
aplicando a abordagem de sobreposição em outras linguagens de programação.
Em trabalhos futuros, a API desenvolvida pode ser aperfeiçoada, modificando a arquitetura
de seus mecanismos de leitura para suporte a dispositivos móveis e melhor aproveitamento
de processamento.
Por fim, é possível dar continuidade a pesquisa, com referência neste trabalho,
possibilitando o desenvolvimento de outras APIs que auxiliarão na geração de QR Codes
com maior capacidade para armazenamento de dados.
Além disso, trabalhos futuros podem portar a API desenvolvida para dispositivos móveis,
possibilitando seu uso nos sistemas Android, iOS da Apple Windows Phone da Microsoft.
59
Referências
ALBUQUERQUE, Márcio Pontes; ALBUQUERQUE, Marcelo Portes. Processamento de
Imagens: Métodos e análises. Centro Brasileiro de Pesquisas Físicas - CBF/MCT.
Disponível em < http://www.cbpf.br/cat/pdsi/pdf/ProcessamentoImagens.PDF>. Acesso em
10/02/2016.
BURGER, Wilhelm; BURGE, Mark J. Principles of Digital Image Processing. 1. ed.
Londres: Springer, 2009.
CAELUM. Java e Orientação a Objetos. Disponível em <
https://www.caelum.com.br/apostila-java-orientacao-objetos/>. Acesso em 08/02/2016
DEITEL, Harley M; DEITEL, Paul J. JAVA: Como Programar. 8. ed. Tradução de Edson
Furmankiewicz. São Paulo: Pearson Education Brasil, 2010.
DENSO ADC. QR Code Essentials. 2011. 8p. Disponível em < http://denso-
adc.com/download>. Acesso em 20/10/2015.
GONZALES, Rafael; WOODS, Richard. Digital Image Processing. 3. ed. New Jersey:
Pearson Pretice Hall, 2008.
GRILLO, Antonio; LENTINI, Alessandro; QUERINI, Marco; ITALIANO, Giuseppe F. High
Capacity Colored Two Dimensional Codes. Proceedings of the International
Multiconference on Computer Science and Information Technology. 2010. 709p.
GULLAKSEN, Ken. QRGen: a simple QRCode generation api for java built on top
ZXING. Disponível em < https://github.com/kenglxn/QRGen>. Acesso em19/03/2016
IBM. What is Big Data?. Disponível em < http://www-
01.ibm.com/software/data/bigdata/what-is-big-data.html>. Acesso em 20/10/2015.
60
ISO. Information technology – Automatic identification and data capture techniques
– Bar code symbology – QR Code. ISO/IEC 18004. 2000.
ISO. Information technology – Automatic identification and data capture techniques
– QR Code barcode symbology specification. ISO/IEC 18004. 2015.
JÚNIOR, Iális Cavalcante de Paula. Técnicas de Processamento Digital de Imagens
com Java. 2009. Disponível em
<https://www.ppgia.pucpr.br/~facon/ComputerVisionBooks/2009ProcessamentoImagensC
omJava.pdf>. Acesso em 14/02/2015
LANEY Doug. 3D Data Management: Controlling Data Volume, Velocity, and Variety.
Meta Group. 2001. 1p.
LINDHOLM, Tim; YELLIN, Frank. Java Virtual Machine Specification. 2011. Disponível
em < http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-1.html>. Acesso em
08/02/2016.
MICROSOFT. About High Capacity Color Barcode Technology. 2016. Disponível em <
http://research.microsoft.com/en-us/projects/hccb/about.aspx> Acesso em 06/03/2016.
MURRAY, James D; Vanryper, William. Encyclopedia of Graphics File Formats. 2. ed.
O’Reilly Media. 1996. ISBN: 978-1-56592-161-0 | ISBN 10: 1-56592-161-5.
ORACLE. The History of Java Tecnology. 2016. Disponível em
<http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html>.
Acesso em 18/01/2016.
ORACLE. The Java™ Tutorials. 2015. Disponível em <
https://docs.oracle.com/javase/tutorial/2d/overview/index.html >. Acesso em 28/02/2016.
OWEN, Sean. Barcode Contents. 2014. Disponível em
<https://github.com/zxing/zxing/wiki/Barcode-Contents>. Acesso em 20/02/2015.
61
OWEN, Sean. Official ZXing ("Zebra Crossing"). 2016. Disponível em <
https://github.com/zxing/zxing >. Acesso em 20/02/2015.
QRCODE. History of QR Code. Disponível em < http://www.qrcode.com/en/history/>.
Acesso em 20/10/2015.2015a
QRCODE. How Small Can a QR Code be printed. Disponível em <
http://www.qrcode.com/en/faq.html>. Acesso em 07/02/2016.2015c
QRCODE. Point for setting the module size. Disponível em <
http://www.qrcode.com/en/howto/cell.html>. Acesso em 07/02/2016.2015d
QRCODE. What is a QR Code. Disponível em < http://www.qrcode.com/en/about/>.
Acesso em 13/01/2016.2015b
ROBBINS, Jennifer Niederst. Learning Web Design: A Beginners Guide to HTML, CSS,
Graphics, and Beyond. 3. ed. Clam 101, 2016. elSBN 9781490289861. R-2 6519.
ROCHA, Patrick Francis Gomes; FARTO, Guilherme de Cleva. Abordagem Teórica e
aplicabilidade de detecção facial em aplicativos móveis com Opencv e Google
Android. Trabalho de Conclusão de Curso Assis: Fundação Educacional do Município de
Assis – Fema, 2013. 20p.
RSB. ImageJ: Documentation. Disponível em < http://rsbweb.nih.gov/ij/docs/index.html>.
Acesso em 14/02/2016
SANTOS, Rafael. Java Advanced Imaging API: A Tutorial. Revista de Informática Teórica
e Aplicada, v.11, n.1,2004. P.93-124.
SOON, Tan Jin. There are several types of 2d codes in use by the industry. 2008.
Disponível em <https://foxdesignsstudio.com/uploads/pdf/Three_QR_Code.pdf>. Acesso
em 19/03/2016.
62
VIEIRA, Marcos Rodrigues; FIGUEIREDO Josiel Maimone; LIBERATTI, Gustavo;
VIEBRANTZ, Alvaro Fellipe Mendes. Bancos de Dados NoSQL: Conceitos,
Ferramentas, Linguagens e Estudos de Casos no Contexto de Big Data. Minicurso
apresentado no Simpósio Brasileiro de Bancos de Dados. 2012. 2p.
VIRALPATEL. Java virtual Machine, An inside story. 2008. Disponível em <
http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/>. Acesso em 08/02/2016.
Recommended