10

有没有办法使用 php 检查具有不同名称的重复图像?我想删除所有重复项。

4

4 回答 4

9

是的,您可以遍历所有文件并使用 hash_file 函数来比较它们: http ://php.net/manual/en/function.hash-file.php

于 2012-05-09T17:08:41.870 回答
3

我想一个有点简单的解决方案是使用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);
}
于 2012-05-09T17:09:04.200 回答
3

您可以通过文件的sha1_file哈希进行比较和检查

它返回 40 个字符的十六进制数

于 2015-04-22T09:57:10.023 回答
1

我花了很多时间寻找 php 中的最佳解决方案,但失败了,请阅读我的 5 个通往天堂的步骤(或者只是获得第 5 步)。

  1. hash_file 不能按预期工作,例如在一个包含 11000 张不同名称的图片的文件夹中,我知道只有 800 个唯一的,hash_file() 仅找到 30 个匹配项。

  2. 我无法在 Windows + Openserver 上安装像http://libpuzzle.pureftpd.org/project/libpuzzle/php这样的第三方库。

  3. 尝试按主色或逐像素进行比较ImageColorAt(),创建“图像的数字印章”。它工作得非常慢,很多编码,最后非常糟糕 - 改变大小或合并/旋转图像是难以捉摸的。

  4. 检查了 Github 以找到 readytogo 解决方案,但没有任何关于 PHP 的解决方案(为什么?这让我感到惊讶)。

  5. 最后,我找到了共享软件桌面程序http://www.mindgems.com/products/VS-Duplicate-Image-Finder/VSDIF-Tutorials.htm?postinstall=1它工作得非常好(快!它在多线程和负载中工作CPU 到 100%、8gb 和 11000 张图像仅在约 30 秒内进行比较),并具有所有必要的功能、异常和过滤。在这 11000 张图像目录中,该程序创建了所有视觉上相似的图像,向我展示了组和实例,允许使用自动过滤器等选择移动。主要缺点是金钱,但有种子 ;)

于 2018-05-03T09:36:49.433 回答