رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
چرا تابع imagecolorstotal عدد صفر رو نشون می ده؟ (حل شد)
#1
سلام، بنده می خوام از تابع بالا برای گرفتن تعداد رنگ های مورد استفاده شده در یک تصویر استفاده کنم... این هم کدم :
<?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);
?>

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

برای تصاویر TrueColor خروجی صفر هست. میتونید پیکسل به پیکسل بخونید و رنگها رو توی آرایه بریزین و بعد با array_unique تکراریها رو حذف کنید و با count بشمارین.
پاسخ
تشکر شده توسط: abdollah110110 , ABZiko
#3
ممنون، استاد بنده اینطور نوشتمش :
$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 اومدم رنگ هر پیکسل رو گرفتم، ولی نمی دونم چطور باید رنگ های پیکسل ها رو توی یک آرایه بریزم ...
[عکس: v5dveblcrbgx.png]
پاسخ
تشکر شده توسط:
#4
میتونید این شکلی کار کنید:
$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 هستن، حجم کمی اشغال میکنه.
پاسخ
تشکر شده توسط: ABZiko
#5
ضمناً برای گرفتن پسوند فایل بهتره از pathinfo استفاده کنید:
$ext = pathinfo($file, PATHINFO_EXTENSION);
پاسخ
تشکر شده توسط: ABZiko
#6
واقعا ممنونم، یک سوال می شه این قسمت ها رو بیشتر توضیح بدین :
1. اون قسمت NULL که چرا برابر آرایه رنگ ها قرار گرفته ...
2. این تابع دقیقا چی کار می کنه، توی PHP.net خوندم ولی متوجه نشدم ...

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

2- اگه منظورتون pathinfo هست، یک اسم فایل رو میگیره و جزئیاتش رو برمیگردونه. مواردی مثل نام فایل، پسوند، نوع و... به شما تحویل میده. اگه منظورتون دستور دیگری هست هم بفرمایید توضیح بدم.
پاسخ
تشکر شده توسط: ABZiko
#8
بسیار ممنونم استاد شهرکی، می شه array_keys رو هم توضیح بدین .. ؟
[عکس: v5dveblcrbgx.png]
پاسخ
تشکر شده توسط:
#9
این تابع، کلیدها یا همون اندیسهای یه آرایه رو بصورت یه آرایه دیگه به شما تحویل میده. مثال:
$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
)
*/
پاسخ
تشکر شده توسط: ADMIN , ABZiko
#10
نقطه مقابل array_keys هم تابع array_values هست که مقادیر یه آرایه رو برمیگردونه.
پاسخ
تشکر شده توسط: ADMIN , ABZiko




کاربران در حال بازدید این موضوع: 1 مهمان