تالار گفتمان nCIS.ir

نسخه‌ی کامل: چرا تابع imagecolorstotal عدد صفر رو نشون می ده؟ (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.

ABZiko

سلام، بنده می خوام از تابع بالا برای گرفتن تعداد رنگ های مورد استفاده شده در یک تصویر استفاده کنم... این هم کدم :
<?php
$arr=explode('.',$img);
$format=$arr[1];
if($format='png'){
	$newImg=imagecreatefrompng($img);
}
elseif($format='jpg'){
	$newImg=imagecreatefromjpeg($img);
}
elseif($format='gif'){
	$newImg=imagecreatefromgif($img);
}
else{
	echo "Your file doesn't support !";
}
$t=imagecolorstotal($newImg);
echo 'Your all colors are '.$t;
imagedestroy($newImg);
?>

کار می کنه ولی تعداد رنگ ها رو همیشه صفر نشون می ده ... مشکل چیه ؟
مستنداتش رو خوندین:
نقل قول:
Returns the number of colors in the specified image's palette or 0 for truecolor images.

برای تصاویر TrueColor خروجی صفر هست. میتونید پیکسل به پیکسل بخونید و رنگها رو توی آرایه بریزین و بعد با array_unique تکراریها رو حذف کنید و با count بشمارین.

ABZiko

ممنون، استاد بنده اینطور نوشتمش :
$arr=explode('.',$img);
$format=$arr[1];
if($format='png'){
	$newImg=imagecreatefrompng($img);
}
elseif($format='jpg'){
	$newImg=imagecreatefromjpeg($img);
}
elseif($format='gif'){
	$newImg=imagecreatefromgif($img);
}
else{
	echo "Your file doesn't support !";
}
$width=imagesx($newImg);
$height=imagesy($newImg);

for($x=0;$x < $width;$x++){
	for($y=0;$y < $height;$y++){
		$colors=imagecolorat($newImg,$x,$y);
		// Array should be typed here
		echo count(array_unique($colorsTotal));
	}
}

با تابع imagecolorat اومدم رنگ هر پیکسل رو گرفتم، ولی نمی دونم چطور باید رنگ های پیکسل ها رو توی یک آرایه بریزم ...
میتونید این شکلی کار کنید:
$colors = array();
$w = imagesx($img);
$h = imagesy($img);
for($i = 0; $i < $w; $i++) {
    for($j = 0; $j < $h; $j++) {
        $colors[imagecolorat($img, $i, $j)] = NULL;
    }
}
$colors = array_keys($colors);

این روش سرعت بیشتری داره. نیازی به array_unique که نسبتاً کند هست هم ندارین چون درصورت تکرار رنگ، دوباره توی همون خونه از آرایه قرار میگیره. آرایه هم بدلیل اینکه مقادیرش NULL هستن، حجم کمی اشغال میکنه.
ضمناً برای گرفتن پسوند فایل بهتره از pathinfo استفاده کنید:
$ext = pathinfo($file, PATHINFO_EXTENSION);

ABZiko

واقعا ممنونم، یک سوال می شه این قسمت ها رو بیشتر توضیح بدین :
1. اون قسمت NULL که چرا برابر آرایه رنگ ها قرار گرفته ...
2. این تابع دقیقا چی کار می کنه، توی PHP.net خوندم ولی متوجه نشدم ...

ببخشید به خدا که این قدر اذیت می کنم ...
1- بجای اینکه رنگها رو توی مقادیر آرایه بگذارم، توی اندیسها گذاشتم. اینطوری لازم نیست با in_array چک کنیم رنگ توی آرایه ذخیره شده یا نه یا بعداً با array_unique مقادیر تکراری رو حذف کنیم. وقتی یک رنگ تکراری بدست بیاد، دوباره همون خونه از آرایه مقداردهی میشه (چون عدد مربوط به رنگ رو بعنوان اندیس آرایه استفاده کردیم). مقدار NULL هم برای اینه که هر خونه از آرایه، فضایی توی حافظه اشغال نکنه. هر مقدار دیگه بجز NULL باعث مصرف حافظه میشه. ما فقط اندیسها رو لازم داریم و نمیخوایم برای مقدار عناصر آرایه، فضا مصرف بشه.

2- اگه منظورتون pathinfo هست، یک اسم فایل رو میگیره و جزئیاتش رو برمیگردونه. مواردی مثل نام فایل، پسوند، نوع و... به شما تحویل میده. اگه منظورتون دستور دیگری هست هم بفرمایید توضیح بدم.

ABZiko

بسیار ممنونم استاد شهرکی، می شه array_keys رو هم توضیح بدین .. ؟
این تابع، کلیدها یا همون اندیسهای یه آرایه رو بصورت یه آرایه دیگه به شما تحویل میده. مثال:
$student = array(
    'name' => 'ali',
    'family' => 'Ahmadi',
    'father' => 'Mohsen',
    'Grade' => 12.5,
);
print_r(array_keys($student));
/* Output:
Array
(
    [0] => name
    [1] => family
    [2] => father
    [3] => Grade
)
*/
نقطه مقابل array_keys هم تابع array_values هست که مقادیر یه آرایه رو برمیگردونه.