台灣最大程式設計社群網站
線上人數
1120
 
會員總數:246135
討論主題:189716
歡迎您免費加入會員
討論區列表 >> PHP >> php問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
php問題
價值 : 10 QP  點閱數:719 回應數:3
樓主

小夢
門外漢
0 11
191 15
發送站內信

這是我從serv上呼應我的php
卻跑出Warning: opendir((__FILE__)) [function.opendir]: failed to open dir: No error in C:\AppServ\www\girl\face.php on line 6

下面是我的程式碼


<?php
header("Content-Type:text/html; charset=utf-8");


$dirname=""; <-這個地方是問題的地方 應該怎修改才正確 請懂得高手們幫小弟這個
$dh=opendir($dirname);

$picasa_face = array();
$uploaddir = 'uploads/';
$filename = basename(getmilliseconds().".jpg");
$uploadfile = $uploaddir.basename($filename);
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
ImageResize($uploadfile, $uploadfile); //啟用縮圖
while ($dave=readdir($dh))
{
if ($dave != "." && $dave != ".." && $dave != "Thumbs.db")
$picasa_face[$dave] = ImageHash::isImageFileSimilar($uploadfile,$dirname.$dave) ;
}
asort($picasa_face);
echo json_encode(array_slice($picasa_face,0,5));
closedir ($dh);


}
class ImageHash {

/**取樣倍率 1~10
* @access public
* @staticvar int
* */
public static $rate = 2;

/**相似度允許值 0~64
* @access public
* @staticvar int
* */
public static $similarity = 0;

/**圖片類型對應的開啟函數
* @access private
* @staticvar string
* */
private static $_createFunc = array(
IMAGETYPE_GIF =>'imageCreateFromGIF',
IMAGETYPE_JPEG =>'imageCreateFromJPEG',
IMAGETYPE_PNG =>'imageCreateFromPNG',
IMAGETYPE_BMP =>'imageCreateFromBMP',
IMAGETYPE_WBMP =>'imageCreateFromWBMP',
IMAGETYPE_XBM =>'imageCreateFromXBM',
);


/**從檔案建立圖片
* @param string $filePath 檔案位址路徑
* @return resource 當成功開啟圖片則回傳圖片 resource ID,失敗則是 false
* */
public static function createImage($filePath){
if(!file_exists($filePath)){ return false; }

/*判斷檔案類型是否可以開啟*/
$type = exif_imagetype($filePath);
if(!array_key_exists($type,self::$_createFunc)){ return false; }

$func = self::$_createFunc[$type];
if(!function_exists($func)){ return false; }

return $func($filePath);
}


/**hash 圖片
* @param resource $src 圖片 resource ID
* @return string 圖片 hash 值,失敗則是 false
* */
public static function hashImage($src){
if(!$src){ return false; }

/*?小圖片尺寸*/
$delta = 8 * self::$rate;
$img = imageCreateTrueColor($delta,$delta);
imageCopyResized($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));

/*計算圖片灰階值*/
$grayArray = array();
for ($y=0; $y<$delta; $y++){
for ($x=0; $x<$delta; $x++){
$rgb = imagecolorat($img,$x,$y);
$col = imagecolorsforindex($img, $rgb);
$gray = intval(($col['red']+$col['green']+$col['blue'])/3)& 0xFF;

$grayArray[] = $gray;
}
}
imagedestroy($img);

/*計算所有像素的灰階平均值*/
$average = array_sum($grayArray)/count($grayArray);

/*計算 hash 值*/
$hashStr = '';
foreach ($grayArray as $gray){
$hashStr .= ($gray>=$average) ? '1' : '0';
}

return $hashStr;
}


/**hash 圖片檔案
* @param string $filePath 檔案位址路徑
* @return string 圖片 hash 值,失敗則是 false
* */
public static function hashImageFile($filePath){
$src = self::createImage($filePath);
$hashStr = self::hashImage($src);
imagedestroy($src);

return $hashStr;
}


/**比較兩個 hash 值,是不是相似
* @param string $aHash A圖片的 hash 值
* @param string $bHash B圖片的 hash 值
* @return bool 當圖片相似則回傳 true,否則是 false
* */
public static function isHashSimilar($aHash, $bHash){
$aL = strlen($aHash); $bL = strlen($bHash);
if ($aL !== $bL){ return false; }

/*計算容許落差的數量*/
$allowGap = $aL*(100-self::$similarity)/100;

/*計算兩個 hash 值的漢明距離*/
$distance = 0;
for($i=0; $i<$aL; $i++){
if ($aHash{$i} !== $bHash{$i}){ $distance++; }
}

return ($distance<=$allowGap) ? $distance: false;
}


/**比較兩個圖片檔案,是不是相似
* @param string $aHash A圖片的路徑
* @param string $bHash B圖片的路徑
* @return bool 當圖片相似則回傳 true,否則是 false
* */
public static function isImageFileSimilar($aPath, $bPath){
$aHash = ImageHash::hashImageFile($aPath);
$bHash = ImageHash::hashImageFile($bPath);
return ImageHash::isHashSimilar($aHash, $bHash);
}

}


function getmilliseconds() { //取豪秒
list ($usec, $sec) = explode(" ", microtime());
return (int)(((float) $usec + (float) $sec) * 1000);
}

function ImageResize($from_filename, $save_filename, $in_width=400, $in_height=300, $quality=100) //縮圖
{
$allow_format = array('jpeg', 'png', 'gif');
$sub_name = $t = '';

// Get new dimensions
$img_info = getimagesize($from_filename);
$width = $img_info['0'];
$height = $img_info['1'];
$imgtype = $img_info['2'];
$imgtag = $img_info['3'];
$bits = $img_info['bits'];
// $channels = $img_info['channels'];
$mime = $img_info['mime'];

list($t, $sub_name) = explode('/', $mime);
if ($sub_name == 'jpg') {
$sub_name = 'jpeg';
}

if (!in_array($sub_name, $allow_format)) {
return false;
}

$percent = getResizePercent($width, $height, $in_width, $in_height);
$new_width = $width * $percent;
$new_height = $height * $percent;


$image_new = imagecreatetruecolor($new_width, $new_height);


$function_name = 'imagecreatefrom'.$sub_name;
$image = $function_name($from_filename);
imagecopyresampled($image_new, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

return imagejpeg($image_new, $save_filename, $quality);
}


function getResizePercent($source_w, $source_h, $inside_w, $inside_h)//縮圖
{
if ($source_w < $inside_w && $source_h < $inside_h) {
return 1; // Percent = 1, 如果都比預計縮圖的小就不用縮
}

$w_percent = $inside_w / $source_w;
$h_percent = $inside_h / $source_h;

return ($w_percent > $h_percent) ? $h_percent : $w_percent;
}


?>

本篇文章發表於2013-11-30 01:00
1樓
最有價值解答

Qinghua
檢舉此回應
首先.....請善用小舖編輯器的
code直接貼上來也不編排一下......看起來真是痛苦(這code我只看前面幾行就不看了)......
回到正題...你的$dirname為空的那opendir當然會錯(你又沒給它要開啟的目錄路徑)
本篇文章回覆於2013-11-30 12:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

小夢
檢舉此回應
不好意思 第一次發文沒善用工具很抱歉
那請問大大$dirname=
這語法是去開啟某個目錄檔案下的東西嗎
如果要呼叫語法該怎使用
本篇文章回覆於2013-12-01 15:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
http://php.net/manual/en/function.opendir.php
本篇文章回覆於2013-12-02 01:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.