Podgląd pliku: / jacekk.info / rss14limited.phps
<?php
/***************************************************
* Kody kreskowe - RSS-14 Limited *
***************************************************
* Wersja: 1.0 *
* Autor: Jacek Kowalski (http://jacekk.info) *
* *
* Strona WWW: http://jacekk.info/scripts/barcodes *
* *
* Utwór rozprowadzany na licencji *
* http://creativecommons.org/licenses/by-nc/2.5/ *
***************************************************/
/* Kodowanie znaków UTF-8 */
function combins($n, $r) {
if($n-$r > $r) {
$minDenom = $r;
$maxDenom = $n-$r;
}
else
{
$minDenom = $n-$r;
$maxDenom = $r;
}
$val = 1;
$j = 1;
for($i = $n; $i > $maxDenom; $i--) {
$val *= $i;
if($j <= $minDenom) {
$val /= $j;
$j++;
}
}
for(; $j <= $minDenom; $j++) {
$val /= $j;
}
return $val;
}
/* Zgodnie z załącznikiem B do PN-ISO/IEC 24724:2009 */
// n - num of modules
function getRSSwidths($val, $n, $elements, $maxWidth, $noNarrow=TRUE)
{
$narrowMask = 0;
for($bar = 0; $bar < $elements-1; $bar++) {
for($elmWidth = 1, $narrowMask |= (1<<$bar); ; $elmWidth++, $narrowMask &= ~(1<<$bar)) {
/* get all combinations */
$subVal = combins($n-$elmWidth-1, $elements-$bar-2);
/* less combinations with no single-module element */
if((!$noNarrow) && ($narrowMask == 0) && ($n-$elmWidth-($elements-$bar-1) >= $elements-$bar-1)) {
$subVal -= combins($n-$elmWidth-($elements-$bar), $elements-$bar-2);
}
/* less combinations with elements > maxVal */
if($elements-$bar-1 > 1) {
$lessVal = 0;
for($mxwElement = $n-$elmWidth-($elements-$bar-2); $mxwElement > $maxWidth; $mxwElement--) {
$lessVal += combins($n-$elmWidth-$mxwElement-1, $elements-$bar-3);
}
$subVal -= $lessVal * ($elements-1-$bar);
}
elseif($n-$elmWidth > $maxWidth) {
$subVal--;
}
$val -= $subVal;
if($val < 0) break;
}
$val += $subVal;
$n -= $elmWidth;
$widths[$bar] = $elmWidth;
}
$widths[$bar] = $n;
return $widths;
}
/* Zwraca kod jaki trzeba przekazać do funkcji getRSSwidths,
* by uzyskać szerokości elementów słów kodowych */
function getEncodingValue($val) {
$table = array(
// group_max, Gsum, Todd, Teven, odd_modules, even_modules, odd_widest, even_widest
array( 183063, 0, 6538, 28, 17, 9, 6, 3),
array( 820063, 183064, 875, 7282, 13, 13, 5, 4),
array( 1000775, 820064, 28, 6454, 9, 17, 3, 6),
array( 1491020, 1000776, 2415, 2034, 15, 11, 5, 4),
array( 1979844, 1491021, 203, 2408, 11, 15, 4, 5),
array( 1996938, 1979845, 17094, 1, 19, 7, 8, 1),
array( 2013570, 1996939, 1, 16632, 7, 19, 1, 8),
);
foreach($table as $key) {
if($key[0]<$val) continue;
return array(
// (val - Gsum) div Teven
'odd' => (int)bcdiv(($val-$key[1]), $key[3]),
'odd_modules' => $key[4],
'odd_widest' => $key[6],
// (val - Gsum) mod Teven
'even' => (int)bcmod(($val-$key[1]), $key[3]),
'even_modules' => $key[5],
'even_widest' => $key[7],
);
}
throw new Exception('Błąd w funkcji getEncodingValue - OutOfBound');
}
$kod = $_GET['kod'];
if(!ctype_digit($kod) || strlen($kod)>13 || (substr($kod, -13, 1)!=0 && substr($kod, -13, 1)!=1) ) {
die('Kod musi mieć 13 cyfr (bez cyfry kontrolnej) - pierwsza 0 lub 1');
}
$code = array(
1 => array(),
2 => array(),
);
/* Pierwszy moduł, lewy */
$d = getEncodingValue(bcdiv($kod, 2013571));
$d_odd = getRSSwidths($d['odd'], $d['odd_modules'], 7, $d['odd_widest']);
$d_even = getRSSwidths($d['even'], $d['even_modules'], 7, $d['even_widest']);
for($i=0; $i<7; $i++) {
$code[1][] = $d_odd[$i];
$code[1][] = $d_even[$i];
}
/* Drugi moduł, prawy */
$d = getEncodingValue(bcmod($kod, 2013571));
$d_odd = getRSSwidths($d['odd'], $d['odd_modules'], 7, $d['odd_widest']);
$d_even = getRSSwidths($d['even'], $d['even_modules'], 7, $d['even_widest']);
for($i=0; $i<7; $i++) {
$code[2][] = $d_odd[$i];
$code[2][] = $d_even[$i];
}
function controlCharacter($c) {
$wagi = array(
1 => array(1, 3, 9, 27, 81, 65, 17, 51, 64, 14, 42, 37, 22, 66),
2 => array(20, 60, 2, 6, 18, 54, 73, 41, 34, 13, 39, 28, 84, 74),
);
$sum = 0;
for($i=1; $i<=2; $i++) {
foreach($c[$i] as $k => $n) {
$sum += $wagi[$i][$k]*$n;
$sum %= 89;
}
}
return $sum;
}
$controlCharTable_seq = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 52, 57, 63, 64, 65, 66, 73, 74, 75, 76, 77, 78, 79, 82, 126, 127, 128, 129, 130, 132, 141, 142, 143, 144, 145, 146, 210, 211, 212, 213, 214, 215, 216, 217, 220, 316, 317, 318, 319, 320, 322, 323, 326, 337);
/* Znak kontrolny, środek */
$d = $controlCharTable_seq[controlCharacter($code)];
$d_odd = getRSSwidths(bcdiv($d, 21), 8, 6, 3, 1);
$d_even = getRSSwidths(bcmod($d, 21), 8, 6, 3, 1);
for($i=0; $i<6; $i++) {
$code['c'][] = $d_odd[$i];
$code['c'][] = $d_even[$i];
}
$code['c'][] = 1;
$code['c'][] = 1;
unset($d, $d_odd, $d_even, $controlCharTable_seq, $control);
$code = array_merge(array(1, 1), $code[1], $code['c'], $code[2], array(1, 1));
$code_bin = '';
$now = FALSE;
foreach($code as $len) {
if($now) {
$code_bin .= str_repeat('1', $len);
}
else
{
$code_bin .= str_repeat('0', $len);
}
$now = !$now;
}
unset($code, $now, $len);
$code_bin = str_split($code_bin);
$img = imagecreate(74, 10);
$wht = imagecolorallocate($img, 255, 255, 255);
$blc = imagecolorallocate($img, 0, 0, 0);
foreach($code_bin as $n => $el) {
if($el == '1') {
imageline($img, $n, 1, $n, 30, $blc);
}
}
header('Content-Type: image/png');
imagepng($img);
?>
Browse Code © 2010 by Jacek Kowalski