2012-10-16 2 views
5

인쇄물을 만들기 위해 색상별로 정렬하고 싶은 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로 변환하는 기능입니다. 기능 정확한 -

  1. 가 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; 
    } 
    

    그래서 질문은 지금 ... 모든 문서없이 어딘가에 그것을 발견?
  2. 배열에서 키를 덮어 쓰지 않지만 값을 (밀접하게) 유지 관리하려면 어떻게해야합니까? 예를 들면; 두 이미지의 $ 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 값을 너무 많이 사용하지 않고 어떻게할까요?

+2

반복 후에 'imagedestroy ($ image);'를 잊지 마세요. –

+1

'for' 루프의'count ($ images)'는 이제까지 최악의 연습이었습니다! –

+0

정식으로 언급 됨, 업데이트 됨 :). – Rein

답변

1

오류 메시지를 사용 설정하려고 시도 했습니까?

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

로컬 대 마스터 값과 같습니다. 'local'은 현재 실행중인 스크립트가 300 초의 시간 초과를 사용하고 있음을 의미합니다. 'master'는 다른 모든 요청에 ​​적용됩니다 (명시 적으로 수정하지 않는 한).

Cron은 갈 수있는 방법이지만, X 초/분/시간마다 여러 번 실행해야한다고 생각하지 않습니까? 이렇게하려면 명령 줄을 사용하면됩니다.자세한 내용은 이쪽을 봐 : http://www.php.net/manual/en/features.commandline.usage.php

을 스크립트는 대부분 다음 문제 중 하나의 작품으로 보는 :

memory_limit를 충분히 높은 없음. 오류가 활성화 된 PHP 오류를 제공해야합니다. 실행 시간이 충분하지 않습니다. 오류가 활성화 된 PHP 오류를 제공해야합니다.

init_set 메서드를 사용하여 스크립트를 실행하려는 경우 init_set 메서드를 사용하여 시간 제한을 0 초로 설정하고 가능한 한 메모리 제한을 높게 설정하십시오. 정확한 원인을 실제로 배우고 싶다면 'xdebug'를 조사하여 메모리 누수가 있는지 또는 어떤 명령이 실행하는 데 가장 오랜 시간이 걸리는지 생각할 수 있습니다. 코드를 살펴보면 복사 명령을 실행하는 데 시간이 걸릴 것으로 추측합니다 (1ms 이상, 10000 회 반복 이후 많이 발생 함)

이 값을 수정할 수 없거나 장난감을 갖고 싶다면 제한된 리소스를 사용하여 메모리가 많은 긴 실행 시간 스크립트로 작업하는 경우 일괄 적으로 이름 바꾸기를 실행하도록 스크립트를 다시 작성하고 모든 X 분마다 스크립트를 실행하도록 cron을 설정하십시오 (모든 이미지가 완료되면 cron을 제거하십시오)

행운을 빌어 요.

+0

감사 :-). 사실 나는이 문제를 마무리하고있다. 스크립트를 수정하여 메모리를 덜 집중적으로 사용할 수있게하는 것이 항상 좋은 방법입니다. 그러나 실제로 배열 자체에 문제가 있다고 생각하기 시작했습니다. 어떤 이유로 배열의 ** 많은 ** 키가 덮어 쓰기됩니다. 이 질문에 대한 자세한 내용을 업데이트하겠습니다. – Rein

+1

색조 키, 특히 10000 개의 이미지를 사용하면 충분히 고유하지 않을 수 있습니다. 색조 키에 실제로는 하나의 이미지 (단순 : sorted_images [$ h] [] = $ images [$ i];)가 아닌 색조의 모든 이미지가 포함 된 이미지 배열을 포함하는 것이 더 안전하지 않을 수 있습니다. 복사 루프를 변경해야합니다. – Tjirp

1

클릭 수 max_execution_time - 스크립트를 실행할 수있는 시간 제한. 높은 가치를 설정하십시오.

http://php.net/manual/de/function.set-time-limit.php

당신은 오류 메시지를하지 마세요?

+0

오류 메시지가 없습니다! – Rein

+0

max_execution_time은 마스터 60 개 및 로컬 300 개로 설정됩니다. 어떤 것이 사용되는지는 확실하지 않습니다. – Rein

+1

@ReinoudSchuijers cron에서 이러한 작업을 실행해야합니다. 또한 질문에 대한 내 의견을 참조하십시오. 그것은 또한 많은 시간을 소비 할 것입니다. –

관련 문제