From 011fcf00c22ff4735cd40ae6bf71f80faf04a846 Mon Sep 17 00:00:00 2001 From: sayadaazami Date: Wed, 2 Nov 2016 08:57:20 +0330 Subject: [PATCH] add getImage method --- src/FarsiGD.php | 329 +++++++++++++++++++++++++++++++++++++ src/Plate.php | 40 +++++ src/Resources/BTraffic.ttf | Bin 0 -> 52992 bytes src/Resources/plate.png | Bin 0 -> 6442 bytes src/config.php | 1 + 5 files changed, 370 insertions(+) create mode 100644 src/FarsiGD.php create mode 100644 src/Resources/BTraffic.ttf create mode 100644 src/Resources/plate.png diff --git a/src/FarsiGD.php b/src/FarsiGD.php new file mode 100644 index 0000000..797667e --- /dev/null +++ b/src/FarsiGD.php @@ -0,0 +1,329 @@ + array('ﺂ', 'ﺂ', 'آ'), + 'ا' => array('ﺎ', 'ﺎ', 'ا'), + 'ب' => array('ﺐ', 'ﺒ', 'ﺑ'), + 'پ' => array('ﭗ', 'ﭙ', 'ﭘ'), + 'ت' => array('ﺖ', 'ﺘ', 'ﺗ'), + 'ث' => array('ﺚ', 'ﺜ', 'ﺛ'), + 'ج' => array('ﺞ', 'ﺠ', 'ﺟ'), + 'چ' => array('ﭻ', 'ﭽ', 'ﭼ'), + 'ح' => array('ﺢ', 'ﺤ', 'ﺣ'), + 'خ' => array('ﺦ', 'ﺨ', 'ﺧ'), + 'د' => array('ﺪ', 'ﺪ', 'ﺩ'), + 'ذ' => array('ﺬ', 'ﺬ', 'ﺫ'), + 'ر' => array('ﺮ', 'ﺮ', 'ﺭ'), + 'ز' => array('ﺰ', 'ﺰ', 'ﺯ'), + 'ژ' => array('ﮋ', 'ﮋ', 'ﮊ'), + 'س' => array('ﺲ', 'ﺴ', 'ﺳ'), + 'ش' => array('ﺶ', 'ﺸ', 'ﺷ'), + 'ص' => array('ﺺ', 'ﺼ', 'ﺻ'), + 'ض' => array('ﺾ', 'ﻀ', 'ﺿ'), + 'ط' => array('ﻂ', 'ﻄ', 'ﻃ'), + 'ظ' => array('ﻆ', 'ﻈ', 'ﻇ'), + 'ع' => array('ﻊ', 'ﻌ', 'ﻋ'), + 'غ' => array('ﻎ', 'ﻐ', 'ﻏ'), + 'ف' => array('ﻒ', 'ﻔ', 'ﻓ'), + 'ق' => array('ﻖ', 'ﻘ', 'ﻗ'), + 'ک' => array('ﻚ', 'ﻜ', 'ﻛ'), + 'گ' => array('ﮓ', 'ﮕ', 'ﮔ'), + 'ل' => array('ﻞ', 'ﻠ', 'ﻟ'), + 'م' => array('ﻢ', 'ﻤ', 'ﻣ'), + 'ن' => array('ﻦ', 'ﻨ', 'ﻧ'), + 'و' => array('ﻮ', 'ﻮ', 'ﻭ'), + 'ی' => array('ﯽ', 'ﯿ', 'ﯾ'), + 'ك' => array('ﻚ', 'ﻜ', 'ﻛ'), + 'ي' => array('ﻲ', 'ﻴ', 'ﻳ'), + 'أ' => array('ﺄ', 'ﺄ', 'ﺃ'), + 'ؤ' => array('ﺆ', 'ﺆ', 'ﺅ'), + 'إ' => array('ﺈ', 'ﺈ', 'ﺇ'), + 'ئ' => array('ﺊ', 'ﺌ', 'ﺋ'), + 'ة' => array('ﺔ', 'ﺘ', 'ﺗ') + ); + public $tahoma = array( + 'ه' => array('ﮫ', 'ﮭ', 'ﮬ') + ); + public $normal = array( + 'ه' => array('ﻪ', 'ﻬ', 'ﻫ') + ); + public $mp_chars = array('آ', 'ا', 'د', 'ذ', 'ر', 'ز', 'ژ', 'و', 'أ', 'إ', 'ؤ'); + public $ignorelist = array('', 'ٌ', 'ٍ', 'ً', 'ُ', 'ِ', 'َ', 'ّ', 'ٓ', 'ٰ', 'ٔ', 'ﹶ', 'ﹺ', 'ﹸ', 'ﹼ', 'ﹾ', 'ﹴ', 'ﹰ', 'ﱞ', 'ﱟ', 'ﱠ', 'ﱡ', 'ﱢ', 'ﱣ',); + public $openClose = array('>', ')', '}', ']', '<', '(', '{', '['); + public $en_chars = 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'); +/// + public function persianText($str, $z="", $method='tahoma', $farsiNumber=true) { + $str = $str . ' '; + $en_str = ''; + $runWay = ''; + $num = ''; + $output = ''; + $str_back = ''; + $e_output = ''; + if ($method == 'tahoma') { + $this->p_chars = array_merge($this->p_chars, $this->tahoma); + } else { + $this->p_chars = array_merge($this->p_chars, $this->normal); + } + $str_len = $this->utf8_strlen($str); + preg_match_all("/./u", $str, $ar); + for ($i = 0; $i < $str_len; $i++) { + $gatherNumbers = false; + $runWay = null; + $str1 = $ar[0][$i]; + if (isset($ar[0][$i + 1]) && in_array($ar[0][$i + 1], $this->ignorelist)) { + $str_next = $ar[0][$i + 2]; + if ($i == 2) + $str_back = $ar[0][$i - 2]; + if ($i != 2) + $str_back = $ar[0][$i - 1]; + }elseif (isset($ar[0][$i + 1]) && isset($ar[0][$i - 1]) && !in_array($ar[0][$i - 1], $this->ignorelist)) { + $str_next = $ar[0][$i + 1]; + if ($i != 0) + $str_back = $ar[0][$i - 1]; + }else { + if (isset($ar[0][$i + 1]) && !empty($ar[0][$i + 1])) { + $str_next = $ar[0][$i + 1]; + } else if(isset($ar[0][$i - 1])){ + $str_next = $ar[0][$i - 1]; + } + if ($i != 0 && isset($ar[0][$i - 2])) + $str_back = $ar[0][$i - 2]; + } + if (!in_array($str1, $this->ignorelist)) { + if (array_key_exists($str1, $this->p_chars)) { + if (!$str_back or $str_back == " " or !array_key_exists($str_back, $this->p_chars)) { + if (!array_key_exists($str_back, $this->p_chars) and !array_key_exists($str_next, $this->p_chars)) + $output = $str1 . $output; + else + $output = $this->p_chars[$str1][2] . $output; + continue; + }elseif (array_key_exists($str_next, $this->p_chars) and array_key_exists($str_back, $this->p_chars)) { + if (in_array($str_back, $this->mp_chars) and array_key_exists($str_next, $this->p_chars)) { + $output = $this->p_chars[$str1][2] . $output; + } else { + $output = $this->p_chars[$str1][1] . $output; + } + continue; + } elseif (array_key_exists($str_back, $this->p_chars) and !array_key_exists($str_next, $this->p_chars)) { + if (in_array($str_back, $this->mp_chars)) { + // just font FREEFARSI work for H at end of sth that not connected like Dah! + $output = $str1 . $output; + } else { + $output = $this->p_chars[$str1][0] . $output; + } + continue; + } + } elseif ($z == "fa") { + + $number = array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "۴", "۵", "۶", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + switch ($str1) { + case ")" : $str1 = "("; + break; + case "(" : $str1 = ")"; + break; + case "}" : $str1 = "{"; + break; + case "{" : $str1 = "}"; + break; + case "]" : $str1 = "["; + break; + case "[" : $str1 = "]"; + break; + case ">" : $str1 = "<"; + break; + case "<" : $str1 = ">"; + break; + } + if (in_array($str1, $number)) { + if ( $farsiNumber ) { + $num .= $this->fa_number($str1); + $runWay[] = '1'; + } else { + $num .= $str1; + $runWay[] = '2'; + } + $str1 = ""; + } + + if ( !in_array($str_next, $number) ) { + if ( in_array(strtolower($str1), $this->en_chars) or (($str1==' ' or $str1=='.') and $en_str!='' and !in_array($str_next, $this->p_chars)) ) { + $en_str .= $str1 . $num; + $str1 = ''; + $runWay[] = '3'; + } else { + if ( $en_str!='' ) { + if ( $i+1==$str_len ) { + $runWay[] = '3.5'; + $str1 = $str1.$num; + } else { + $en_str .= $str1 .$num; + $runWay[] = '4'; + } + } else { + $str1 = $str1.$num; + $runWay[] = '5'; + } + + } + $num = ''; + } + if ( $en_str!='' or ($str1!='' and $i==0 and ( !array_key_exists($str_next, $this->p_chars) and $str_next!=' ' )) or $gatherNumbers ) { //or ($str1!='' and $i==0) + + if ( !array_key_exists($str1, $this->p_chars) ) { + if ( !array_key_exists($str_next, $this->p_chars) and $str_next!=' ' and !in_array($str_next, $this->openClose) ) { + $en_str = $en_str.$str1; + $runWay[] = '6'; + } else { + if ( in_array($ar[0][$i+2], $this->en_chars) ) { + $en_str = $en_str.$str1; + $runWay[] = '7'; + } else { + + if ( $str_next==' ' and ( in_array($ar[0][$i+2], $number) or in_array(strtolower($ar[0][$i+2]), $this->en_chars) ) ) { + $en_str = $en_str.$str1; + $runWay[] = '8'; + } else { + //if ( in_array($str_next, $this->openClose) and in_array(strtolower($str_back), $this->en_chars) ) { + // $output = $output . $en_str; + // $en_str = ''; + // $en_str = $en_str.$str1; + // $i++; + // continue; + //$output = $output . $en_str; + //$en_str=''; + // $runWay[] = '9.5'; + // } else { + $output = $en_str . $output; + $en_str = ''; + $runWay[] = '9'; + // } + } + + } + } + + } else { + if ( $num ) { + $en_str = $en_str .$num; + $runWay[] = '10'; + } else { + $output = $en_str . $str1 . $output ; + $en_str = ''; + $runWay[] = '11'; + } + } + + } else { + + if ( in_array($str1, $number) and $str_next=='.' and in_array($ar[0][$i+2], $number) ) { + $en_str = $str1; + $runWay[] = '12'; + } else { + //if ( in_array($str1, $this->openClose) and in_array($str_next, $this->en_chars) ) { + // $output = $str1.$output ; + // $runWay[] = '13'; + //} else { + $output = $str1. $output ; + $runWay[] = '14'; + // } + } + } + } else { + if (($str1 == "،") or ($str1 == "؟") or ($str1 == "ء") or (array_key_exists($str_next, $this->p_chars) and array_key_exists($str_back, $this->p_chars)) or + ($str1 == " " and array_key_exists($str_back, $this->p_chars)) or ($str1 == " " and array_key_exists($str_next, $this->p_chars))) { + if ($e_output) { + $output = $e_output . $output; + $e_output = ""; + } + $output = $str1 . $output; + } else { + $e_output.=$str1; + if (array_key_exists($str_next, $this->p_chars) or $str_next == "") { + $output = $e_output . $output; + $e_output = ""; + } + } + } + } else { + $output = $str1 . $output; + } + + //fb("str1: {$str1} | num: {$num} | output: {$output} | enSter: {$en_str} | strNex: {$str_next} | strBack: {$str_back}| path: ". implode('-',$runWay) ); + + $str_next = null; + $str_back = null; + } + + if ( $en_str!='' ) { + $output = $en_str . $output ; + } + return $output; + } + + public function fa_number($num) { + $AF = array( + 0 => "٠", + 1 => "١", + 2 => "٢", + 3 => "٣", + 4 => "۴", + 5 => "۵", + 6 => "۶", + 7 => "٧", + 8 => "٨", + 9 => "٩" + ); + + $af_date = NULL; + $chars = preg_split('//', $num, -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $key => $val) { + $af_num = NULL; + switch ($val) { + case "0"; + $af_num = $AF[0]; + break; + case "1": + $af_num = $AF[1]; + break; + case "2": + $af_num = $AF[2]; + break; + case "3": + $af_num = $AF[3]; + break; + case "4": + $af_num = $AF[4]; + break; + case "5": + $af_num = $AF[5]; + break; + case "6": + $af_num = $AF[6]; + break; + case "7": + $af_num = $AF[7]; + break; + case "8": + $af_num = $AF[8]; + break; + case "9": + $af_num = $AF[9]; + break; + default : + $af_num = $val; + } + $af_date .=$af_num; + } + return $af_date; + } +} + +?> \ No newline at end of file diff --git a/src/Plate.php b/src/Plate.php index cf164d9..3dac7e1 100644 --- a/src/Plate.php +++ b/src/Plate.php @@ -5,18 +5,23 @@ use Plate\Exception\StateIsNotValid; use Plate\Exception\CityNotFound; use Plate\Exception\PlateIsNotValid; +use Plate\FarsiGD; class Plate{ private $_plate = null; private $_parsed = null; private $_data = null; private $_suportedChars = null; + private $_farsiGD = null; + private $_underLineChars = null; public function __construct(){ $config = config('plate'); $this->_data = $config['state_data']; $this->_suportedChars = $config['supported_chars']; + $this->_underLineChars = $config['under_line_chars']; + $this->_farsiGD = new FarsiGD(); } private function parse(){ @@ -127,4 +132,39 @@ public function get3DigitNumber(){ public function isCab(){ return $this->_parsed['type'] === 'تاکسی' ? true : false; } + + public function getImage($exportPath){ + $data = $this->getparsedData(); + $resourcePath = __DIR__ . DIRECTORY_SEPARATOR . 'Resources' . DIRECTORY_SEPARATOR; + $im = imagecreatefrompng($resourcePath . 'plate.png'); + $font = $resourcePath . 'BTraffic.ttf'; + $color = imagecolorallocate($im, 20, 20, 20); + + $this->_gdDrawText($data['stateNumber'], $im, $font, 48, $color, 268, 20); // draw state number + $underlineChars = ['','','','','','','','','','','','','','','','']; + + $charLen = mb_strlen($data['char']); + $fontSize = $charLen == 3 ? 53 : 54; + $fontSizeChar = $charLen == 3 ? 12 : 7; + $y = $charLen == 3 ? 5 : 4; + $yChar = in_array($data['char'], $this->_underLineChars) ? $y - 4 : $y + ($charLen == 3 ? 12 : 9); + $x1 = $charLen == 3 ? 35 : 43; + $x2 = $x1 + ($charLen == 3 ? 54 : 58); + $x3 = $x2 + ($charLen == 3 ? 80 : 65); + $this->_gdDrawText($data['2DigitNumber'], $im, $font, $fontSize, $color, $x1, $y, false); // draw number + $this->_gdDrawText($data['char'], $im, $font, $fontSize - $fontSizeChar, $color, $x2, $yChar); // draw number + $this->_gdDrawText($data['3DigitNumber'], $im, $font, $fontSize, $color, $x3, $y, false); // draw number + + imagepng($im, $exportPath); + imagedestroy($im); + } + + private function _gdDrawText($text, $im, $font, $fontSize, $color, $x=0, $y=0, $rtl=true){ + if($rtl){ + $text = $this->_farsiGD->persianText($text, 'fa', 'normal'); + } + + $y += $fontSize; + imagettftext($im, $fontSize, 0, $x, $y , $color, $font, $text); + } } \ No newline at end of file diff --git a/src/Resources/BTraffic.ttf b/src/Resources/BTraffic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5eee232828041b753530b59c683e4613a87d99ae GIT binary patch literal 52992 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%0AFy?o73NUB9jhOX?7LbDUq=;#<|J!bfVvldOpF> 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 'شخصی', 'ی' => 'شخصی' ], + 'under_line_chars' => ['ج', 'ز', 'ژ', 'س', 'ش', 'ص', 'ع', 'ق', 'ل', 'م', 'ن', 'و', 'ی'], 'state_data' => [ 'تهران' =>[ 11 =>[