Tôi có 10.000 hình ảnh tôi muốn sắp xếp theo màu để tạo thành bản in.Sắp xếp 10.000 hình ảnh theo màu
Tôi nhận được khá xa. Tôi đã trung bình màu sắc của họ vì vậy bây giờ tôi có hai thư mục: một với tất cả các hình ảnh gốc (original_images /), và một với jpegs bằng nhau có cùng màu trung bình (trung bình /).
Tiếp theo, tôi sử dụng PHP để sắp xếp các hình ảnh trung bình:
// $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);
chỉnh sửa vấn đề là các phím $h
dao động từ (rõ ràng) -0,1666666667 đến một nơi nào xung quanh 1. ruột của tôi nói rằng rất có thể là thực sự nhỏ mà có giá trị trùng lặp, nhưng trên thực tế có bật ra được hơn 6000 phím trùng lặp. Tôi đã cố gắng đúc giá trị $h
cho một chuỗi bởi vì tôi nghĩ có lẽ các phím mảng được làm tròn?
Điều đó không hiệu quả. Đây là chức năng chuyển đổi rgb thành HSV. Tôi tìm thấy nó ở đâu đó mà không cần bất kỳ tài liệu ...
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;
}
Vì vậy, câu hỏi bây giờ là:
- Là rgb_to_hsv() - chức năng có đúng không?
- Làm cách nào để đảm bảo rằng các phím không bị ghi đè trong mảng, nhưng các giá trị được (chặt chẽ) được duy trì? Ví dụ; nếu hai hình ảnh có giá trị $ h là 0,01111111111, khi hình ảnh thứ hai được đẩy vào mảng, khóa của nó phải là 0,01111111112?
(chỉnh sửa cũ :) chỉnh sửa: Tôi đã thay đổi rename()
để copy()
vì vậy mà tôi không cần phải tải lên lại 10.000 hình ảnh mỗi lần nó đi sai ;-). Tôi cũng đã sử dụng ini_set("max_execution_time", 300);
để tăng thời gian thực thi tối đa từ 60 lên 300, đã thêm imagedestroy($image)
để giảm mức sử dụng bộ nhớ và cải thiện thành vòng lặp bằng cách thay đổi $i < count($images)
thành $loop_limit = count($images)
.
chỉnh sửa 2: OK nên tôi đã tìm thấy sự cố. Giá trị $ h (Hue) cho các hình ảnh giống nhau ở mọi thời điểm hiện tại. Vì vậy, việc sử dụng sorted_images[$h] = $images[$i]
sẽ ghi đè giá trị cho khóa đó trong mảng. Trong thực tế; có đến hơn 6000 giá trị trùng lặp ... Làm thế nào tôi sẽ đi và sửa chữa điều đó, mà không gây rối với giá trị $ h quá nhiều?
Đừng quên 'imagedestroy ($ image);' sau các lần lặp của bạn. –
'đếm ($ hình ảnh)' trong 'for' vòng lặp là một thực hành siêu tồi tệ nhất bao giờ hết! –
ghi chú hợp lệ, cập nhật :). – Rein