有没有办法使用 php 检查具有不同名称的重复图像?我想删除所有重复项。
4 回答
是的,您可以遍历所有文件并使用 hash_file 函数来比较它们: http ://php.net/manual/en/function.hash-file.php
我想一个有点简单的解决方案是使用md5()
.
打开一个目录,遍历生成 md5s 的文件,比较 md5s,删除重复项。
编辑:这是一个使用的脚本hash_file()
<?php
$dir = "/full/path/to/images";
$checksums = array();
if ($h = opendir($dir)) {
while (($file = readdir($h)) !== false) {
// skip directories
if(is_dir($_="{$dir}/{$file}")) continue;
$hash = hash_file('md5', $_);
// delete duplicate
if (in_array($hash, $checksums)) {
unlink($_);
}
// add hash to list
else {
$checksums[] = $hash;
}
}
closedir($h);
}
您可以通过文件的sha1_file哈希进行比较和检查
它返回 40 个字符的十六进制数
我花了很多时间寻找 php 中的最佳解决方案,但失败了,请阅读我的 5 个通往天堂的步骤(或者只是获得第 5 步)。
hash_file 不能按预期工作,例如在一个包含 11000 张不同名称的图片的文件夹中,我知道只有 800 个唯一的,hash_file() 仅找到 30 个匹配项。
我无法在 Windows + Openserver 上安装像http://libpuzzle.pureftpd.org/project/libpuzzle/php这样的第三方库。
尝试按主色或逐像素进行比较
ImageColorAt()
,创建“图像的数字印章”。它工作得非常慢,很多编码,最后非常糟糕 - 改变大小或合并/旋转图像是难以捉摸的。检查了 Github 以找到 readytogo 解决方案,但没有任何关于 PHP 的解决方案(为什么?这让我感到惊讶)。
最后,我找到了共享软件桌面程序http://www.mindgems.com/products/VS-Duplicate-Image-Finder/VSDIF-Tutorials.htm?postinstall=1它工作得非常好(快!它在多线程和负载中工作CPU 到 100%、8gb 和 11000 张图像仅在约 30 秒内进行比较),并具有所有必要的功能、异常和过滤。在这 11000 张图像目录中,该程序创建了所有视觉上相似的图像,向我展示了组和实例,允许使用自动过滤器等选择移动。主要缺点是金钱,但有种子 ;)