Tento článek patří do seriálu Vše okolo čárových a QR kódů. Ostatní články seriálu:
- Generátor čárových kódů
- Geneátor QR kódů
- Možnosti dat v QR kódech
- Optimalizace QR kódů
Čárový kód zná každý, z výrobků v supermarketech. Vždycky mě zajímalo, jak v těch černobílých čárách může být ukryto, co si kupuji za zboží. Proto když jsem měl udělat systém pro nákup poukazů na SkiBílá, začal jsem si o čárových kódech zjišťovat více.
V novějším článku popisuji jak generovat QR kódy a jejich výhody oproti kódům čárovým.
Základní čárové kódy
Ač se na první pohled může zdát, že je jeden jako druhý, není to pravda. Pokud budeme brát v potaz pouze 1D kódy (2D jsou např .QR kódy), existuje velké množství různých druhů. Některé umí jen čísla, jiné i písmena nebo speciální znaky.
Jeden z nejstarších Code 2/5 umí jen znaky 0-9. EAN známý ze zboží v obchodech umí znaky 0-9, ale obsahuje také kontrolní číslici. Code128 dokáže rozpoznat 128 znaků, spodní polovinu ASCII. Je na každém, který si pro svou aplikaci vybere.
Problém s EAN kódy
Dříve zmíněný kód EAN, který se používá k označení zboží, nebo knížek, přiděluje organizace GS1 Czech Republic. Starají se, aby 2 výrobky neměly stejný kód, proto jeho použití by mohlo být problémové, kdyby si někdo chtěl na vás posvítit.
Zvětšování, zmenšování a rotace
Výhoda čárových kódů je v možností kód natáčet, zvětšovat či zmenšovat. Čtečka rozlišuje poměr černé a bílé čáry. U kódu Code11 dokonce jen poměr černých čar. Jiné kódy lze číst i vzhůru nohama. Díky této vlastnosti nemusíte kód čtečkou číst přesně kolmo k čarám, protože i při natočení poměr zůstane stejný.
Generujeme
Pokud jsme si svůj kód vybrali, již stačí pouze vzít do ruky nějaký ten nástroj a vygenerovat si obrázek se svým čárovým kódem. Já vybral pro PHP třídu z webu Barcode coder. Zde naleznete zdrojové kódy pro PHP, Javu a pro JavaScript plugin do jQuery a Prototype.
Ukázka pro PHP s průhledným pozadím
Pro své účely jsem zvolil typ kódu Code93, umí číslice a velké znaky abecedy a pár speciálních znaků
$font = './fonts/OpenSans-Regular-webfont.ttf'; $iWidth = 300; // šířka obrázku $iHeight = 150; //výška obrázku $fontSize = 12; // velikost písma v px $marge = 15; // mezera mezi koncem čar a HRI (human readable interpretation) $x = 150; // střed na ose X $y = 60; // střed na ose Y $height = 100; // výška čar $width = 2; // šířka čar $type = 'code93'; //vybraný typ $angle = 0; //natočení kódu $code = "---TEST---"; //text k uložení do čárového kódu $im = imagecreatetruecolor($iWidth, $iHeight); //vytvoříme obrázek pro kreslení imagesavealpha($im, true); //chceme ukládat alfa kanál pro průhlednost imagealphablending($im, false); //vypneme blend mode $black = ImageColorAllocate($im,0x00,0x00,0x00); //alokace barvy $white = ImageColorAllocateAlpha($im,0xff,0xff,0xff,127); //alokace průhledného pozadí imagefilledrectangle($im, 0, 0, $iWidth, $iHeight, $white); //vyplníme pozadí imagealphablending($im, true); //zapneme blendmode po vykreslení pozadí //nakreslíme čárový kód za pomoci Barcode třídy $dataBarcode = Barcode::gd($im, $black, $x, $y, $angle, $type, $code, $width, $height); //vypočteme potřebné místo pro vypsání čitelného kódu $box = imagettfbbox($fontSize, 0, $font, $dataBarcode['hri']); $len = $box[2] - $box[0]; //vycentrujeme HRI doprostřed obrázku Barcode::rotate(-$len / 2, ($dataBarcode['height'] / 2) + $fontSize + $marge, $angle, $xt, $yt); //vykreslíme text imagettftext($im, $fontSize, $angle, $x + $xt, $y + $yt, $black, $font, $dataBarcode['hri']); imagepng($im,"barcode.png");// uložíme jako PNG obrázek
Otestujte si svou čtečku
Ne každá čtečka umí všechny kódy, některé dokonce povolují přidání kontrolních součtů. Je potřeba si vygenerovat různé kódy, vzít si čtečku do ruky a otestovat.
Já si předem vygeneroval kódy Code11, Code 39, Code93 (s i bez kontroly) a Code128. Z těchto čtečka používaná na Bílé nepodporuje Code11, Code93 bez kontroly. Nakonec jsem se rozhodl pro Code93, protože umožnil přidat kontrolní součet.
K tomuto článku již není možné přidávat další komentáře
Komentáře
Funkce imagettfbbox() a imagettftext() neexistují.
Opravdu? Je to funkční kód který používám a také dokumentace k těmto funkcím existuje: http://php.net/manual/.../function.imagettfbbox.php a http://php.net/manual/.../function.imagettftext.php