比较图像并删除重复项



我有两个带有图像的文件夹,它们都是png。一个文件夹是另一个文件夹,其中一些图像更改并添加了一些图像。文件名相同,但图像内容可能不同。不幸的是,诸如时刻邮票之类的其他属性是完全随机的。

我希望在较新文件夹中删除(按内容)删除重复项,然后保留更新和新的。

我安装了ImageMagick使用compare命令,但我无法弄清楚。:-(您能帮我吗?预先感谢!

添加:我在Mac OS X上。

您不说您是否在OSX/Linux或Windows上,但是,我可以让您开始。ImageMagick可以计算图像中所有像素数据的哈希(校验和),而不论日期或时间戳是否像这样

identify -format "%# %fn" *.png
25a3591a58550edd2cff65081eab11a86a6a62e006431c8c4393db8d71a1dfe4 blue.png
304c0994c751e75eac86bedac544f716560be5c359786f7a5c3cd6cb8d2294df green.png
466f1bac727ac8090ba2a9a13df8bfb6ada3c4eb3349087ce5dc5d14040514b5 grey.png
042a7ebd78e53a89c0afabfe569a9930c6412577fcf3bcfbce7bafe683e93e8a hue.png
d819bfdc58ac7c48d154924e445188f0ac5a0536cd989bdf079deca86abb12a0 lightness.png
b63ad69a056033a300f23c31f9425df6f469e79c2b9f3a5c515db3b52c323a65 montage.png
a42a5f0abac3bd2f6b4cbfde864342401847a120dacae63294edb45b38edd34e red.png
10bf63fd725c5e02c56df54f503d0544f14f754d852549098d5babd8d3daeb84 sample.png
e95042f227d2d7b2b3edd4c7eec05bbf765a09484563c5ff18bc8e8aa32c1a8e sat.png

因此,如果您在每个文件夹中执行此操作,则将在每个文件夹的单独文件中都有所有文件的校验和所有文件。

如果您将两个文件合并并对其进行排序,则可以很容易地找到重复的文件,因为重复的文件将彼此相邻出现。

假设,您在两个文件夹中运行上述命令diradirb

cd dira
identify -format "%# %fn" *.png > $HOME/dira
cd dirb
identify -format "%# %fn" *.png > $HOME/dirb

然后您可以在awk

中执行此类操作
awk 'FNR==NR{name[$1]=$2;next}
            { 
               if($1 in name){print $2 " duplicates " name[$1]}
            }' $HOME/dir*

因此,$HOME/dir*零件将两个文件都传递到awk中。 {}中的 FNR==NR之后的作品仅适用于第一个文件,并且在阅读时,我们保存了一个由包含文件名的哈希索引索引的关联阵列。然后,在第二张通过时,我们检查是否看到了每个哈希,如果有,则说明它是重复的,并输出了我们在Hash name[]的第一个通行证上找到的名称,以及我们在第二次通过$2。

这与其中有空格的文件名无法使用,因此,如果这是一个问题,请更改identify命令,以在Hash和FileName之间放置结肠:

identify -format "%#:%fn" *.png

并将awk更改为awk -F":",它应该再次起作用。

这是我对PowerShell的丑陋解决方案(现在是一个多平台解决方案) - 我将其写成一次,但应该起作用。我试图对此评论以补偿它有多糟糕。

不过,我会在这样做之前备份您的图像。以防万一。

这里的收集是它仅检测到每个文件是上一个文件的重复的 - 如果您需要检查每个文件是否是其他文件的重复,您都需要在其中嵌套另一个for()循环应该足够容易。

#get the list of files with imagemagick
#powershell handily populates $files as an array, split by line
#this will take a bit
$files = identify -format "%# %fn" *.png
$arr = @()
foreach($line in $files) {
    #add 2 keys to the new array per line (hash and then filename)
    $arr += @($line.Split(" "))
}
#for every 2 keys (eg each hash)
for($i = 2; $i -lt $arr.Length; $i += 2) {
    #compare it to the last hash
    if($arr[$i] -eq $arr[$i-2]) {
        #print a helpful message and then delete
        echo "$($arr[$i].Substring(0,16)) = $($arr[$i-2].Substring(0,16)) (removing $($arr[$i+1]))"
        remove-item ($arr[$i+1])
    }
}

奖励:要删除具有特定哈希的任何图像(我的情况下是全黑640×480 PNG):

for($i = 2; $i -lt $arr.Length; $i += 2) {
    if($arr[$i] -eq "f824c1a8a1128713f17dd8d1190d70e6012b509606d986e7a6c81e40b628df2b") {
        echo "$($arr[$i+1])"
        remove-item ($arr[$i+1])
    }
}

双奖金:C代码以检查书面图像是否与hash/文件夹中的给定哈希相撞并删除它,如果是为Windows/mingw编写,但在必要时不难移植。可能是多余的,但我想我会把它扔到那里,以防万一对任何人都有用。

char filename[256] = "output/UNINITIALIZED.ppm";
unsigned long int timeint = time(NULL);
sprintf(filename, "../output/image%lu.ppm", timeint);
if(
    writeppm(
        filename,
        SCREEN_WIDTH,
        SCREEN_HEIGHT,
        screenSurface->pixels
        ) != 0
) {
    printf("image write error!n");
    return;
}
char shacmd[256];
sprintf(shacmd, "sha256sum %s", filename);
FILE *file = popen(shacmd, "r");
if(file == NULL) {
    printf("failed to get image hash!n");
    return;
}
//the hash is 64 characters but we need a 0 at the end too
char sha[96];
int i;
char c;
//get hash until the first space
for(i = 0; (i < 64) && (c != EOF) && (c != 0x32); i++) {
    sha[i] = c = fgetc(file);
}
pclose(file);
char hashfilename[256];
sprintf(hashfilename, "../output/hash/%s", sha);
if(_access(hashfilename, 0) != -1) {
    //file exists, delete img
    if(unlink(filename) != 0) {
        printf("image delete error!n");
    }
} else {
    FILE *hashfile = fopen(hashfilename, "w");
    if(hashfile == NULL)
        printf("hash file write error!nfilename: %sn", hashfilename);
    fclose(hashfile);
}

  • 为MCOS
    • 与自制的安装fdupes
      brew install fdupes
      
    • 在当前目录中遇到的重复点立即删除重复项
      fdupes -dI .   
      
    • 阅读选项
      fdupes -h
      

相关内容

  • 没有找到相关文章

最新更新