假设我们有一个子程序compare_frames
可以比较两个帧,如果它们相同则返回 true。
然后我们可以通过遍历文件夹 2 中的前几帧并比较这些帧来找到偏移量:
# return the offset of the first equal image,
# searching frames between "from" (defaulting to 1) and "upto" (defaulting to 15)
sub find_offset (%) {
my ($min_index, $max_index) = @{+{ from=>1, upto=>15, @_ }}{qw(from upto)};
for my $index ($min_index .. $max_index) { # assuming 1-based indexing scheme
return $index - 1 if compare_frames(1, $index);
}
warn "no offset found";
return undef; # or better, exit the program.
}
在脚本的主要部分中,您稍后将运行my $offset = find_offset upto=>15
并使用它来进行大部分处理。但是,这假定文件夹 1 始终是文件夹 2 的子集。
在我们的比较子程序中,我们希望尽快返回“false”。根据图像格式,如果大小不同,我们可以说两个图像不能相等。但是,位图的大小是固定的,因此这里没有意义,因为所有帧都具有相同的分辨率。其他图像格式具有不同的压缩密度,其中两张图片可能相等,即使其中一张压缩得更多。在这种情况下,请删除stat
代码。
# decide if two frames are equal.
# $frame1 is from the first set of frames,
# $frame2 is the frame from the second set.
sub compare_frames {
my ($frame1, $frame2) = @_;
my $file1 = "folder1/$frame1";
my $file2 = "folder2/$frame1";
# stat the files for the size.
my $size1 = (stat $file1)[7];
my $size2 = (stat $file2)[7];
return 0 if $size1 != $size2; # strict equality, maybe you want to include some sort of tolerance.
# do main comparision
$cmp->set_image1($file1);
$cmp->set_image2($file2);
return $cmp->compare;
}
其中$cmp
是 的比较器对象Image::Compare
,以及预设的比较方法。
然后,在主要比较期间,您将compare_frames($i, $i + $offset)
.