php 獲取一張圖片所有點的顏色值
阿新 • • 發佈:2018-12-31
<?php //similar_text($numStr, $val, $pre); //計算兩個字串的相似度 //print_r($pre); $imgPath = 'time.jpg'; $size = getimagesize($imgPath);//得到圖片的資訊 $im = imagecreatefromjpeg($imgPath);//建立一張圖片 //$rgb = imagecolorat($im, 100, 100);//得到任意一點的顏色值 //$aa = imagecolorsforindex($im, $rgb); // print_r($size); //410 =>0 //188 =>1 for ($i = 0; $i < $size[1]; ++ $i) { for ($j = 0; $j < $size[0]; ++$j) { $rgb = imagecolorat($im, $j, $i); //取得某畫素的顏色索引值 $rgbarray[$i][$j] = imagecolorsforindex($im, $rgb);//取得某索引的顏色 //foreach ($rgbarray as $key =>$value){ } } print_r($rgbarray); echo "<img src=\"time.jpg\" />";
<?php class gjPhone { protected $imgPath; // 圖片路徑 protected $imgSize; // 圖片大小 protected $hecData; // 分離後陣列 protected $horData; // 橫向整理的資料 protected $verData; // 縱向整理的資料 function __construct ($path) { $this->imgPath = $path; } public function getHec () { $size = getimagesize($this->imgPath); //獲取圖片資訊陣列 $res = imagecreatefrompng($this->imgPath); //建立一個新影象 for ($i = 0; $i < $size[1]; ++ $i) { for ($j = 0; $j < $size[0]; ++ $j) { $rgb = imagecolorat($res, $j, $i); //取得某畫素的顏色索引值 $rgbarray = imagecolorsforindex($res, $rgb);//取得某索引的顏色 if ($rgbarray['red'] < 125 || $rgbarray['green'] < 125 || $rgbarray['blue'] < 125) { $data[$i][$j] = 1; } else { $data[$i][$j] = 0; } } } $this->imgSize = $size; //圖片大小 $this->hecData = $data; //分離後陣列 } public function magHorData () { $data = $this->hecData; $size = $this->imgSize; $z = 0; for ($i = 0; $i < $size[1]; ++ $i) { if (in_array('1', $data[$i])) { $z ++; for ($j = 0; $j < $size[0]; ++ $j) { if ($data[$i][$j] == '1') { $newdata[$z][$j] = 1; } else { $newdata[$z][$j] = 0; } } } } return $this->horData = $newdata; } public function showPhone ($ndatas) { error_reporting(0); $phone = null; $d = 0; foreach ($ndatas as $key => $val) { if (in_array(1, $val)) { //檢查陣列中是否有某個值 foreach ($val as $k => $v) { $ndArr[$d] .= $v; } } if (! in_array(1, $val)) { $d ++; } } foreach ($ndArr as $key01 => $val01) { $phone .= $this->initData($val01); } return $phone; } /** * 初始資料 */ public function initData ($numStr) { $result = null; $data = array( '1' => '00000000111000000000000001110000000001001000100000000010100011000000000011000110000000000110000100000000010110011000000', '5' => '00000000001000000000000000010000000000100100100000000000101001110000000000100000110000000011000000100000001101000010000', '10' => '00000011100011100000000011001100100100100010010001000110000100100010001100001001000100011000010010001001001001100010100' ); foreach ($data as $key => $val) { similar_text($numStr, $val, $pre); //計算兩個字串的相似度 if ($pre > 95) { // 相似度95%以上 $result = $key; break; } } return $result; } } $imgurl = 'jd.png'; list ($width, $heght, $type, $attr) = getimagesize($imgurl); $new_w = 17; $new_h = 11; $thisimage = imagecreatetruecolor($new_w, $new_h); // $new_w, $new_h 為裁剪後的圖片寬高 //新建一個真彩色影象 imagecreatetruecolor $background = imagecolorallocate($thisimage, 255, 255, 255); //為一幅影象分配顏色 imagefilledrectangle($thisimage, 0, 0, $new_w, $new_h, $background); //畫一矩形並填充 $oldimg = imagecreatefrompng($imgurl); // 載入原始圖片 // 首先定位要取圖的位置(這裡可以通過前端js或者其他手段定位,由於我這是測試,所以就ps定位並寫死了) $weizhi = array( '1' => 165, '5' => 308, '10' => 456 ); foreach ($weizhi as $wwzz) { $src_y = 108; imagecopy($thisimage, $oldimg, 0, 0, $wwzz, $src_y, $new_w, $new_h); // $src_y,$new_w為原圖中裁剪區域的左上角座標拷貝影象的一部分將src_im影象中座標從src_x,src_y開始,寬度為src_w,高度為src_h的一部分拷貝到dst_im影象中座標為dst_x和dst_y的位置上。 $tem_png = 'tem_1.png'; imagepng($thisimage, __DIR__ . '/' . $tem_png); // 通過定位從原圖中copy出想要識別的位置並生成新的快取圖,用以後面的影象識別類使用。 $gjPhone = new gjPhone($tem_png); // 例項化類 $gjPhone->getHec(); // 進行影象畫素分離 $horData = $gjPhone->magHorData(); // 將分離出是資料轉成01表示的影象、這裡可以根據自己喜好定 $phone = $gjPhone->showPhone($horData); // 將轉換好的01表示的資料與庫中的資料進行匹配,匹配度95以上就算成功,庫這裡由於是做測試就直接寫了陣列 echo '| ' . $phone . ' | '; }