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