Classe générateur de codes barres 2d datamatrix

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 934 fois - Téléchargée 16 fois

Contenu du snippet

Cette classe vous permettra de générer des codes barres 2D Datamatrix a partir d'une chaine de caractères. Cette petite source a été élaborée ditectement suivant la référence ISO 16022 que vous pourrez trouver en téléchargement sur www.openbio.fr/pdf/iso16022.pdf . Seuls le mode ASCII est pour l'instant implémenté. Le reste viendra au fur et a mesure. Le résultat à été vérifié avec un lecteur de code barres.

Source / Exemple :

<?php



//header("Content-type: image/png");



/**

* @desc Classe de generation de code barres 2D DataMatrix. Actuellement, seul le mode ASCII est supporte, ainsi que les plus patites tailles de matrices. Je travaille en ce moment a l'implementation d'autres modes - Ce code est sous liscence GNU LGPL. Vous trouverez les conditions d'utilisations complètes dans l'archive ou sur le site www.gnu.org . L'UTILISATION DE CE CODE OU D'UNE PARTIE DE CE CODE DANS LE CADRE D'UN PROJET NON LIBRE EST STRICTEMENT INTERDITE. Vous pourrez trouver la référence iso 16044 à l'adresse suivante: www.openbio.fr/pdf/iso16044.pdf

* @brief Classe de generation de codes barres 2D DataMatrix

* @author M. GEORGES alias TorTukiTu

* @date 21/08/2010

*/



	//Definition des CodeWords speciaux

	define("PAD", 129);

	define("C40", 230);

	define("BASE64", 231);

	define("FNC1", 232);

	define("STRUCTURE_APPEND",233);

	define("READER_PORGRAMMING", 234);

	define("UPPER_SHIFT",235);

	define("05MACRO", 236);

	define("06MACRO", 237);

	define("ANSIX12", 238);

	define("TEXT", 239);

	define("EDIFACT", 240);

	define("ECI", 241);

	define("C40SHIFT1", 0);

	define("C40SHIFT2", 1);

	define("C40SHIFT3", 2);



class datamatrix{

	

	

	// Contient la taille approximativement voulue de l'image.

	private $approx_size;

	// Rapport multiplicatif permettant d'approcher au maximum la taille voulue

	private $resizingFactor;

	// Contient notre image

	private $im;

	//Contient notre chaine a encoder

	private $strToEncode;

	// Contient le nombre de lignes de la zone de donnees

	private $nrow;

    // Contient le nombre de colonnes de la zone de donnees

	private $ncol;

	// Contient la matrice de 0/1 pour tracer le code barre

	private $barcode;

	// Une matrice de donnees utilises lors de calculs internes

	private $dataArray;

	// Contient les donnes sur la taille de la matrice en fonction de la taille des donnees

	private $squareMatrixSizes=array('Alphanum' => array('Rows', 'Cols', 'Size', 'No', 'mappSize', 'Total_Data', 'Total_Error', 'RS_data', 'RS_error', 'interblocks', 'Num', 'Alphanum', 'Byte', 'prcent_cod_corr', 'max_xorr_err'),

									 3 => array(10,10,8,1,8,3,5,3,5,1,6,3,1,62.5,'2/0'),

									 6 => array(12,12,10,1,10,5,7,5,7,1,10,6,3,58.3,'3/0'),

									 10 => array(14,14,12,1,12,8,10,8,10,1,16,10,6,55.6,'5/7'),

									 16 => array(16,16,14,1,14,12,12,12,12,1,24,16,10,50,'5/9'),

									 25 => array(18,18,16,1,16,18,14,14,18,14,1,36,25,16,43.8,'7/11'),

									 31 => array(20,20,18,1,18,22,18,22,18,1,44,31,20,45,'9/15'),

									 43 => array(22,22,20,1,20,30,20,30,20,1,60,43,28,40,'10/17'),

									 52 => array(24,24,22,1,22,36,24,36,24,1,72,52,34,40,'12/21'),

									 64 => array(26,26,24,1,24,44,28,44,28,1,88,64,42,38.9,'14/25'),

									 91 => array(32,32,14,4,28,62,36,62,36,1,124,91,60,36.7,'18/33'),

									 127 => array(36,36,16,4,32,86,42,86,42,1,172,127,84,32.8,'21/39'),

									 169 => array(40,40,18,4,36,114,48,114,48,1,228,169,112,29.6,'24/45'),

									 214 => array(44,44,20,4,40,144,56,144,56,1,288,214,142,28,'28/53'),

									 259 => array(48,48,22,4,44,174,68,174,68,1,348,259,172,28.1,'34/65'),

									 304 => array(52,52,24,4,48,204,84,102,42,2,408,304,202,29.2,'42/78'),

									 418 => array(64,64,14,16,56,280,112,140,56,2,560,418,277,28.6,'56/106'),

									 550 => array(72,72,16,16,64,368,144,925,36,4,736,550,365,28.1,'72/132'),

									 682 => array(80,80,18,16,72,456,192,114,48,4,912,682,453,28.6,'96/180'),

									 862 => array(88,88,20,16,80,576,224,144,56,4,1152,862,573,28,'112/212'),

									 1042 => array(96,96,22,16,88,696,272,174,68,4,1392,1042,693,28.1,'136/260'),

									 1222 => array(104,104,24,16,96,816,336,136,56,6,1632,1222,813,29.2,'168/318'),

									 1573 => array(120,120,18,36,108,1050,408,175,68,6,2100,1573,1047,28,'204/390'),

									 1954 => array(132,132,20,36,120,1304,496,163,62,8,2608,1954,1301,27.6,'248/472'),

									 1555 => array(144,144,22,36,132,1558,620,156,62,8,3116,2335,1555,28.5,'310/590')

									 );

	

	// C40 encodation sets

	private $C40EncodationSet0=array('','','', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'

									, 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'

									);

	

	private $C40EncodationSet1=array('NUL', 'SOH', 'STX',

								   'STX', 'ETX', 'EQT', 'ENQ',

								   'ACK', 'BEL', 'BS',

								   'HT', 'LF', 'VT', 'FF',

								   'CR', 'SO', 'SI', 'DLE',

								   'DC1', 'DC2', 'DC3', 'DC4',

								   'NAK', 'SYN', 'ETB', 'CAN',

								   'EM', 'SUB', 'ESC', 'FS',

								   'GS', 'RS', 'US'

								   );

	

	private $C40EncodationSet2=array(

									'!' , '"', '#', '$',

									'%', '&', '\'', '(',

									')', '*', '+', ',',

									'-', '.', '/', ':',

									';', '<', '=', '>',

									'?', '@', '[', '\\',

									']', '^', '_'

									);

	

	//TODO: MANQUE LE DEL: 127

	private $C40EncodationSet3=array('\'', 'a', 'b', 'c',

									'd', 'e', 'f', 'g',

									'h', 'i', 'j', 'k',

									'l', 'm', 'n', 'o',

									'p', 'q', 'r', 's',

									't', 'u', 'v', 'w',

									'x', 'y', 'z', '{' ,

									'|', '}', '~'

									);

	

	// Dans size se trouve les donnes sur la bonne taille de matrice pour notre chaine a encoder

	private $size;

	

	// Contient les valeurs (codewords) de notre chaine encodee en mode ASCII

	private $CWTextASCII=array();

	

	// Un array utilisé dans certains traitements internes

	private $interLeavedWords=array();



	// Constructeur de la classe, prend la chaine a encoder en parametre

	public function __construct($strToEncode){

		$this->C40EncodationSet0=array_flip($this->C40EncodationSet0);

		$this->C40EncodationSet1=array_flip($this->C40EncodationSet1);

		$this->C40EncodationSet2=array_flip($this->C40EncodationSet2);

		$this->C40EncodationSet3=array_flip($this->C40EncodationSet3);

		$this->dataArray=array();

		$this->barcode=array();

		$this->strToEncode=$strToEncode;

		//echo $strToEncode.'<pre>';

		$this->getStringValue();

		$this->chooseMatrixSize();

		//$this->encodeC40();

		$this->addPadCWs();

		//print_r($this->CWTextASCII);

		// TODO: Check reed-8solomon

		$this->CWTextASCII = $this->reedSolomon($this->CWTextASCII,

							$this->countNotNull($this->CWTextASCII),

							$this->size[6],	

							pow(2,8),

							301

							);

		array_pop($this->CWTextASCII);

		//print_r($this->CWTextASCII);

		//$this->addPadCWs();

		$this->interlaceBlocks();



		$this->setMatrix();

		// FAUX CAR ON DOIT ICI UTILISER LES CODEWORDS AU LIEU DE LA CHIANE DE DEPARD

		//$this->splitInInterleavedWords();

		//print_r($this->squareMatrixSizes);

		//echo "</pre>";

		}



	// Construction de la matrice, positionnement des CodeWords dans cette matrice

	private function setMatrix(){

	  $this->nrow=$this->size[4];

	  $this->ncol=$this->size[4];

	  $this->ecc200();

	  for($x=0; $x<$this->nrow; $x++){

	     $this->barcode[$x]=array();

	  }

	  for($x=0; $x<$this->nrow; $x++){

	    //echo "<br> [$x] ";

	    for($y=0; $y<$this->ncol; $y++){

	      $z=$this->dataArray[$x*$this->ncol+$y];

		  //echo " $z ";

	      if($z==0){

		$this->barcode[$x][$y]=0;

	      }elseif($z==1){

		$this->barcode[$x][$y]=1;

	      }else{

		$z=$z-10;

		$number=floor($z/10);

		$octetNumber=floor(($z)%10);

		$numberString=$this->intToBin($this->CWTextASCII[$number]);

		$this->barcode[$x][$y]=($numberString[$octetNumber-1]);

	      }

	    }

	  }

	}



	// Compte les elements non égaux a zero d'un array

	private function countNotNull($array){

	  $count=0;

	  foreach($array as $elem){

	     $tmp = ($elem==0) ? 0 : 1;

	     $count += $tmp;

	  }

	  return $count;

	}

	

	

	// FONCTION D'interlacage des mots

	private function interlaceBlocks(){

		$decl=$this->size[3];

		$localBlocks=array();

		for($j=0; $j<$decl; $j++){

			$localBlocks[$j]=array();

			}

				//echo "NUMBER OF WORDS=$decl<br>";

				//echo "SIZE=".$this->size[4]."<br>";

		for($i=0; $i<($this->size[4]*$this->size[4]); $i+=$decl){

			for($j=0; $j<$decl; $j++){

			//echo "DATAARRAY[$i + $j] = ".$this->dataArray[$i + $j]."<br>";

			array_unshift($localBlocks[$j], $this->dataArray[$i+$j]);

			}

		}

		for($j=0; $j<$decl; $j++){

			//echo "BLOCK [$j] == ";

			//print_r($localBlocks[$j]);

			}

	}

	

	private function splitInInterleavedWords(){

		$numebrOfWords=$this->size[9];

		for($i=0; $i<$numebrOfWords; $i++){

			$interLeavedWords[$i]=substr($this->strToEncode, $i, strlen($this->strToEncode)-$numebrOfWords+$i);

			}

		}	

		

	//Convertit un decimal en binaire	

	private function intToBin($number){

		$tmp = decbin($number);

		$zero="00000000";

		return substr($zero,0, 8-strlen($tmp)).$tmp;

		}	

	

	// Permer de determiner la taille de la matrice suivant le nombre de CodeWords a encoder

	// La taille minimale possible pour le nombre de mots cles correspondants a nos donnees est 

	// toujours choisie

	// cf. ISO 16044

	private function chooseMatrixSize(){

		$size=count($this->CWTextASCII);

		$isSet=false;

		$this->size=false;

		$keys=array_keys($this->squareMatrixSizes);

		sort($keys);

		$i=0;

		while($this->size==false){

			if(($size <= $this->squareMatrixSizes[$keys[$i]][5]) and is_numeric($this->squareMatrixSizes[$keys[$i]][5])){

				$this->size=$this->squareMatrixSizes[$keys[$i]];

				}

			$i++;

			}

		}

		

	// Retourne une suite de valeurs correspondant a notre chaine selon le codage ASCII

	// tel que defini dans l'iso 16044

	private function getStringValue(){

		$i=0;

		for($i=0; $i<strlen($this->strToEncode); $i++){

			$val=$this->getCharValue($i);

			if($val>=130){

				$i++;

				}

			array_push($this->CWTextASCII, $val);

			}

		}

	

	// Encodage C40 tel que defini dans l'iso 16044

	// TODO: fonction a terminer.

	private function encodeC40(){

		$i=0;

		array_push($this->CWTextASCII, C40);

			for($i=0; $i<strlen($this->strToEncode); $i+=3){

				$val=$this->getC40Value($i);

				array_push($this->CWTextASCII, $val[0]);

				array_push($this->CWTextASCII, $val[1]);

			}

		}	

		

	// TODO: suite du codage en C40

	private function getC40Value($pos){

		// TODO: Tenir compte des regles supplementaires pour le charset C40

		echo $this->C40EncodationSet0[$this->strToEncode[$pos]];

		$value=(1600*$this->C40EncodationSet0[$this->strToEncode[$pos]])+(40*$this->C40EncodationSet0[$this->strToEncode[$pos+1]])+$this->C40EncodationSet0[$this->strToEncode[$pos+2]]+1;

		$val=array();

		$val[0]=floor($value/256);

		$val[1]=$value%256;

		return $val;

		}

		

	//TODO: Ajouter le mode d'ncodage TEXT

	private function encodeTEXT(){

		

		}

		

		

	// Retourne la valeur a encoder d'un caractere ou d'un decimal	

	private function getCharValue($position){

		if(is_numeric($this->strToEncode[$position]) and is_numeric($this->strToEncode[$position+1])){

			$num=$this->strToEncode[$position]*10 + $this->strToEncode[$position+1];

			return $num+130;

			}else{

			return ord($this->strToEncode[$position])+1;	

			}

			

		}	

		

	// Ajoute des padword tant que la matrice est pas completement pleine

	// cf. iso 16044	

	private function addPadCWs(){

		$sizeOfMatrix=$this->size[5];

		if(count($this->CWTextASCII) <  $sizeOfMatrix){

			array_push($this->CWTextASCII, PAD);

			while(count($this->CWTextASCII) <  $sizeOfMatrix){

				array_push($this->CWTextASCII, $this->state_253(PAD, count($this->CWTextASCII)));

				}

			}

		}

	

	//Genere un pad word aleatoire selon l'algorithme 253 state tel que defini dans

	//l'iso 16044

	private function state_253($pad_codeword_value, $pad_codeword_position){

		$pseudo_random_number = ((149*$pad_codeword_position)%253)+1;

		$temp_variable = $pad_codeword_value + $pseudo_random_number;

		if($temp_variable<=254){

			return $temp_variable;

			}else{

			return $temp_variable-254;	

			}

		}

		

	//Algorithme de correction d'erreur Reed-solomon cf. iso 16044

	private function reedSolomon($wd, $nd, $nc, $gf, $pp){

		$c=array();

		$log = array();

		$alog = array();

		$log[0]=1-$gf;

		$alog[0]=1;

		for($i=1; $i<$gf; $i++){

			$alog[$i]=$alog[$i-1]*2;

			if($alog[$i] >= $gf){

				$alog[$i] = $alog[$i] ^ $pp; 

				}

			$log[$alog[$i]] = $i;

			}



		for($i=1; $i<=$nc; $i++){

			$c[$i] = 0;

		}

		$c[0] = 1;

		for($i=1; $i<=$nc; $i++){

			$c[$i]=$c[$i-1];

			for($j=($i-1) ; $j>=1; $j--){

					$c[$j]=($c[$j-1]) ^ ($this->prod($c[$j], $alog[$i], $log, $alog, $gf));

				}

				$c[0] = $this->prod($c[0], $alog[$i], $log, $alog, $gf);

			}



		for($i=$nd; $i<=($nd+$nc); $i++){

			$wd[$i]=0;

			}

			

		for($i=0; $i<$nd; $i++){

			$k=$wd[$nd]^$wd[$i];

			for($j=0; $j<$nc; $j++){

				$wd[$nd+$j]=$wd[$nd+$j+1] ^ $this->prod($k, $c[$nc-$j-1], $log, $alog, $gf);

				}

			}

		return $wd;

		}

	

	private function prod($x, $y , $log, $alog, $gf){

		if( ($x==0) || ($y==0) ){

				return 0;

			}else{

				return $alog[($log[$x]+$log[$y])%($gf-1)];	

			}

		}

	

	// Fonction permettant de tracer notre code barre

	public function stroke($approx_size){

		$this->approx_size = $approx_size;

		$this->makeFullImageBody();

		$this->fulfillImage2();

		ImagePNG($this->im, "./barcode.png");

		}

	

	// Permet de tracer le corps du code barre

	private function makeFullImageBody(){

		$this->getResizingFactor();

		$this->im = imagecreatetruecolor($this->size[0]*$this->resizingFactor, $this->size[1]*$this->resizingFactor);

		$this->black = imagecolorallocate($this->im, 0, 0, 0);

		$this->white = imagecolorallocate($this->im, 255, 255, 255);

		$this->makeBorders();

	}



	// Fonction de calcul du facteur d'agrandissement	

	private function getResizingFactor(){

		$this->resizingFactor=floor($this->approx_size/$this->size[0]);

	}

	

	// Trace les bordures du code barre

	private function makeBorders(){

		ImageFillToBorder($this->im, 0, 0, $this->white, $this->white);

		$rac_tmp=floor(sqrt($this->size[3]));

		for($i=0; $i<$rac_tmp; $i++){

			for($j=0; $j<$rac_tmp; $j++){

			$this->traceMatrixFulfill($this->size[2], $i*($this->size[2]+2), $j*($this->size[2]+2));

			}

		}

	}

	

	// Remplis le corps du code barre

	private function traceMatrixFulfill($sizeOfData, $posX, $posY){

		imagefilledrectangle($this->im, 

							$posX*$this->resizingFactor,

							$posY*$this->resizingFactor,

							($posX+1)*$this->resizingFactor-1,

							($posY+$sizeOfData+1)*$this->resizingFactor,

							$this->black

							);

		

		imagefilledrectangle(

							$this->im,

							$posX*$this->resizingFactor,

							($posY+$sizeOfData+1)*$this->resizingFactor,

							($posX+$sizeOfData+2)*$this->resizingFactor,

							($posY+$sizeOfData+1+1)*$this->resizingFactor-1,

							$this->black

		);

		for($i=1; $i<=$sizeOfData; $i+=2){

			$this->imagesetpixel_replace($this->im, $posX+$sizeOfData+1,$posY+$i, $this->black);

			$this->imagesetpixel_replace($this->im, $posX+$i+1,$posY, $this->black);

		}

	}

	

	// Methode de remplacement pour imagesetpixel

	private function imagesetpixel_replace($image, $posX, $posY, $color){

		imagefilledrectangle($image,

							 $posX*$this->resizingFactor,

							 $posY*$this->resizingFactor,

							 ($posX+1)*$this->resizingFactor-1,

							 ($posY+1)*$this->resizingFactor-1,

							 $color

							 );

	}

	

	

	// Fonction remplissant le centre du code barre

	private function fulfillImage2(){

		$dataX=0;

		$dataY=0;

	    $tracePosX=0;

		$tracePosY=0;

		for($y=0; $y<$this->nrow; $y++){

		  $dataX=0;

		  $tracePosX=0;

		  $tracePosY++;

		  if($dataY==$this->size[2]){

		  $dataY=0;

		  $tracePosY+=2;

		  }

		  $dataY++;

	      for($x=0; $x<$this->ncol; $x++){

			  $tracePosX++;

			  if($dataX==$this->size[2]){

			  $dataX=0;

			  $tracePosX+=2;

			  }

			  $dataX++;

			  if($this->barcode[$y][$x]==1){

			  	$this->imagesetpixel_replace($this->im, $tracePosX, $tracePosY, $this->black);

			  }

		   }

	    }

	}

	

	// Les fonctions ci dessous correspondent a l'algorithme de positionnement

	// des blocs tels que defini dans l'iso 16044

	private function module($row, $col, $chr, $bit){

	  if($row<0){

	    $row+=$this->nrow;

	    $col += 4-(($this->nrow+4)%8);

	  }

	  if($col<0){

	    $col+=$this->ncol;

	    $row+=4-(($this->ncol+4)%8);

	  }

	  $this->dataArray[$row*$this->ncol+$col]=10*$chr+$bit;

	}



	private function utah($row, $col, $chr){

	  $this->module($row-2, $col-2, $chr, 1);

	  $this->module($row-2, $col-1, $chr, 2);

	  $this->module($row-1, $col-2, $chr, 3);

	  $this->module($row-1, $col-1, $chr, 4);

	  $this->module($row-1, $col, $chr, 5);

	  $this->module($row, $col-2, $chr, 6);

	  $this->module($row, $col-1, $chr, 7);

	  $this->module($row, $col, $chr, 8);

	}



	private function corner1($chr){

	  $this->module($this->nrow-1, 0, $chr, 1);

	  $this->module($this->nrow-1, 1, $chr, 2);

	  $this->module($this->nrow-1, 2, $chr, 3);

	  $this->module(0, $this->ncol-2, $chr, 4);

	  $this->module(0, $this->ncol-1, $chr, 5);

	  $this->module(1, $this->ncol-1, $chr, 6);

	  $this->module(2, $this->ncol-1, $chr, 7);

	  $this->module(3, $this->ncol-1, $chr, 8);

	}

	

	private function corner2($chr){

	  $this->module($this->nrow-3, 0, $chr, 1);

	  $this->module($this->nrow-2, 0, $chr, 2);

	  $this->module($this->nrow-1, 0, $chr, 3);

	  $this->module(0, $this->ncol-4, $chr, 4);

	  $this->module(0, $this->ncol-3, $chr, 5);

	  $this->module(0, $this->ncol-2, $chr, 6);

	  $this->module(0, $this->ncol-1, $chr, 7);

	  $this->module(1, $this->ncol-1, $chr, 8);

	}



	private function corner3($chr){

	  $this->module($this->nrow-3, 0, $chr, 1);

	  $this->module($this->nrow-2, 0, $chr, 2);

	  $this->module($this->nrow-1, 0, $chr, 3);

	  $this->module(0, $this->ncol-2, $chr, 4);

	  $this->module(0, $this->ncol-1, $chr, 5);

	  $this->module(1, $this->ncol-1, $chr, 6);

	  $this->module(2, $this->ncol-1, $chr, 7);

	  $this->module(3, $this->ncol-1, $chr, 8);

	}

	

	private function corner4($chr){

	  $this->module($this->nrow-1, 0, $chr, 1);

	  $this->module($this->nrow-1, $this->ncol-1, $chr, 2);

	  $this->module(0, $this->ncol-3, $chr, 3);

	  $this->module(0, $this->ncol-2, $chr, 4);

	  $this->module(0, $this->ncol-1, $chr, 5);

	  $this->module(1, $this->ncol-3, $chr, 6);

	  $this->module(1, $this->ncol-2, $chr, 7);

	  $this->module(1, $this->ncol-1, $chr, 8);

	}



	private function ecc200(){

	  for($row=0; $row<$this->nrow; $row++){

	    for($col=0; $col<$this->ncol; $col++){

	      $this->dataArray[$row*$this->ncol+$col]=0;

	    }

	  }

	  $chr=1;

	  $row=4;

	  $col=0;

	  do{

	    (($row==$this->nrow) && ($col==0)) ? $this->corner1($chr++) : NULL ;

	    (($row==$this->nrow-2) && ($col==0) && (($this->ncol%4)!=0)) ? $this->corner2($chr++) : NULL;

	    (($row==$this->nrow-2) && ($col==0) && (($this->ncol%8)==4)) ? $this->corner3($chr++) : NULL;

	    (($row==$this->nrow+4) && ($col==2) && (($this->ncol%8)==0)) ? $this->corner4($chr++) : NULL;

	    do{

	      if(($row < $this->nrow) && ($col>=0) && ($this->dataArray[$row*$this->ncol+$col]==0)){

		$this->utah($row, $col, $chr++);

	      }

	      $row -=2;

	      $col +=2;

	    }while(($row >= 0) && ($col < $this->ncol));

	    $row +=1;

	    $col +=3;

	    do{

	      if(($row >= 0) && ($col < $this->ncol) && ($this->dataArray[$row*$this->ncol+$col]==0)){

		$this->utah($row, $col, $chr++);

	      }

	      $row+=2;

	      $col-=2;

	    }while(($row < $this->nrow) && ($col >= 0));

	    $row +=3;

	    $col +=1;

	  }while(($row < $this->nrow) || ($col < $this->ncol));

	  if($this->dataArray[$this->nrow*$this->ncol-1]==0){

	    $this->dataArray[$this->nrow*$this->ncol-1] = $this->dataArray[$this->nrow*$this->ncol-2] = 1;

	  }

	}



	

	public function __destruct(){

	}

	

	}

	



	

// Exemple d'utilisation de la classe:

// Taille approximative du code barre en pixels (la taille la plus proche possible sera automatiquement calculee)

$approx_size=100;

// La chaine a encoder

$string = "123456";

// On instancie notre classe en envoyant la chaine a encoder comme argument du constructeur

$datamatrixMaker = new datamatrix($string);

// Et on trace le code barre avec comme argument la taille en pixels voulue

$datamatrixMaker->stroke($approx_size);



unset($datamatrixMaker);

Conclusion :

Impossible de trouver une classe équivalente ou que ce soit. Les Datamatrix sont des codes barres particulièrement ardus à générer. J'espère que ma contribution sera utile à quelqu'un. Pour l'instant, seul le mode ASCII est implémenté. Je mettrai a jour la source au fur et a mesure.

A voir également

Ajouter un commentaire

Commentaires

Optitech
Messages postés
134
Date d'inscription
samedi 19 octobre 2002
Statut
Membre
Dernière intervention
3 janvier 2009
-
Merci pour la source, j'ai cherché ceci pendant un bout de temps. Sinon merci aussi pour l'adresse de la norme. Je vais pouvoir la lire.
Yannikator
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012
-
Je trouve ça très intéressant. J'ai donc testé et l'algo est assez stable et rapide. Cependant un petit problème qu'on peut ce poser. J'ai fait le test avec l'exemple de wikipedia et je n'obtient pas le même résultat.
C'est peut-être du au fait que tu convertit la chaine en code ascii avant de passer en binaire. Cependant je me demande comment ils ont fait pour faire celle de wikipedia (string =Wikipedia, the free encyclopedia ).
Soit l'image de wikipedia est fausse, soit il y a un problème dans ton algo.
Sinon c'est bien sympas de voir son prénom en datamatrix.

SYL
TorTukiTu
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
18 avril 2011
1 -
YANNIKATOR,

Il existe plusieurs procédés de compaction de données pour les datamatrix. J'ai utilisé ici le mode ASCII, il existe pour info entre autre le mode C40 et TEXT. Pour le datamatrix de wikipedia, il est possible que l'un ou (et!) l'autre ait été utilisé. Il faut dans l'idéal calculer le gain de place suivant l'une ou l'autre méthode et sauter d'un mode de compaction à un autre afin de gagner un maximum de place.

En gros, on pourrait imaginer un datamatrix correspondant à un encodage en ASCII - C40 - TEXT qui, même si les données encodées sont les mêmes ne serait pas identique à un datamatrix uniquement en ASCII

Les autres méthodes sont en cors de test. Je les publierait dans le courant de la semaine prochaine.

Sinon, je te rappelle que cette source à été testée avec des longueurs de chaines de 6 et mois. Donc, je ne te garantis pas que ton 'Wikipedia' de 9 lettres va fonctionner correctement (à priori, c'est bon, mais étant donné que je n'ai pas testé, je vais pas me mouiller).

Je teste tout ça la semaine prochaine.

La tortue.
TorTukiTu
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
18 avril 2011
1 -
Et petite correction, c'est la norme ISO 16022 pas 16044 , je savas pas où j'vais la tête quand j'ai écris ça...
swisscad
Messages postés
1
Date d'inscription
dimanche 22 août 2010
Statut
Membre
Dernière intervention
1 septembre 2010
-
Excellent travail ! J'attends avec impatience une version permettant d'encoder des textes plus longs, type URL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (TorTukiTu)