Eötvös Loránd Tudományegyetem Informatikai Kar Média- és Oktatásinformatikai Tanszék
Speciális QR-kódok készítése
Témavezető:
Készítette:
Pluhár Zsuzsa
Szabó Krisztián
egyetemi tanársegéd
prog. tervező informatikus BsC Budapest, 2012
A projekt az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával valósul meg, a támogatási szerződés száma TÁMOP 4.2.1./B-09/1/KMR-2010-0003.
1
BEVEZETÉS .............................................................................................................................. 3 1.1 1.2
2
FELHASZNÁLT TECHNOLÓGIÁK ........................................................................................ 4 2.1 2.2
3
ADATELEMZÉS ................................................................................................................... 14 ADAT KÓDOLÁSA BITSOROZATTÁ ........................................................................................ 14 Numerikus mód: 0001.................................................................................................... 15 Alfanumerikus mód: 0010 .............................................................................................. 16 Byte mód: 0100 ............................................................................................................. 17 Kanji mód: 1000............................................................................................................ 17 HIBAJAVÍTÓ KÓD LÉTREHOZÁSA ......................................................................................... 18 A VÉGSŐ ADATOK SORBA RENDEZÉSE .................................................................................. 20 A KÓDOT TARTALMAZÓ MÁTRIX FELÉPÍTÉSE ....................................................................... 20 MASZK ALKALMAZÁSA ....................................................................................................... 21 HIBAJAVÍTÓ KÉPESSÉG, ÉS VERZIÓINFORMÁCIÓK HOZZÁADÁSA ........................................... 23
FELHASZNÁLÓI KÉZIKÖNYV ............................................................................................ 25 5.1 5.2 5.3
6
A PROBLÉMA ........................................................................................................................ 6 KÖVETELMÉNYEK ÖSSZEGYŰJTÉSE ....................................................................................... 6 GRAFIKUS FELÜLET TERVEZÉSE ............................................................................................ 6 PROGRAMOZÓI REFERENCIA.................................................................................................. 7 Az alkalmazás osztályai QRGUI névtér ............................................................................ 7 A QRGenerator könyvtár osztályai QRGenerator névtér .................................................. 7 TESZTELÉS ......................................................................................................................... 11 A felhasználói szoftver tesztelési terve és eredményei ..................................................... 12
QR-KÓD LÉTREHOZÁSÁNAK FOLYAMATA ................................................................... 14 4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.3 4.4 4.5 4.6 4.7
5
C# ÉS A .NET KERETRENDSZER ............................................................................................. 4 VISUAL STUDIO .................................................................................................................... 4
FEJLESZTŐI DOKUMENTÁCIÓ ............................................................................................ 6 3.1 3.2 3.3 3.4 3.4.1 3.4.2 3.5 3.5.1
4
MOTIVÁCIÓ .......................................................................................................................... 3 A QR KÓDOKRÓL RÖVIDEN ................................................................................................... 3
TEENDŐK A PROGRAM INDÍTÁSÁT MEGELŐZŐEN .................................................................. 25 A PROGRAM INDÍTÁSA ........................................................................................................ 25 AZ ABLAK VEZÉRLŐELEMEI ÉS AZOK FUNKCIÓI .................................................................... 26
ÖSSZEGZÉS............................................................................................................................. 30
FÜGGELÉK ....................................................................................................................................... 31 IRODALOMJEGYZÉK .................................................................................................................... 38
2
1 Bevezetés 1.1 Motiváció Napjainkban az okos telefonok megjelenésével szinte egyidejűleg kezdtek igen nagy térhódításba a kétdimenziós vonalkódok, az úgynevezett QR-kódok. Egyes helyeken már kezdi átvenni a régi vonalkódok helyét, köszönhetően a rugalmasságának, valamint annak, hogy a régi vonalkódokkal ellentétben ezeken nem csak egy számsor, hanem annál jóval nagyobb mennyiségű adat tárolható. Dolgozatom témájául azért választottam egy QR-kód készítő alkalmazás elkészítését, mert bár igen sok ilyen kódokat előállító ilyen alkalmazás létezik, de olyanok, amelyek lehetővé teszik a kód nagyobb fokú testre szabását, azáltal, hogy verziószám megadásával nagyobb felületű képet állíthassunk elő, vagy az elkészült kódot szerkeszthessük csak fizetős formában léteznek. Dolgozatom célja, egy ilyen kódokat előállító, és szerkesztő alkalmazás elkészítése, valamint a kódolási és adattárolási eljárások alapjainak bemutatása.
1.2 A QR kódokról röviden A QR-kódot, ami lényegében kétdimenziós vonalkód, a japán Denso-Wave cég fejlesztette ki 1994-ben. Neve az angol Quick Response kifejezésből ered, mely utal a kód gyors leolvasási sebességére. Japánban JIS szabványként is bejegyeztették 1994ben, majd 1999-ben ISO/IEC szabványként is elfogadták. Mindamellett, hogy gyors leolvasási lehetőséget tesz lehetővé, a hibatűrő képessége is igen magas, így még a kép viszonylag nagyarányú sérülése esetén is visszanyerhetőek belőle az adatok. A sarkokban elhelyezett pozícionáló négyzetek, valamint a kód belsejében található viszonyítási pontok azt is lehetővé teszik, hogy a különböző szögből, elforgatva, esetleg döntve fényképezett kód is olvasható maradjon. Ezáltal akár hengeres alakú testeken, például bögrék oldalán elhelyezett kódok leolvasása is lehetségessé válik.
3
2 Felhasznált technológiák 2.1 C# és a .NET keretrendszer A C# egy objektum-orientált nyelv, melyet a Microsoft© cég fejlesztett ki. Alapjául a Java, valamint a C++ nyelv szolgált. Külön érdekesség, hogy a Java fejlesztői beperelték a Microsoftot emiatt, mivel sok részt felhasználtak a Java nyelv funkciói közül. Ennek hatására kezdett a cég a .NET keretrendszer fejlesztésébe, amelyhez aztán kiadtak a C# nyelv mellé, mint függvény, és típuskönyvtárat. Ezek a Windows® operációs rendszerek legtöbb funkciójához támogatást nyújtanak, így egyszerűbbé válik annak programozása. A nyelv egyik fő előnye, hogy gyors fejlesztést biztosít, valamint a szemétgyűjtés alkalmazása, amely biztosítja a dinamikusan lefoglalt memória felszabadítását, szemben a C++ nyelvvel, ahol a dinamikusan foglalt területek szabaddá tételéről a programozónak kellett gondoskodnia. További előnyei köré tartozik az úgynevezett kódrégiók létrehozásának lehetősége, amely segítségével a programkód strukturálható, így átláthatóbbá válik a kód. Mindezek mellett van egy kis hátránya a nyelv használatának, mégpedig a C++ nyelvből jól ismert mutatók, így a memóriához való szabad hozzáférés, amely a C# nyelvnél csak az úgynevezett unsafe kontextusban érhető el, és jóval nehézkesebb az adatok ilyen módú kezelése a C++ nyelvvel ellentétben. Bár itt meg kell jegyezzük, hogy sokak szerint ez előny, ugyanis biztonságosabb módon lehet programot írni, viszont aki azelőtt C stílusú nyelvet használt támadhat olyan érzése emiatt, mintha megkötötték volna a kezét.
2.2 Visual Studio A teljes szoftver C# nyelven, a .NET keretrendszer 2.0 verziójának használatával készült Visual Studio fejlesztői környezettel. A Visual Studio szintén Microsoft© termék, sokak szerint az egyik legjobb, viszont ugyanakkor legdrágább fejlesztői környezet Windows® operációs rendszerekhez. Az újabb verziók már több nyelvet is támogatnak C#, F#, C++, VisualBasic. Emellett sok programozást segítő funkcióval rendelkezik, úgy mint a grafikus felülettervező, grafikus adatbázis tervező, melyek igen hasznosak grafikus alkalmazások fejlesztésénél.
Hibakeresési funkciói között
megtalálható az úgynevezett kivételkezelő modul, amely a program tesztelése során
4
biztosítja azt, hogy automatikusan töréspontot helyez el azoknál a kivételeknél, amelyek nincsenek kezelve a programozó által, így könnyebben felderíthetőek a program hibái a hibakeresés során.
5
3 Fejlesztői dokumentáció 3.1 A probléma A jelenleg forgalomban lévő QR-kód készítő alkalmazásoknál legtöbb esetben nem változtathatóak bizonyos paraméterek, így a követelmények között elsődleges szempont ennek a lehetővé tétele volt. Ezen kívül fontos szerepet kapott annak lehetősége, hogy az előállított képre esetleg olyan mintát lehessen felvinni, amely a megjelenése alapján árulkodhat a tartalomról.
3.2 Követelmények összegyűjtése Mint minden program megírásánál, itt is a szoftverrel kapcsolatos követelmények összegyűjtésével kezdődik a fejlesztés. Itt tisztázásra kerül, hogy a szoftver milyen követelményeknek kell megfeleljen, milyen funkciókkal rendelkezzen, valamint az, hogy milyen előfeltételei vannak, vagy lehetnek a szoftver futtatásának (internet elérés, adatbázis szerver kapcsolat, egyéb szoftverek megléte a felhasználói számítógépen). Jelen esetben felhasználói programról lévén szó, a legfontosabb követelmény egy felhasználói felület kialakítása, melyen keresztül a felhasználó kommunikálhat a programmal. Másik fő szempontom egy olyan szoftver készítése volt, amely biztosítja a továbbfejleszthetőséget, valamint azt, hogy egyéb grafikus felület is készíthető legyen a programhoz. Ezért a szoftver külön tartalmazza a felhasználói felületet, és azt az osztálykönyvtárat, amely a QR-kódok előállítását biztosítja. A szoftvertervezésénél fő szempontok: szabványos QR-kód előállítása szabványtól eltérő kód előállításának lehetősége paraméterek beállításával egyszerű kezelőfelület felhasználó számára
3.3 Grafikus felület tervezése A program jelenleg csak grafikus felhasználói felületen keresztül irányítható. Ennek megtervezésénél törekedtem az egyszerű kialakításra, annak érdekében, hogy olyan felhasználó is elboldoguljon annak használatával, aki esetleg nem olvasta a felhasználói dokumentációt.
6
Egy ilyen felület megtervezésének legfőbb szempontja, hogy a praktikusságot a díszes kinézet elé soroljuk, de azért nem hátrány az sem, ha a program felülete kellemes hatást kelt felhasználójában.
3.4 Programozói referencia Ez a fejezetrész tartalmazza a kódolás során használt osztályokat, azok metódusait, valamint egy rövid leírást a felhasználásuk módjáról. Magát a kódolás menetét, valamint részletesebb leírást az alkalmazott módszerekről, a QR-kód előállításának menetéről a negyedik fejezet tartalmaz.
3.4.1 Az alkalmazás osztályai QRGUI névtér Ebben a névtérben található a felhasználói felületként szolgáló két osztály. Mindkettő a System.Windows.Forms.Form osztályból származtatott osztály, így tagjai megegyeznek annak öröklött tagjaival.
3.4.1.1 MainForm osztály Ez az osztály biztosítja a felhasználóval való kommunikációt. Felületén kaptak helyet a kód létrehozásához, módosításához, valamint az előállított kép mentéséhez szükséges vezérlőelemek. Emellett információt szolgáltat magáról az előállított a kódról is, úgy mint verziószám, kód mérete modulokban, valamint a beállított MaskPattern értékről.
3.4.1.2 PictureForm osztály A MainForm osztály által használt segédosztály, mely a generált képet jeleníti meg teljes méretben. A megjelenítés a PictureForm.Show(System.Drawing.Image) statikus metódus hívásával lehetséges, melynek paramétere a megjeleníteni kívánt kép Privát konstruktora miatt önmagában nem használható.
3.4.2 A QRGenerator könyvtár osztályai QRGenerator névtér
3.4.2.1 ECLevel felsorolás Ebben a felsorolásban vannak rögzítve a QR-kódhoz tartozó hibajavító képességek, ami azt jelöli, hogy az adott kód milyen mértékű sérülés esetén olvasható vissza biztonságosan. Ezek a következők lehetnek:
7
L. Megközelítőleg 7% hibát képes javítani M. Megközelítőleg 15% hibát képes javítani Q. Megközelítőleg 25% hibát képes javítani H. Megközelítőleg 30% hibát képes javítani
3.4.2.2 QRVersion felsorolás A kód verziószámát adja meg. Ez egytől negyvenig terjedhet. Ez határozza meg, hogy az adott kódon milyen méretű adat tárolható, valamint azt, hogy mekkora lesz a keletkezett kód mérete. Verziótól, hibajavító képességtől, és tárolási módtól függően különböző mennyiségű adat tárolható az adott QR-kóddal. Az adott verzióval tárolható adatok mennyiségét a függelék 1. táblázata tartalmazza.
3.4.2.3 MaskPattern felsorolás A kódmátrix létrehozása után egy úgynevezett maszk kerül rá. Tehát a kódmátrix adatot tartalmazó bitjeit át kell billenteni aszerint, hogy milyen maszkot alkalmaztunk. Ezután a kódmátrix teljes területére nézve úgynevezett büntetőpontokat számolunk, és a legkisebb büntetőponttal rendelkező mátrixból válik majd a végleges QR-kód. Ezek alkalmazásáról, illetve az eljárás menetéről részletesebb leírást a 4. fejezet tartalmaz. Elemei : Pattern_0 - Pattern_7
3.4.2.4 QRMode felsorolás A kódolási módot határozza meg. Elemei:
Numeric - a kódolandó adat csak számokat tartalmazhat.
Alphanumeric - a kódolandó adat tartalmazhat számokat, nagybetűket, valamint a következő karaktereket: <SPACE>,$,%,*,+,-,.,/,:
Byte - bájt mód. Ebben az esetben az adat tárolása egy bát tömbként történik.
ECI - Extended Channel Interpretation. Lehetővé teszi különböző nemzetközi karakterkészletek használatát, és annak QR-kódban történő kódolását. Jelenlegi verzióban nem támogatott. A kódolandó adat, amennyiben nemzetközi karaktereket tartalmaz, az Byte módban kerül tárolásra.
Kanji - Az adat a japán Kanji karakterkészleten alapuló karaktereket tartalmazhatja. A szoftver jelenlegi verziójában nem támogatott. 8
Terminator - Az adatblokk végét jelölő bitsorozat.
Structured_Append - A QR-kód támogatja azt a lehetőséget, hogy több kép tartalmaz egy hosszabb adatot. Ez azt jelenti, hogy több kép tartalmaz egy hosszabb adatot, és ezek a képek ez esetben csak együtt dekódolhatóak. A szoftver jelenlegi verziójában ez a lehetőség nem támogatott.
3.4.2.5 QRCode osztály Ebben az osztályban valósítottam meg a bevitt adat szabványos kódolását. Az osztály emellett támogatja a létrehozott kép bizonyos fokú szerkesztését, valamint a szabványtól való eltérő alkalmazást.
Az osztály tagjai: public QRCode(byte pixelsize, QRGenerator.ECLevel level, string code) A QRCode osztály konstruktora. A megadott paraméterekkel rendelkező QRCode osztály egy példányát hozza létre. Paraméterei :pixelsize: modulméret pixelben level: Hibajavító képesség code: A kódolandó adat public void ClearMaskedImage() – A háttérkép eltávolítása a kódról public void OnPictureChanged() – A PictureChanged esemény kiváltása public System.Drawing.Color BackColor – Háttér, színének, azaz a világos modulok színének lekérdezése. Ez az érték nem módosítható. (Fehér) public System.Drawing.Bitmap Bitmap – Az aktuális kódhoz tartozó kép lekérdezése. Ez az érték nem módosítható public byte BorderSize – A kód keretméretének lekérdezése, vagy beállítása modulokban megadva. Ez az érték a QR-kód szabványának megfelelően legalább 4 kell legyen. public QRGenerator.ECLevel ECLevel – A kód hibajavító képességének lekérdezése, vagy beállítása public System.Drawing.Color ForeColor – Az előtér, azaz a sötét modulok színének lekérdezése, vagy beállítása. Itt nincs kikötés arra vonatkozóan, hogy milyen érték használható, viszont a háttér, azaz a fehér színtől minél sötétebb
9
kell legyen. Egyes olvasó alkalmazások képesek kis eltérést is észlelni, ugyanakkor számolni kell azzal, hogy esetleg rossz minőségű fényképezés, vagy nyomtatás esetén ilyen esetben használhatatlanná válik a létrehozott kép. public bool IsValid – A létrehozott kód érvényességének lekérdezése. Hamis, ha az adott paraméterekkel nem sikeres a kód létrehozása. Ez akkor történhet meg, ha már tartalmaz adatot a kód, és ez után változtatjuk meg annak Version, vagy ECLevel tulajdonságát. Ekkor a létrehozott kép az "ERROR" karakterláncnak megfelelő QR-kód piros előtérszínnel. public byte Luminance – A maszkként beállított kép legnagyobb megengedett fényerősség értékének lekérdezése, vagy beállítása. Mivel a maszknak megadott kép bármilyen kép lehet, és esetleg tartalmazhat túl világos színeket, ezért azokat meg kell változtatni. Annak érdekében, hogy a beállított kép vizuálisan ne torzuljon túl nagymértékben ez az érték a teljes képre alkalmazásra kerül. Minél nagyobb ez az érték, annál közelebb áll az eredeti kép színeihez a létrehozott kép, viszont ez a kód minőségének romlásához vezethet. public System.Drawing.Bitmap MaskImage – Az előtér kép lekérdezése, vagy beállítása. A képet, mint maszkot a keletkezett QR-kód képére teszi olyan módon, hogy a kódban a fehér területeket változatlanul hagyja, és a sötét területek színét pedig a maszk képnek megfelelően változtatja meg. Amennyiben a kép nem négyzet alakú, vagy kisebb esetleg nagyobb a generált QR-kód képénél, úgy nyújtással átméretezésre kerül. Ezért célszerű olyan képet megadni háttérkén, amely négyzetes, és mérete eléri a generált kép méretének az 50%-át a torzulás elkerülése érdekében. public QRGenerator.MaskPattern MaskPattern – Az alkalmazott minta számának lekérdezése, vagy beállítása. Ez a kódoláskor automatikusan beállításra kerül, de az ettől való eltérés esetén olvashatatlan kód keletkezhet. Ennek alkalmazásáról, valamint a szabvány értéktől való eltérés lehetőségeiről részletesebb leírást tartalmaz a 4. fejezet. public
int
MaximumAlphaNumChars
–
Az
adott
kódban
tárolható
alfanumerikus (csak nagybetűk és számok) karakterek maximális számának lekérdezése.
10
public int MaximumByteCharacters – Az adott kódban tárolható Byte módú karakterek maximális számának lekérdezése. public int MaximumKanjiCharacters – Az adott kódban tárolható Kanji karakterek maximális számának lekérdezése. public int MaximumNumbers – Az adott kódban tárolható numerikus karakterek maximális számának lekérdezése. public QRGenerator.QRMode Mode – Az adattárolás módjának lekérdezése. Az adat megadásakor automatikusan kerül megállapításra. Jelenleg csak Numeric, Alphanumeric, vagy Byte módok támogatottak. public byte PixelSize – A generált kép blokkjainak mérete pixelben. Az érték írható, és olvasható. public string Text A kódolandó / kódolt adat beállítása, vagy lekérdezése. public QRGenerator.QRVersion Version A kód verziószámának lekérdezése, vagy beállítása public int Width – A kód szélességének lekérdezése (modulokban megadva) public event QRGenerator.PictureChangedEventHandler PictureChanged – A generált kép változásakor, vagy az OnPictureChanged() metódus meghívásakor bekövetkező esemény. Ez az esemény természetesen kiváltódik a verziószám, hibajavító képesség, MaskPattern érték megváltoztatásakor, tehát minden olyan módosítás után, amely a kód képének változását eredményezi.
3.5 Tesztelés A tesztelés folyamata egy minőségkezelés, amely ellenőrzi, hogy a program a kitűzött célnak megfelelően működik-e, valamint felderíti a program esetleges hibáit. A tesztelés ellenőrzött körülmények között történik, ezután a tesztelés során feltárt hibák kijavítására kerül sor. A tesztelés során szándékosan adunk meg a programnak nem megfelelő adatot, annak kiderítése érdekében, hogy a program az elvárásoknak megfelelően kezeli-e ezeket az eseteket.
11
3.5.1 A felhasználói szoftver tesztelési terve és eredményei Az alábbi táblázatok tartalmazzák a szoftver tesztelési tervét, annak követelményeit, illetve a teszt eredményeit. A követelmény mező a felhasználói dokumentációra való hivatkozással van kitöltve. Ezen fejezetrészek tartalmazzák a felhasználásra vonatkozó követelményeket. Ezek mellett természetesen minden esetben elvárás az, hogy a funkció normálisan befejeződjön, programhiba ne történjen. Sorszám Funkció
1 Kódolás funkció tesztelése karakterlánc megadásával 5.3/1 Nem történt hiba
Követelmény Teszt eredménye Sorszám Funkció Követelmény Teszt eredménye
2 Kódolás funkció tesztelése üres karakterlánccal 5.3/1 Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
4 Keret méretének megváltoztatása 5.3/3 Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
5 Blokkméret megváltoztatása 5.3/4 Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
6 Fényerősség változtatása beállított háttérképpel, illetve háttérkép nélkül 5.3/5 Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
7 Maszk minta megváltoztatása 5.3/6 Nem történt hiba
12
Sorszám Funkció Követelmény Teszt eredménye
8 Hibajavító képesség értékének megváltoztatása hibás, és jó adatok megadásával 5.3/7 Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
9 Hibás, illetve jó verziószám beállítása 5.3/8 Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
10 Kép megjelenítése 5.3/10a Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
11 Különböző képek beállítása előtérként 5.3/10b Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
12 Előtér törlése 5.3/10c Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
13 Előtér színének változtatása nem megengedett, illetve figyelmeztetést eredményező értékekre 5.3/10d Nem történt hiba
Sorszám Funkció Követelmény Teszt eredménye
14 Kép mentése különböző formátumokban 5.3/10e Nem történt hiba
13
4 QR-kód létrehozásának folyamata 4.1 Adatelemzés Első lépésként a kódolandó adat kerül elemzésre aszerint, hogy milyen karaktereket tartalmaz az adat. A QR-kód több féle módot támogat, ezek közül a négy alapvető módot különböztethetünk meg: Numerikus Alfanumerikus Byte Kanji Ez után kerül meghatározásra az, hogy melyik az a minimális verziójú kód, amely képes tárolni a megadott hosszúságú adatot az adott hibajavító képességgel. Ezeket az értékeket a függelékben lévő 1. táblázat tartalmazza.
4.2 Adat kódolása bitsorozattá Második lépés az adat bitsorozattá alakítása. Ez az adatelemzés résznél leírt módoktól függően történik. Minden kódolási módhoz tartozik egy 4 bitből álló sorozat, ami jelzi, hogy az adat milyen módban van kódolva. A kódolt adat a következő blokkból áll elő: ADATBLOKK: [kódolási mód (4 bit)][karakterek száma1][adatbitek][lezáró bitek 2]. Ha az így keletkezett adat bitjeinek száma nem osztható nyolccal, akkor annyi 0 értékű bit kerül a végére, hogy az így keletkezett bitsorozat hossza nyolccal osztható legyen. Legvégül, ha az így keletkezett bitsorozat hossza még mindig nem éri el a tárolható maximális bitek számát, akkor a végére felváltva a 11101100 és a 00010001 bitsorozatok kerülnek. Ezzel az adatot előkészítettük a következő lépéshez, ahol kiszámolásra kerülnek a hibajavító bitek, és előáll a végleges bitsorozat a QR-kód előállításához. Ezen felül támogatott még az úgynevezett összetett mód, amikor több, a fenti módon megadott ADATBLOKK követi egymást. Ez lerövidítheti az eredeti adatból generált bitek számát, mivel numerikus, vagy alfanumerikus értékek jóval kevesebb bithosszon
1
A karakterek számának bithosszát az 1. táblázat tartalmazza Ha a bitsorozat nem tölti ki a verzió által megengedett teljes hosszt, akkor 4 bit (0) kerül a végére. Ezek az úgynevezett lezáró bitek. Amennyiben a megengedett hossz miatt 4-nél kevesebb bitnek marad hely, úgy csak annyi lezáró bit kerül az adat végére. 2
14
ábrázolhatóak. Annak eldöntése, hogy érdemes-e különböző kódolási módokat alkalmazni egy kódon belül a méret csökkentése érdekében további adatelemzés eredménye lehet. Ebben az esetben az összefűzött ADATBLOKK-ok végére kerülnek azok a kiegészítő 0 bitek, amelyek arról gondoskodnak, hogy a végső bitsorozat hossza 8 többszöröse legyen, és ennek végére pedig felváltva a fentebb említett 8 bit hosszú láncok, amelyek teljes hosszra egészítik ki a generált kódot. A következő, kódolási eljárásokat leíró alfejezetek címének végén szerepelnek az adott módhoz tartozó bitsorozatok, és leírást adnak az adott módba való kódolás folyamatáról. 1. táblázat - karakterszámot tároló bitek száma Bitek száma Verzió
Numerikus mód
Alfanumerikus
Byte mód
Kanji mód
mód 1-9
10
9
8
8
10-26
12
11
16
10
27-40
14
13
16
12
4.2.1 Numerikus mód: 0001 A kódolandó adat: 1357911 1. Az adatot feldaraboljuk 3 számjegyű csoportokra: 135 791 1 2. A kapott csoportokat bináris formában ábrázoljuk 10 biten, kivétel ez alól az utolsó csoport, amennyiben a hossza nem 3 számjegy. Ezt 4 biten ábrázoljuk, ha 1 jegyű, és 7 biten, ha 2 jegyből áll. 1357911 0010000111 1100010111 0001 3. A karakterek számát az 1. táblázat alapján a verziónak megfelelő bithosszon ábrázoljuk, legyen ez esetünkben 12 bit. 7 000000000111 Majd az így kapott bitsorozat mögé fűzzük az adatot. 4. Ezután a fenti bitsorozatot, a módjelző bitek mögé fűzzük, ebből áll elő a végleges adat: 0001 000000000111 0010000111 1100010111 0001
15
2. táblázat - Alfanumerikus karakterek kódjai Karakter
Érték
Karakter
Érték
Karakter
Érték
Karakter
Érték
Karakter
Érték
0
0
9
9
I
18
R
27
<SPACE>
36
1
1
A
10
J
19
S
28
$
37
2
2
B
11
K
20
T
29
%
38
3
3
C
12
L
21
U
30
*
39
4
4
D
13
M
22
V
31
+
40
5
5
E
14
N
23
W
32
-
41
6
6
F
15
O
24
X
33
.
42
7
7
G
16
P
25
Y
34
/
43
8
8
H
17
Q
26
Z
35
:
44
4.2.2 Alfanumerikus mód: 0010 A kódolandó adat: ABC-123 1. Meghatározzuk a karakter kódjának megfelelő számokat a 2. táblázat alapján: ABC-123 (10,11) (12,41) (1,2) (3) 2. Ezután kettes csoportokra bontva a számokat meghatározzuk a hozzájuk tartozó értékeket a következő formulával: (a,b) 45 * a + b. A kapott eredményt 11 biten ábrázoljuk. Amennyiben az utolsó csoportba csak egy szám kerül, úgy az eredmény maga a szám lesz, és 6 biten kerül ábrázolásra. 3. (10,11) 461 00111001101 4. (12,41) 581 01001000101 5. (1,2) 47 00000101111 6. (3) 3 000011 7. ABC-123 00111001101 01001000101 00000101111 000011 8. Karakterek száma: 7 00000000111 (11 biten ábrázolva) 9. Ezután meghatározzuk a hosszt tároló biteket, majd a módot jelző bitekkel együtt a fentihez hasonló módon a kódolt adatot felfűzzük ezen sorozat után. 10. A végleges bitsorozatunk tehát: 0010 00000000111 00111001101 01001000101 00000101111 000011
16
4.2.3 Byte mód: 0100 Ennél a módnál az adatként megadott karaktersorozat minden karaktere a JIS8 japán karakterkészlet szerint kerül kódolásra bináris reprezentációban 8 biten. Ez a karaktertábla a 7FHEX kódú karakterig megegyezik a szabványos ASCII kódtáblával. Az ASCII karaktereket a 3. táblázat tartalmazza. Az így kapott bitsorozatból az előzőekhez hasonló módon állítható elő a végleges adat a mód jelző 4 bit, és a karakterek számát jelző 1. táblázatnak megfelelő hosszúságú bitsorozat összefűzésével. A kódolandó adat: kutya A 3. táblázat alapján a fenti adatnak megfelelő bitsorozat a teljesség igénye nélkül tehát: 01101011 01110101 01110100 01111001 01100001 A karakterek száma: 5 00000101 (8 biten ábrázolva) A keletkező bitsorozat a mód jelző, és a hossz bitek hozzáadása után: 0100 00000101 01101011 01110101 01110100 01111001 01100001 3. táblázat - ASCII karaktertábla [6]
4.2.4 Kanji mód: 1000 Ez a kódolási mód a Shift JIS két bájtos karakterkódolási rendszeren alapul. Ennél a módnál a karakterek 13 biten vannak tárolva, az egyes karakterekhez tartozó 13 bit a következőképpen számolható:
17
Ha a karakter Shift JIS szerinti kódja 8140HEX és 9FFCHEX érték közé esik 1. Az adott karakterhez tartozó Shift JIS kód hexadecimális értékéből kivonjuk a 8140HEX értéket 2. A kapott érték felső bájtját megszorozzuk a C0HEX értékkel 3. A fenti eredményhez hozzáadjuk a kivonásnál keletkezett érték alsó bájtját 4. A végeredményből képezzük a 13 bit hosszúságú kódolt adatot Ha a karakter Shift JIS szerinti kódja E040HEX és EBBFHEX érték közé esik: 1. Az adott karakterhez tartozó Shift JIS kód hexadecimális értékéből kivonjuk a C140HEX értéket 2. A kapott érték felső bájtját megszorozzuk a C0HEX értékkel 3. A fenti eredményhez hozzáadjuk a kivonásnál keletkezett érték alsó bájtját 4. A végeredményből képezzük a 13 bit hosszúságú kódolt adatot Az alábbi két példa a két eljárást szemlélteti a 9092(崇) és az E054(澣) kódú karakterekre
崇
澣
9092HEX
E054HEX
Karakter Karakter Shift JIS szerinti kódja 1. lépés
9092HEX - 8140HEX = 0F52HEX
E054HEX - C140HEX = 1F14HEX
2. lépés
0FHEX * C0HEX = 0B40HEX
1FHEX * C0HEX = 1740HEX
3. lépés
0B40HEX + 0052HEX = 0B92HEX
1740HEX + 0014HEX = 1754HEX
4. lépés
0B92HEX = 0101110010010b
1754HEX = 1011101010100b
Befejezésképpen a kódolt adat elé kerülnek a karakterek számát jelző (ld. 1. táblázat), és a módjelző bitek. Ebben az esetben a karakterek száma 2, így a hosszt jelző bitsorozat 8 biten ábrázolva: 00000010. Hozzáadva a módjelző biteket, majd a két karakternek megfelelő adatot a végső bitkódunk: 1000 00000010 0101110010010 1011101010100
4.3 Hibajavító kód létrehozása Az előző lépésben létrehozott bináris sorozatot a ISO/IEC 18004:2000 szabvány 13-22 táblázata alapján megfelelő számú kódszóra bontjuk, így megkapjuk a 8 bit hosszúságú kódszavakat, amelyekhez kiszámoljuk a hozzá tartozó Reed-Solomon hibajavító kódot. A hibajavító kódot a kódszavakból alkotott GF(28) feletti, f(x) polinom és ugyanazon test feletti generátor-polinom osztási maradéka adja. A generátor-polinomok foka megegyezik az ISO/IEC 18004:2000 13-22 táblázatból
18
n 1
kiolvasott hibajavító kódszavak számával. A generátor-polinom a
( x 2)
k
képlettel
k 0
állítható elő, ahol n a polinom foka A GF(28) pedig az x8+x4+x3+x2+1 (az ennek megfelelő bitsorozat: 100011101) primitív elem által generált Galois-test. Az f(x) polinomot a kódszavakból úgy képezzük, hogy a polinom fokszáma a kódszavak számának és a hibajavító kódszavak számának összege, és a legnagyobb fokszámú tag együtthatótól kezdődően a kódszavak az együtthatói. Ezen test egy primitív eleme α, további elemei pedig annak hatványai. Minden hatványnak megfeleltethető egy egész érték, amelyet a következő algoritmussal számolhatunk ki: (A kód C# nyelven íródott) int x= 1; byte[] exp = new byte[255]; for (int i = 0; i < 256; i++) { exp[i] = (byte)x; x <<= 1; if (x >= 0x100) { x ^= primitive; } } Az algoritmus végén az exp 256 elemű tömb i. eleme az α i. hatványa lesz. A fenti hozzárendelt értékek segítségével a test feletti összeadás, illetve kivonás könnyen elvégezhető, ugyanis ez az adott értékekre alkalmazott bináris XOR művelet. Legyen például a kódolandó adatunk, a hibajavító kódszavak száma pedig 17: 000100000000110001111011000000001110110000010001111011000001000111101100 Ez kódszavakra bontva:
16, 12, 123, 0, 236, 17, 236, 17, 236 ebből kapjuk az f(x) polinomot. f(x) = α4x25+α27x24+α172x23+α122x21+α100x20+α122x19+α100x18+α122x17 g(x) = x17+α43x16+α139x15+α206x14+α78x13+α43x12+α239x11+α123x10+α206x9+α214x8+ α147x7+α24x6+α99x5+α150x4+α39x3+α243x2+α163x+α136 Az osztási maradék pedig: R(x) = α77x16+α229x15+α149x14+α182x13+α123x12+α51x11+α44x10+α162x9+α243x8+α25x7+ α165x6+α6x5+α153x4+α86x3+α186x2+α74x+α88
19
Ezután visszafejtve αn értékeit a hibajavító kódszavak: 60, 122, 164, 98, 197, 10, 238, 191, 125, 3, 145, 64, 146, 177, 110, 137, 25
4.4 A végső adatok sorba rendezése Következő lépésként az eredményül kapott kódszavakat táblázatba rendezzük a következő módon, az ISO/IEC 18004:2000 13-22 táblázatának adatai alapján. Legyen a kód verziója 7, hibajavító képessége H Ekkor a kódszavak száma 66 (K1, K2…), a hibajavító kódszavak száma pedig 130. (H1, H2, …), a blokkok száma pedig 5. Így minden blokkba a hibajavító kódszavak száma / blokkok száma kódszó kerül (ez minden esetben kitölti a teljes blokkot), az adatot tartalmazó kódszavak pedig ugyanolyan módon kerülnek elhelyezésre annyi különbséggel, hogy amennyiben vannak olyan blokkok, amelyeket nem töltenek ki teljesen kódszavak, akkor azok a táblázat végére kerülnek, és az utolsó helyeken lévő blokkok lesznek teljesen feltöltve. Blokk 1
K1
…
K13
H1
…
H26
Blokk 2
K14
…
K26
H27
…
H52
Blokk 2
K27
…
K39
H53
…
H78
Blokk 4
K40
…
K52
H79
…
H104
Blokk5
K53
…
K65
H105
…
H130
K66
Az így megalkotott táblázatból oszlopfolytonosan kiolvasva, és sorba rendezve az adatokat, majd a hibajavító kódszavakat kapjuk meg a végleges kódsorozatot, amit elhelyezünk a kódmátrixon. A fenti példa alapján a sorrend tehát: K1, K14…K2, K15…K66, H1, H27…H105, H2, H28…H130.
4.5 A kódot tartalmazó mátrix felépítése A fenti módszerrel átalakított kódszavakat bináris alakban tároljuk a kódmátrixon. Minden egyes kódszó 8 bitje első elérhető helyre kerül egy 4x2 méretű blokkba. Az elhelyezést a mátrixon a bal alsó sarokban lévő modultól kezdjük felfelé haladva, majd ha elértük a mátrix tetejét/alját, akkor visszafelé haladva folytatjuk tovább az eljárást (1. ábra). Az egyes bitek elhelyezése a blokkokba a következőképpen történik: Felfelé haladva
Lefelé haladva
0
1
6
7
2
3
4
5
4
5
2
3
6
7
0
1
20
Mint ahogyan az 1. ábrán látható, előfordulhat, hogy olyan helyre kellene bitet elhelyeznünk, amely terület foglalt. Ekkor a következő szabad területre helyezzük el a soron következő bitet, természetesen ekkor a blokkok formája az ábrán látható módon átalakulhat. Az ábrán látható, utolsó fehér adatblokk szabad biteket jelöl, ugyanis egyes verzióknál nem kerül kitöltésre a teljes adatterület. Ezek az úgynevezett maradékbitek, és értékük 0 lesz.
1. ábra
4.6 Maszk alkalmazása A kódmátrix felépítése után az adatot tartalmazó részre egy maszk kerül, az utolsó, esetleg maradékbiteket tartalmazó blokkot is beleértve (2 a,b,c ábra). Ez a maszk értékek, és a kódmátrixon lévő modul (i, j) pozíciója alapján a következő feltételekkel történik: 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 3 + (i+j) mod 2) mod 2 = 0
21
Amennyiben az alkalmazott maszkra, és pozícióra vonatkozó feltétel teljesül, úgy az aktuális bitet át kell billenteni.
2.a. ábra
2.b ábra
2.c ábra -
a) a kód minta alkalmazása nélkül, b) az alkalmazott minta c) a kész kód
3. ábra (Az alkalmazott minták) Minden egyes minta alkalmazása után ki kell számolni a keletkezett kódhoz tartozó büntetőpontokat, majd kiválasztani ezek közül a legalacsonyabb pontszámmal rendelkezőt, és ez lesz majd a végleges kódmátrix. A büntetőpontok 4 részből tevődnek össze, és a kódmátrix teljes területén kell alkalmazni. A büntetőpontok számolása:
Sorban, vagy oszlopban előforduló azonos színű modulok száma 5+i–3 + i pont
mxn méretű blokk előfordulása azonos színnel – 3 * (m - 1) * (n - 1) pont
1100011 minta elfordulása sorban, vagy oszlopban – 40 pont
Sötét modulok száma a teljes területen 50±(5+k)% - 50±(5+(k+1)) % – 10 * k pont
22
4.7 Hibajavító képesség, és verzióinformációk hozzáadása A kód hibajavító képességének értéke 2 biten van ábrázolva, ehhez fűzzük hozzá az alkalmazott maszk értékének 3 bitjét (ld. 4.6 – A maszk alkalmazása). Az így kapott 5 bithez generáljuk a Bose-Chaudhuri-Hocquenghem (BCH) (15,5) hibajavító biteket, és az így kapott 15 bitet helyezzük el a kódmátrixra A hibajavító képességekhez tartozó bitek: L – 01 M – 00 Q – 11 H – 10 Legyen ez most L hibajavító képességgel rendelkező kód, és 001 minta. Ekkor az 5 adatbitünk 01001. Az ehhez tartozó polinom x3+1. Ezt megszorozzuk x(15-5) – el, aztán elosztjuk a g(x) = x10+x8+x5+x4+x2+x+1 generátor-polinommal. x13+x10 = x3(x7+x5+x2+x)+x2+1 Az osztás maradékából származó polinomhoz tartozó 10 bit tehát 0000000101. Ezután a két bitsorozatot összefűzzük (010010000000101), és XOR műveletet hajtunk végre ezzel az értékkel, és a 101010000010010 bitsorozattal. A kapott eredmény tehát: 111000000010111. Ez az érték kerül a hibajavító képességet, és mintát tartalmazó területre (4. ábra) A verzióinformáció csak a 7-es verziójú kódoktól kezdődően kerül tárolásra, a verziószám 6 biten ábrázolva és a 12 hibajavító bit. A hibajavító bitek a fentihez hasonló módon számolandóak, annyi különbséggel, hogy BCH (18,6) hibajavító kódról lévén szó, a verziószámból előállított polinomot x(18-6) – al szorozzuk, a generátorpolinom pedig x12+x11+x10+x9+x8+x5+x2+1. Az előállított bitsorozatra ez esetben a XOR maszkot sem kell alkalmazni. Végül ez is elhelyezésre kerül a kódmátrix megfelelő területén, (4. ábra, és 4. táblázat) valamint rákerül az úgynevezett timing pattern, a viszonyítási pontokat jelölő modulok, és a pozícionáló modulok. A pozícionáló modulok a kódmátrix bal felső, jobb felső, illetve bal alsó sarkában elhelyezkedő blokkok. Ezek egy 3x3 méretű sötét blokkból, az azt körülvevő 1 szélességű világos, és az ezt körülvevő, szintén 1 szélességű modulból állnak. A viszonyítási pontok a pozícionáló részhez hasonlóan épülnek fel, de ezek középpontja egy, egy modulból álló sötét rész. A viszonyítási pontok pozícióját verziónként a függelék 2. táblázata tartalmazza. Minden verzióhoz adott a viszonyítási pontok száma,
23
és a hozzájuk tartozó koordináta pozíciók A kódterület bal felső sarkában található modul a (0,0) pozíció. Például a 7-es verzióhoz tartozó információk: viszonyítási pontok száma: 6, a hozzá tartozó koordináták pedig 6,22,38. Ezekből a tényleges (sor, oszlop) koordináták a megadott értékekből képezhető rendezett párok: (6,22) (22,6) (22,22) (22,38) (38,22) (38,38) A (6,6) (6,38) és (38,6) pozíciókra viszont nem kerülnek viszonyítási pontok, mivel ezeket a területeket az igazítási pontok foglalják el. 4 táblázat – verzióbitek elhelyezkedése a blokkokban Felső pozíció 0
1
2
3
4
5
6
7
8
9
10
11
0
3
6
9
12
15
12
13
14
1
4
7
10
13
16
15
16
17
2
5
8
11
14
17
Alsó pozíció
4.ábra
24
5 Felhasználói kézikönyv 5.1 Teendők a program indítását megelőzően A program működéséhez a .NET keretrendszer 2.0, vagy magasabb verziója szükséges, mely megtalálható a programot tartalmazó DVD FrameWork könyvtárában, vagy ingyenesen letölthető a Microsoft© honlapjáról. http://www.microsoft.com/download/en/details.aspx?id=1639 Rendszerkövetelmények: Minimális
ajánlott
rendszerkövetelményei
képernyőfelbontás: megegyeznek
a
800x600.
.NET
A
keretrendszer
program 2.0
további
verziójának
követelményeivel. A program működéséhez szükséges továbbá a QRGenerator.dll fájl, melyet a program könyvtárában kell elhelyezni. Szintén megtalálható a programot tartalmazó DVD Program könyvtárában
5.2 A program indítása A program indítása a DVD-n található Program könyvtárában található QRGUI.exe állomány futtatásával történik. Ezután megjelenik a kezelőfelület (1.ábra), amelyen a vezérlőelemek segítségével megadhatóak a kódolás paraméterei, a kódolandó adat és létrehozható a kívánt kód.
1.ábra 25
5.3 Az ablak vezérlőelemei és azok funkciói A program ablaka, valamint annak vezérlőelemei az 1. ábrán láthatóak. A program a következő funkciókkal rendelkezik: 1. Ebbe a szövegmezőbe kerül a kódolandó adat, amelyből aztán a program létrehozza a kívánt paraméterekkel rendelkező QR-kódot. A folyamat kezdése a Kódolás gombra (2) kattintva lehetséges. Amennyiben a szövegmező üres, abban az esetben az „EMPTY STRING” szöveg kerül beállításra. A kódolás megkezdése előtt be kell állítani a kívánt hibajavító képességet (9), a keret méretét (3), valamint a blokkméretet (4). 2. A szövegmezőbe bevitt adat QR-kódjának létrehozása. A kód a 10-es számmal jelölt vezérlőelemben jelenik meg. Mérete a képmező méretéhez van igazítva, teljes méretben való megjelenítése a 2. ábrán található vezérlőelemmel lehetséges. 3. A keret mérete mezőben adható meg a kép keretének mérete blokkokban. Ez a QR-kódot körülvevő fehér keret. Minimális értéke 4, maximális méretként 10 adható meg. Beállítás után a kép automatikusan frissül. 4. A QR-kód sötét, illetve világos színű négyzetekből áll, ezek tartalmazzák a kód bitjeit. Világos (fehér) = 0 sötét (fekete, vagy fehértől eltérő szín) = 1. A blokkméret mezőben állítható be a QR-kód blokkjainak mérete pixelben. Minimális értéke 4, maximum 15 pixel lehet. Beállítása után a kép automatikusan frissítve lesz. 5. A fényerősség beállítására szolgál abban az esetben, amennyiben előtérként valamilyen képet állítottunk be. Itt 0 és 255 közötti értékek adhatóak meg. Bővebb leírást alkalmazásáról a 10b. pontban olvashat. Amennyiben nincs beállított háttérkép az érték megváltoztatása esetén nem történik a kép frissítése, ellenkező esetben megjelenik az új kép az alkalmazott értékkel. 6. A QR-kód készítése után a kódolt adatra egy minta kerül maszkként, ezzel is csökkentve a kód olvasása közben fellépő hibalehetőséget. Az alkalmazott mintákról, valamint azok alkalmazási módszeréről bővebb leírást a 4. fejezet tartalmaz. Az optimális érték megállapítása automatikusan történik, ezen érték változtatása lehetséges, de nem célszerű, elkerülendő egy esetleges hibás kód generálását. Amennyiben a kód e tulajdonságát kívánja megváltoztatni, úgy érdemes a 4. fejezet tanulmányozása, ahol részletes leírás található arról, hogy
26
miként történik az optimális kód kiválasztása, így valószínűsíthető egy keletkezett képről, hogy dekódolható lesz-e. Kis blokkméretű kódoknál a „szemrevételezés” módszere többnyire alkalmazható, a nagyobbak viszont kevésbé átláthatóak. Az érték megváltoztatásával a 10. vezérlőelemen megjelenik az új kép. 7. A hibajavító képesség beállításával adható meg az, hogy a generált kódnak mekkora legyen a hibatűrő képessége. Ez az olvasó alkalmazások számára fontos, ugyanis a kép nyomtatás után esetleg megsérülhet, így az adat visszanyerésének esélye függ ettől az értéktől. Természetesen minél nagyobb ez az érték, annál nagyobb sérülést képes kijavítani az olvasó alkalmazás, viszont ennek arányában csökken az adott verziójú kódban tárolható adat mennyisége is. Amennyiben már létrehoztunk egy kódot, és megváltoztatjuk ezt az értéket, akkor a program automatikusan egy új képet állít elő, és ez jelenik meg a régi kép helyén (10). Itt négyféle érték adható meg: L - ~7% hibát képes javítani M - ~15% hibát képes javítani Q - ~25% hibát képes javítani H - ~30% hibát képes javítani Amennyiben az adat átkódolása a megadott hibajavító képességgel nem lehetséges, úgy az „ERROR” karakterláncot tartalmazó QR-kód kerül előállításra, piros előtér színnel és ez jelenik meg, ha nem történt hiba, akkor az újonnan létrehozott kód képe kerül megjelenítésre. 8. Ezen a vezérlőn állítható be a kód verziószáma. A Kódoláskor ez az érték automatikusan kerül beállításra, azzal a minimális értékkel, amin a megadott kód a kiválasztott hibajavító képességgel kódolva elfér. Ez utólagosan nagyobb verziószámra változtatható, ekkor a program új képet állít elő, és megjeleníti a régi kép
helyén.
Amennyiben alacsonyabb
verziószámot
állítunk
be
előfordulhat, hogy ekkor már a kódolt adat nem tárolható az adott verzió segítségével, ekkor a kép helyén a 8. pontban említett „ERROR” karakterláncot tartalmazó kód jelenik meg, ha nem történt hiba, akkor az újonnan létrehozott kód képe kerül megjelenítésre. 9. Információk a kódról. Verziószám, blokkméret, pixelméret, alkalmazott maszk száma.
27
10. A létrehozott képet tartalmazó vezérlő (2. ábra). A képen jobb egérgombbal kattintva egy helyi menü érhető el, amelyekkel a kép paraméterei állíthatóak be.
2. ábra a) Kép megjelenítése teljes méterben: A generált képet teljes méretben jeleníti meg egy külön ablakban b) Előtér kép beállítása. A kódra ráhelyezhető maszkként egy, a felhasználó által megadott kép. A kép olyan módon kerül a QR-kódra, hogy a kód sötét blokkjai a kép színét veszik fel, a fehér modulok pedig változatlanok maradnak. Elkerülendő, hogy a QR-kód sötét blokkjai túl világosak legyenek azokon a részeken, ahol a maszkként megadott kép világos színű, ott a pixeleinek színét a program megváltoztatja 7. pontban megadott értéknek megfelelően. Annak érdekében, hogy a keletkezett kép ne torzuljon, a program a teljes képre alkalmazza ezt az értéket megfelelő arányban. Minél kisebb ez az érték, a kép annál
28
sötétebb lesz, 0 esetén fekete, és minél nagyobb, a kép színei annál közelebb állnak az eredeti kép színéhez. Ezt az értéket abban az esetben érdemes alkalmazni, amikor a háttérként beállított kép nem tartalmaz túl világos színeket. Amennyiben a beállítani kívánt kép mérete kisebb, vagy nagyobb a QR-kód képének méreténél, vagy nem négyzet alakú akkor nagyítással, vagy zsugorítással kerül alkalmazásra. Ezért célszerű négyzet alakú képet alkalmazni háttérképként. 3a. - 3c. ábrák. Beállítás után megjelenik az így keletkezett kép.
3a. ábra – a QR-kód
3b. ábra – a maszkként alkalmazott kép
3c. ábra – a létrehozott kép maszkkal c) Előtér kép törlése: törli az előtérként beállított képet, és visszaállítja az eredeti előtérszínnel rendelkező képet. d) Előtér színe: egy színválasztó párbeszédablak jelenik meg, ahol kiválasztható a QR-kód sötét moduljainak színe. Bármilyen fehér színtől eltérő szín beállítása megengedett, de amennyiben a szín túlzottan világos a program egy figyelmeztető ablakot jelenít meg a beállítás előtt, ugyanis ezek az értékek olvashatatlan kódot eredményezhetnek. Beállítás után a kód képe frissítésre kerül a kívánt értékkel. e) Kép
mentése:
a
kép
mentése
kiválasztott
formátumban.
Egy
párbeszédpanel jelenik meg, ahol választható, formátumban elmenthető az elkészített kép.
29
6 Összegzés Az elkészített alkalmazás a ISO/IEC 18004:2000 szabványnak megfelelő QRkódok előállítására alkalmas, kibővítve néhány olyan funkcióval, ami megenged bizonyos eltéréseket a szabványtól. A szoftver lehetőséget ad a generált képek bizonyos fokú szerkeszthetőségére, amely alkalmas arra, hogy a felhasználója kicsit közelebbről ismerkedjen meg ilyen lehetőségekkel. A szoftver nem biztosítja a kétdimenziós kódok összes típusának felhasználását, mindazonáltal segítséget nyújt a felhasználók számára a QR-kódokkal való ismerkedésben, és az azokban rejlő lehetőségek kihasználásában. A dolgozat nem tér ki a QR-kódok összes lehetőségére, amelyek a szoftverben sem kerültek megvalósításra, de egy rövid összefoglaló leírást ad azokról a módszerekről, eljárásokról, amelyek segítségével könnyebbé válik a QR-kódoló alkalmazások fejlesztésének „útján” való elindulás. Ezzel leginkább azon fejlesztők érdeklődését kívántam felkelteni a témában, akik még csak most ismerkednek a QRkódok világának rejtelmeivel.
30
Függelék
31
1. táblázat - Maximálisan tárolható karakterek száma [1] Verzió
1
2
3
4
5
6
7
8
9
10
Méret
21x21
25x25
29x29
33x33
37x37
41x41
45x45
49x49
53x53
57x57
Hibajavító képesség
Adat bitek
Numerikus
Alfanumerikus
L
152
41
25
17
10
M
128
34
20
14
8
Q
104
27
16
11
7
H
72
17
10
7
4
L
272
77
47
32
20
M
224
63
38
26
16
Q
176
48
29
20
12
H
128
34
20
14
8
L
440
127
77
53
32
M
352
101
61
42
26
Q
272
77
47
32
20
H
208
58
35
24
15
L
640
187
114
78
48
M
512
149
90
62
38
Q
384
111
67
46
28
H
288
82
50
34
21
L
864
255
154
106
65
M
688
202
122
84
52
Q
496
144
87
60
37
H
368
106
64
44
27
L
1,088
322
195
134
82
M
864
255
154
106
65
Q
608
178
108
74
45
H
480
139
84
58
36
L
1,248
370
224
154
95
M
992
293
178
122
75
Q
704
207
125
86
53
H
528
154
93
64
39
L
1,552
461
279
192
118
M
1,232
365
221
152
93
Q
880
259
157
108
66
H
688
202
122
84
52
L
1,856
552
335
230
141
M
1,456
432
262
180
111
Q
1,056
312
189
130
80
H
800
235
143
98
60
L
2,192
652
395
271
167
M
1,728
513
311
213
131
Q
1,232
364
221
151
93
H
976
288
174
119
74
32
Byte Kanji
1. táblázat - Maximálisan tárolható karakterek száma [1] Verzió
11
12
13
14
15
16
17
18
19
20
Méret
61x61
65x65
69x69
73x73
77x77
81x81
85x85
89x89
93x93
97x97
Hibajavító képesség
Adat bitek
Numerikus
Alfanumerikus
L
2,592
772
468
321
198
M
2,032
604
366
251
155
Q
1,440
427
259
177
109
H
1,120
331
200
137
85
L
2,960
883
535
367
226
M
2,320
691
419
287
177
Q
1,648
489
296
203
125
H
1,264
374
227
155
96
L
3,424
1,022
619
425
262
M
2,672
796
483
331
204
Q
1,952
580
352
241
149
H
1,440
427
259
177
109
L
3,688
1,101
667
458
282
M
2,920
871
528
362
223
Q
2,088
621
376
258
159
H
1,576
468
283
194
120
L
4,184
1,250
758
520
320
M
3,320
991
600
412
254
Q
2,360
703
426
292
180
H
1,784
530
321
220
136
L
4,712
1,408
854
586
361
M
3,624
1,082
656
450
277
Q
2,600
775
470
322
198
H
2,024
602
365
250
154
L
5,176
1,548
938
644
397
M
4,056
1,212
734
504
310
Q
2,936
876
531
364
224
H
2,264
674
408
280
173
L
5,768
1,725
1,046
718
442
M
4,504
1,346
816
560
345
Q
3,176
948
574
394
243
H
2,504
746
452
310
191
L
6,360
1,903
1,153
792
488
M
5,016
1,500
909
624
384
Q
3,560
1,063
644
442
272
H
2,728
813
493
338
208
L
6,888
2,061
1,249
858
528
M
5,352
1,600
970
666
410
Q
3,880
1,159
702
482
297
H
3,080
919
557
382
235
33
Byte Kanji
1. táblázat - Maximálisan tárolható karakterek száma [1] Verzió
21
22
23
24
25
26
27
28
29
30
Méret
101x101
105x105
109x109
113x113
117x117
121x121
125x125
129x129
133x133
137x137
Hibajavító képesség
Adat bitek
Numerikus
Alfanumerikus
Byte
Kanji
L
7,456
2,232
1,352
929
572
M
5,712
1,708
1,035
711
438
Q
4,096
1,224
742
509
314
H
3,248
969
587
403
248
L
8,048
2,409
1,460
1,003
618
M
6,256
1,872
1,134
779
480
Q
4,544
1,358
823
565
348
H
3,536
1,056
640
439
270
L
8,752
2,620
1,588
1,091
672
M
6,880
2,059
1,248
857
528
Q
4,912
1,468
890
611
376
H
3,712
1,108
672
461
284
L
9,392
2,812
1,704
1,171
721
M
7,312
2,188
1,326
911
561
Q
5,312
1,588
963
661
407
H
4,112
1,228
744
511
315
L
10,208
3,057
1,853
1,273
784
M
8,000
2,395
1,451
997
614
Q
5,744
1,718
1,041
715
440
H
4,304
1,286
779
535
330
L
10,960
3,283
1,990
1,367
842
M
8,496
2,544
1,542
1,059
652
Q
6,032
1,804
1,094
751
462
H
4,768
1,425
864
593
365
L
11,744
3,514
2,132
1,465
902
M
9,024
2,701
1,637
1,125
692
Q
6,464
1,933
1,172
805
496
H
5,024
1,501
910
625
385
L
12,248
3,669
2,223
1,528
940
M
9,544
2,857
1,732
1,190
732
Q
6,968
2,085
1,263
868
534
H
5,288
1,581
958
658
405
L
13,048
3,909
2,369
1,628 1,002
M
10,136
3,035
1,839
1,264
778
Q
7,288
2,181
1,322
908
559
H
5,608
1,677
1,016
698
430
L
13,880
4,158
2,520
1,732 1,066
M
10,984
3,289
1,994
1,370
843
Q
7,880
2,358
1,429
982
604
H
5,960
1,782
1,080
742
457
34
1. táblázat - Maximálisan tárolható karakterek száma [1] Verzió
31
32
33
34
35
36
37
38
39
40
Méret
141x141
145x145
149x149
153x153
157x157
161x161
165x165
169x169
173x173
177x177
Hibajavító képesség
Adat bitek
Numerikus
Alfanumerikus
L
14,744
4,417
2,677
1,840 1132
M
11,640
3,486
2,113
1,452
894
Q
8,264
2,473
1,499
1,030
634
H
6,344
1,897
1,150
790
486
L
15,640
4,686
2,840
1,952 1,201
M
12,328
3,693
2,238
1,538
947
Q
8,920
2,670
1,618
1,112
684
H
6,760
2,022
1,226
842
518
L
16,568
4,965
3,009
2,068 1,273
M
13,048
3,909
2,369
1,628 1,002
Q
9,368
2,805
1,700
1,168
719
H
7,208
2,157
1,307
898
553
L
17,528
5,253
3,183
2,188 1,347
M
13,800
4,134
2,506
1,722 1,060
Q
9,848
2,949
1,787
1,228
756
H
7,688
2,301
1,394
958
590
L
18,448
5,529
3,351
2,303 1,417
M
14,496
4,343
2,632
1,809 1,113
Q
10,288
3,081
1,867
1,283
790
H
7,888
2,361
1,431
983
605
L
19,472
5,836
3,537
2,431 1,496
M
15,312
4,588
2,780
1,911 1,176
Q
10,832
3,244
1,966
1,351
832
H
8,432
2,524
1,530
1,051
647
L
20,528
6,153
3,729
2,563 1,577
M
15,936
4,775
2,894
1,989 1,224
Q
11,408
3,417
2,071
1,423
876
H
8,768
2,625
1,591
1,093
673
L
21,616
6,479
3,927
2,699 1,661
M
16,816
5,039
3,054
2,099 1,292
Q
12,016
3,599
2,181
1,499
923
H
9,136
2,735
1,658
1,139
701
L
22,496
6,743
4,087
2,809 1,729
M
17,728
5,313
3,220
2,213 1,362
Q
12,656
3,791
2,298
1,579
972
H
9,776
2,927
1,774
1,219
750
L
23,648
7,089
4,296
2,953 1,817
M
18,672
5,596
3,391
2,331 1,435
Q
13,328
3,993
2,420
1,663 1,024
H
10,208
3,057
1,852
1,273
35
Byte
Kanji
784
2. táblázat – viszonyítási pontok helyei Viszonyítási Verzió
pontok
Viszonyítási pontok közepének koordinátái (sor/oszlop)
száma 1
0
-
2
1
6
18
3
1
6
22
4
1
6
26
5
1
6
30
6
1
6
34
7
6
6
22
38
8
6
6
24
42
9
6
6
26
46
10
6
6
28
50
11
6
6
30
54
12
6
6
32
58
13
6
6
34
62
14
13
6
26
46
66
15
13
6
26
48
70
16
13
6
26
50
74
17
13
6
30
54
78
18
13
6
30
56
82
19
13
6
30
58
86
20
13
6
34
62
90
21
22
6
28
50
72
94
22
22
6
26
50
74
98
23
22
6
30
54
78
102
24
22
6
28
54
80
106
25
22
6
32
58
84
110
26
22
6
30
58
86
114
27
22
6
34
62
90
118
28
33
6
26
50
74
98
122
29
33
6
30
54
78
102
126
36
2. táblázat – viszonyítási pontok helyei Verzió
Viszonyítási pontok
Viszonyítási pontok közepének koordinátái
száma
(sor/oszlop)
30
33
6
26
52
78
104
130
31
33
6
30
56
82
108
134
32
33
6
34
60
86
112
138
33
33
6
30
58
86
114
142
34
33
6
34
62
90
118
146
35
46
6
30
54
78
102
126
150
36
46
6
24
50
76
102
128
154
37
46
6
28
54
80
106
132
158
38
46
6
32
58
84
110
136
162
39
46
6
26
54
82
110
138
166
40
46
6
30
58
86
114
142
170
37
Irodalomjegyzék [1] QRcode.com http://www.denso-wave.com/qrcode/index-e.html (2011-12-11) [2] How to create QRcode http://www.swetake.com/qr/qr1_en.html (2011-12-11) [3] Wikipédia QR-kód szócikk http://hu.wikipedia.org/wiki/QR-kód (2011-12-11) [4] Kasza Péter - Reed-Solomon kódok http://users.iit.uni-miskolc.hu/~kasza1/files/reed_solomon/reed_solomon.pdf (2011-12-11) [5] ISO/IEC 18004:2000. QR Code bar code symbology specification. ISO, Geneva, Switzerland. [6] .NET Framework Class Library http://msdn.microsoft.com/en-us/library/gg145045.aspx (2011-12-11) [7] Bradley L. Jones () : C# mesteri szinten 21 nap alatt, Kiskapu kiadó 2004 ISBN 9639301736
Mellékletek 1 DVD lemez, amely tartalmazza a programot, jelen szakdolgozatot pdf formátumban. A program futtatásához szükséges .NET keretrendszer 2.0-s verzióját, valamint a szoftver forráskódját.
38