인쇄물을 만들기 위해 색상별로 정렬하고 싶은 10,000 개의 이미지가 있습니다.10,000 개의 이미지를 색상별로 정렬하기
나는 꽤 멀어지고 있습니다. 나는 그들의 색을 평균 했으므로 이제는 두 개의 디렉토리가 있습니다 : 하나는 모든 원본 이미지 (original_images /)이고 하나는 동일한 평균 색상 (평균 /)의 jpeg입니다. 키 (분명히)에서 $h
범위 -0.1666666667 어딘가에 1. 내 직감으로는 가능성이 있다고 말한다
// $images is an array with all the filenames.
$sorted_images = array();
$loop_limit = count($images);
for($i = 0; $i < $loop_limit; $i++) {
$image = imagecreatefromjpeg("averages/" . $images[$i]);
$rgb = imagecolorat($image, 50, 50);
imagedestroy($image);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$hsv = rgb_to_hsv($r, $g, $b); // function to convert rgb to Hue/Sat/Value
$h = (string) $hsv['H'];
if(isset($sorted_h[$h])) {
$duplicates++;
echo("oh no! " . $h . " is a dupe! found " . $duplicates . " duplicates so far.<br>");
}
$sorted_h[$h] = $images[$i];
}
// sort the array by key:
ksort($sorted_images, SORT_NUMERIC);
편집 문제가 :
다음, 나는 평균 이미지를 정렬 PHP를 사용 실제로는 값이 중복되지만 실제로는 6000 개가 넘는 중복 키가됩니다. 어쩌면 배열 키가 반올림되었다고 생각했기 때문에 $h
값을 문자열에 캐스팅하려고 시도 했습니까?
그래도 작동하지 않았습니다. 이것은 rgb를 HSV로 변환하는 기능입니다. 기능 정확한 -
- 가 rgb_to_hsv()이다 : 나는
그래서 질문은 지금 ... 모든 문서없이 어딘가에 그것을 발견?function RGB_TO_HSV ($R, $G, $B) { $HSV = array(); $var_R = ($R/255); $var_G = ($G/255); $var_B = ($B/255); $var_Min = min($var_R, $var_G, $var_B); $var_Max = max($var_R, $var_G, $var_B); $del_Max = $var_Max - $var_Min; $V = $var_Max; if ($del_Max == 0) { $H = 0; $S = 0; } else { $S = $del_Max/$var_Max; $del_R = ((($max - $var_R)/6) + ($del_Max/2))/$del_Max; $del_G = ((($max - $var_G)/6) + ($del_Max/2))/$del_Max; $del_B = ((($max - $var_B)/6) + ($del_Max/2))/$del_Max; if ($var_R == $var_Max) $H = $del_B - $del_G; else if ($var_G == $var_Max) $H = (1/3) + $del_R - $del_B; else if ($var_B == $var_Max) $H = (2/3) + $del_G - $del_R; if (H<0) $H++; if (H>1) $H--; } $HSV['H'] = $H; $HSV['S'] = $S; $HSV['V'] = $V; return $HSV; }
- 배열에서 키를 덮어 쓰지 않지만 값을 (밀접하게) 유지 관리하려면 어떻게해야합니까? 예를 들면; 두 이미지의 $ h 값이 0.01111111111 인 경우 두 번째 이미지가 배열로 푸시 될 때 키는 0.01111111112 여야합니다.
(구 편집 : 편집 : 10,000 이미지를이 ;-) 잘못 할 때마다 다시 업로드 할 필요가 없도록 나는 copy()
에 rename()
을 변경했습니다. 또한 ini_set("max_execution_time", 300);
을 사용하여 최대 실행 시간을 60에서 300으로 늘렸고 imagedestroy($image)
을 추가하여 메모리 사용량을 줄였으며 $i < count($images)
을 $loop_limit = count($images)
으로 변경하여 for 루프로 개선했습니다.
편집 2 : 그래, 문제가 있음을 발견했습니다. 이미지의 $ h (색조) 값은 항상 동일합니다. 따라서 sorted_images[$h] = $images[$i]
을 사용하면 배열의 해당 키 값을 덮어 씁니다. 사실로; 6000 개가 넘는 중복 값이 나왔습니다 ... $ h 값을 너무 많이 사용하지 않고 어떻게할까요?
반복 후에 'imagedestroy ($ image);'를 잊지 마세요. –
'for' 루프의'count ($ images)'는 이제까지 최악의 연습이었습니다! –
정식으로 언급 됨, 업데이트 됨 :). – Rein