Php 按颜色对10000幅图像进行排序

Php 按颜色对10000幅图像进行排序,php,sorting,image-processing,Php,Sorting,Image Processing,我有10000张图片,我想按颜色排序,以便打印出来 我已经走得很远了。我已经平均了它们的颜色,所以现在我有两个目录:一个是所有原始图像(original_images/),另一个是平均颜色的同名JPEG(averages/) 接下来,我使用PHP对平均图像进行排序: // $images is an array with all the filenames. $sorted_images = array(); $loop_limit = count($images); for($i = 0; $

我有10000张图片,我想按颜色排序,以便打印出来

我已经走得很远了。我已经平均了它们的颜色,所以现在我有两个目录:一个是所有原始图像(original_images/),另一个是平均颜色的同名JPEG(averages/)

接下来,我使用PHP对平均图像进行排序:

// $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);
因此,现在的问题是:

  • rgb_to_hsv()函数是否正确
  • 如何确保数组中的键没有被覆盖,但值(紧密地)保持不变?例如;如果两个图像的$h值为0.011111111,那么当第二个图像被推送到数组时,它的键应该是0.011111112
  • (旧编辑:) 编辑:我已将
    rename()
    更改为
    copy()
    ,这样我就不必每次出错都重新加载10000个图像;-)。我还使用了
    ini\u集(“max\u execution\u time”,300)
    为了将最大执行时间从60增加到300,添加了
    imagedestroy($image)
    以减少内存使用,并通过将
    $i
    更改为
    $loop\u limit=count($images)
    来改进for循环


    编辑2:好的,我发现了一个问题。图像的$h(色调)值有时是相同的。因此,使用
    sorted_images[$h]=$images[$i]
    覆盖数组中该键的值。事实上结果是有超过6000个重复值。。。我该如何着手解决这个问题,而不会过多地干扰$h值?

    您可能会遇到最大执行时间-允许脚本运行的时间限制。尝试设置一个更高的值


    您没有收到任何错误消息吗?

    您是否尝试过启用错误消息

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    至于本地值与主值。”“本地”表示当前运行的脚本正在使用300秒的超时“主”适用于所有其他请求(除非明确修改)

    Cron是一种可行的方法,但我不认为应该每X秒/分钟/小时执行多次?您只需自己使用命令行即可完成此操作。请查看此处以了解更多信息:

    在脚本运行时,最有可能出现以下问题之一:

    内存限制不够高。应该给出一个启用了错误的PHP错误。 执行时间不够长。应该给出一个启用了错误的PHP错误

    使用init_set方法增加这两个值,如果您“只是”希望脚本运行,请将超时设置为0秒,并将内存限制设置为尽可能高。如果您想真正了解确切原因,可以考虑查找“xdebug”,查看是否存在内存泄漏,或者哪些命令执行时间最长。看一下代码,我假设执行copy命令需要一段时间(超过1ms,这在10000次迭代之后要花很多时间)

    如果无法修改这些值,或者您只是想玩弄使用高内存、长执行时间、资源有限的脚本,请尝试重写脚本以分批执行重命名,并设置一个cron以每X分钟执行一次脚本(在完成所有图像后只需删除cron)


    祝你好运:)

    别忘了
    imagedestroy($image)在迭代之后。
    count($images)
    in
    for
    循环是有史以来最糟糕的做法!最大执行时间设置为60主时间和300本地时间。我不确定使用的是哪一个。@ReinoudSchuijers您应该在cron上运行这样的作业。另见我对问题的评论。它也会消耗很多时间好吧,我没有任何使用cron的经验。谷歌搜索让我觉得这是一个很难解决的问题。也许你有什么好的出发点吗?@ReinoudSchuijers(带着)看看。谢谢:-)。事实上,我正在接近这个问题。我确实修改了脚本以减少内存占用,这总是一件好事。但事实上,我开始认为问题在于阵列本身。由于某种原因,数组中的许多键被覆盖。我将更新问题以进一步概述这一点。色调键,特别是10000张图像可能不够独特。如果色调键实际包含具有该色调的所有图像的图像数组,而不是仅包含一个图像(简单:排序的_图像[$h][]=$images[$i];),则可能更安全。您需要更改复制循环
    error_reporting(E_ALL);
    ini_set('display_errors', 1);