ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AntiDupl.NET 开源项目全解析:从重复图片查重引擎到 Visual Studio 2022 源码构建实战

AntiDupl.NET 开源项目全解析:从重复图片查重引擎到 Visual Studio 2022 源码构建实战 图像处理桌面应用【免费下载链接】AntiDuplA program to search similar and defect pictures on the disk项目地址https://gitcode.com/gh_mirrors/an/AntiDupl点击查看免费下载AntiDupl.NET 是一款面向磁盘图片收藏的相似图片与缺陷图片自动检索工具它通过基于文件内容而非文件名或元数据的比对算法在 JPEG、PNG、WEBP、HEIF、AVIF 等 17 类主流格式中找出几乎相同乃至仅内容相似的图片并附带 JPEG 截断、块效应、模糊等缺陷检测能力。本文以仓库根目录的 README.md 为主线结合 AntiDupl.h 中的公共接口定义、adEngine.h 的引擎结构、adImageComparer.h 的比对器设计以及 vcpkg.json 的依赖清单讲解该项目的核心原理、支持格式、缺陷检测分类并给出从零开始用 Visual Studio 2022 vcpkg 编译出完整程序的分步操作指南。读完本文你将既能快速上手使用 AntiDupl.NET 清理磁盘重复图片也能独立复现其源码构建流程为二次开发打下基础。本文所有命令与配置均以当前仓库实际内容为准源码路径为仓库内相对路径。一、项目定位为什么要用内容比对来清理重复图片现代电脑用户通常积累了大量不同格式的图片文件。图片收藏越多出现重复文件的可能性就越大用户自然会希望清理掉这些冗余。但当收藏规模足够大时纯手工整理是一项极其枯燥且低效的工作。这正是 README.md 描述的 AntiDupl.NET 的诞生背景自动完成重复图片的查找与展示让用户把精力放在删哪一张的决策上而不是哪里重复了的搜索上。与按文件名、文件大小或哈希值去重的简单工具不同AntiDupl.NET 的核心差异在于基于文件内容比对程序读入图片的像素数据而不是只比对元数据因此不仅能发现几乎完全相同的副本还能发现因压缩参数、分辨率调整、轻微编辑而变得相似的图片见 README.md 第 10-12 行。附带缺陷检测除查重外还能定位带有特定类型缺陷的图片文件。免费开源、双界面免费开源软件提供俄语与英语两种界面强调易用性与查重的高速度、高准确率见 README.md 第 14-15 行。仓库中两个 .NET 前端项目——AntiDupl.NET.WPF 与 AntiDupl.NET.WinForms——分别承载现代与经典两种 Windows 桌面界面而真正完成图片读取、收集、比对与缺陷检测的 C 核心引擎位于 src/AntiDupl。二、支持的文件格式与内容比对背后的解码链路README 明确列出程序可查找并展示重复图片的常用图形格式JPEG、GIF、TIFF、BMP、PNG、EMF、WMF、WEBP、EXIF、ICON、JP2、PSD、DDS、HEIF、HEIC、TGA、AVIF、JXL这份清单与 C 引擎中的枚举定义完全对应。在 AntiDupl.h 中adImageType枚举依次定义了从AD_IMAGE_BMP、AD_IMAGE_GIF、AD_IMAGE_JPEG、AD_IMAGE_PNG、AD_IMAGE_TIFF、AD_IMAGE_EMF、AD_IMAGE_WMF、AD_IMAGE_EXIF、AD_IMAGE_ICON、AD_IMAGE_JP2、AD_IMAGE_PSD、AD_IMAGE_DDS、AD_IMAGE_TGA、AD_IMAGE_WEBP、AD_IMAGE_HEIF、AD_IMAGE_AVIF到AD_IMAGE_JXL共 17 种类型与 README 列出的格式一一吻合。而在 adImage.cpp 中每种格式还登记了各自的扩展名集合例如 JPEG 家族包含JPEG/JFIF/JPG/JPE/JIFF/JIF/J/JNG/JFFTIFF 包含TIF/TIFFICON 包含ICON/ICO/ICNJP2 家族包含JP2/J2K/J2C/JPC/JPF/JPXHEIF 家族包含HEIF/HEIC——这意味着程序在实际扫描时按扩展名白名单收集候选文件。内容比对的第一步是把磁盘文件解码为可计算的像素数据。引擎入口 TImage::Load 展示了完整的解码调度顺序先依次尝试 OpenJPEGJP2、PSD、DDS、TGA、WebP、AVIF、JXL、HEIF 等专用解码器对应adOpenJpeg、adPsd、adDds、adTga、adWebp、adAvif、adJxl、adHeif等实现文件再在开启useLibJpegTurbo选项时用 TurboJPEG 处理 JPEG最后回退到 Windows GDI 完成其余格式的加载。这种专用解码器优先、GDI 兜底的分层设计是程序能同时覆盖传统格式与新兴格式的关键。这些第三方解码能力在 vcpkg.json 中体现为依赖清单libjpeg-turbo、openjpeg、libwebp、libheif、simd、libavif、libjxl。三、查重原理从像素数据到相似度判定基于内容的比较在引擎中落地为两个阶段收集Collect与比对Compare由 TEngine 统一协调内部持有TCollectManager、TCompareManager、TSearcher、TResultStorage、TImageDataStorage、TMistakeStorage等组件并提供Search()作为一次完整扫描的入口。3.1 扫描收集TSearcher 如何挑选候选图片TSearcher 负责遍历用户指定的目录支持子文件夹递归通过IsWanted/IsForbidden过滤路径并通过InitExtensions与AddExtensions按各格式是否启用动态构建扩展名白名单。从 adConfig.h 的常量可见引擎把每张图缩略为REDUCED_IMAGE_SIZE_MIN 16到INITIAL_REDUCED_IMAGE_SIZE 256之间的小尺寸位图FAST_IMAGE_SIZE 4用于快速预筛使后续比对的计算量大幅下降这也是高速度的工程基础之一。3.2 分层比对TImageComparer 家族adImageComparer.h 定义了抽象基类TImageComparer维护m_mainThreshold、m_fastThreshold、m_maxDifference等阈值通过Add/Compare/IsDuplPair三个虚函数把加入候选集与两两比对分离。仓库中实现了多个具体比对策略TImageComparer_0D基于整幅图像统计特征的快速粗筛TImageComparer_1D基于 256 级直方图RANGE 256的一维比对TImageComparer_3D构造三维索引像素总和s、左右半图差x、上下半图差y进行多维空间预筛见 adImageComparer.hTImageComparer_SSIM基于结构相似性指数SSIM内部维护C1、C2常量的感知质量比对。这些策略由工厂函数CreateImageComparer根据配置选择adAlgorithmComparing枚举AD_COMPARING_SQUARED_SUM与AD_COMPARING_SSIM见 AntiDupl.h正是用户界面上比对算法选项的底层对应。粗筛用快速特征排除绝大多数无关图片细筛再用全像素或 SSIM 精确判定层层递进。3.3 相似而非相同的判定阈值与变换adCompareOptions见 AntiDupl.h集中了比对阶段的全部可调参数参数字段含义checkOnEquality是否检查完全相等的图片对transformedImage是否把旋转/镜像后的图片也视为候选对应adTransformType中TURN_90/180/270与MIRROR_TURN_*共 8 种变换见 AntiDupl.hsizeControl/typeControl/ratioControl是否要求尺寸、格式、宽高比一致才比较thresholdDifference允许的差异阈值决定相似的严格程度minimalImageSize/maximalImageSize只比较落在尺寸区间内的图片compareInsideOneFolder/compareInsideOneSearchPath是否只在同一文件夹或同一搜索路径内找重复algorithmComparing选择平方和Squared Sum或 SSIM 算法从 adConfig.h 的常量可以看出引擎内部使用的关键基准差异以DENOMINATOR 100为分母的百分比形式衡量PIXEL_MAX_DIFFERENCE 0xFF并定义了D0_SEARCHED_FILE_NUMBER_MAX 1000、D1_SEARCHED_FILE_NUMBER_MAX 10000、D3_THRESHOLD_DIFFERENCE_MAX差异上限 10%与D3_MAX_RANGES_STEP步长 1%等分级阈值——这解释了为什么程序能找到相似但不完全相同的图片只要两图差异低于用户设定的阈值百分比即判为重复对。3.4 缺陷检测不止查重还能找坏图README 提到的部分类型的缺陷在adDefectType枚举中明确列出见 AntiDupl.h缺陷类型含义AD_DEFECT_UNKNOWN无法识别的缺陷AD_DEFECT_JPEG_END_MARKER_IS_ABSENTJPEG 文件缺少结束标记0xFFD9对应 adConfig.h 中的JPEG_FILE_MARKER与JPEG_FILE_MARKER_END即文件被截断AD_DEFECT_BLOCKINESS块效应块状压缩伪影AD_DEFECT_BLURRING模糊对焦不准或过度降噪块效应与模糊的检测由 adBlurringDetector.h 中的TBlurringDetector实现adDefectOptionsAntiDupl.h则暴露了checkOnDefect、checkOnBlockiness、blockinessThreshold、checkOnBlockinessOnlyNotJpeg、checkOnBlurring、blurringThreshold等开关与阈值用户可在界面中独立启停每种检测。检测流程由 adImageData.h 中的TImageData::DefectCheckingNeed/GetDefect驱动TImageData结构体同时记录宽高比ratio、CRC32C 校验crc32c与像素数据data——CRC32C 用于快速区分内容差异而宽高比用于旋转候选的匹配。四、从源码构建Visual Studio 2022 vcpkg 完整流程README.md 第 17-44 行给出了官方的构建步骤以下按步骤复现并补充关键细节。构建产物同时包含 C 引擎src/AntiDupl与两个 .NET 前端AntiDupl.NET.WPF、AntiDupl.NET.WinForms解决方案文件为 src/AntiDupl.sln。第 1 步安装 Visual Studio 2022下载 Visual Studio 2022例如 Community 社区版并安装。在 Visual Studio Installer 中选择以下工作负载.NET Desktop development.NET 桌面开发用于编译 WPF/WinForms 前端Desktop development with C使用 C 的桌面开发用于编译核心引擎。注意当前最新默认工具集为v143对应 VS2022。第 2 步获取 vcpkg 依赖管理器vcpkg 是微软开源的 C/C 依赖管理工具本项目通过它自动拉取并编译全部第三方图片解码库。使用 git 克隆git clone https://github.com/Microsoft/vcpkg.git第 3 步安装并集成 vcpkg在 vcpkg 目录内执行引导脚本与全局集成cd vcpkg ./bootstrap-vcpkg.bat ./vcpkg integrate installintegrate install会让 Visual Studio 在构建时自动感知 vcpkg 已安装的包。第 4 步打开解决方案用 Visual Studio 打开 src/AntiDupl.sln即可看到 C 引擎项目与 .NET 前端项目。第 5 步开始构建在 Visual Studio 中直接生成解决方案。README 明确说明依赖库将由 vcpkg 自动加载并构建Depended libraries will be automatically loaded and built by vcpkg。仓库根目录的 vcpkg.json 即构建所需的依赖清单包含依赖包用途libjpeg-turbo高性能 JPEG 编解码对应引擎的 TurboJPEG 路径由AD_TURBO_JPEG_ENABLE宏开启见 adConfig.hopenjpegJPEG 2000JP2解码libwebpWebP 解码libheifHEIF/HEIC 解码libavifAVIF 解码libjxlJPEG XLJXL解码simdSIMD 加速库引擎的adSimd.h基于其Simd::View类型组织像素视图见 adConfig.h这些依赖与上文TImage::Load的解码调度顺序一一对应libavif→AVIF、libjxl→JXL、libheif→HEIF、libjpeg-turbo→JPEG其余格式回退 GDI。构建要点小结若只想编译核心引擎与特定前端可在解决方案中选择对应项目单独生成首次构建耗时较长因为 vcpkg 需要从源码编译全部依赖构建产物为 Windows 桌面程序运行前请确保目标机器具备 .NET 运行环境WPF 项目在 AntiDupl.NET.WPF.csproj 中声明了目标框架。五、界面与配置两个前端如何对接引擎仓库包含两套 Windows 桌面前端共享同一 C 引擎AntiDupl.NET.WPF基于 XAML 的现代界面采用 TinyIoC 轻量依赖注入容器组织服务在 App.xaml.cs 中注册IConfigurationModel、ILanguageService、CoreLib、IImageLoader、IThumbnailProvider等MainViewModel作为界面与引擎之间的桥接层AntiDupl.NET.WinForms经典 WinForms 实现界面组件集中在Form/与GUIControl/目录。两个前端都通过 CoreLib.cs 封装对 C 引擎的调用引擎导出的TOptions见 adOptions.h通过Import/Export与各前端的选项模型互相转换并支持把配置持久化为 INI 文件TOption::Load/Save。adSearchOptionsAntiDupl.h以布尔开关形式逐项控制是否扫描system系统文件、hidden隐藏文件以及上述 17 种格式——也就是说用户界面上要搜哪些格式的勾选最终会落到这张位图式的开关结构上。adAdvancedOptionsAntiDupl.h则提供更底层的调优项deleteToRecycleBin删除前先进回收站、mistakeDataBase误判数据库、ratioResolution宽高比精度、compareThreadCount/collectThreadCount比对/收集线程数、reducedImageSize缩略图尺寸、undoQueueSize撤销队列深度、resultCountMax结果上限、useLibJpegTurbo是否启用 TurboJPEG。六、命令行工具 AntiDuplX同算法的跨平台分支README.md 第 46-49 行还提及一个独立的姊妹项目AntiDuplX这是一个命令行工具同样用于搜索相似与损坏图片采用与 AntiDupl.NET类似的图片比对算法且同时支持Linux 与 Windows。需要强调的是AntiDuplX 是独立于本仓库的单独项目不在本仓库代码内对需要脚本化、无界面批处理场景的用户它是 AntiDupl.NET 图形界面的有益补充。七、快速上手指南下载、配置与运行结合引擎的选项结构与界面设计典型使用流程如下下载与启动从项目发布渠道获取最新构建的 Windows 程序本仓库仅提供源码cmd 目录下的MakeBin.cmd、MakePublish.cmd、MakeSrc.cmd等脚本展示了打包分发流程启动后选择界面语言俄语或英语语言服务在 LanguageService.cs 中实现资源文件为 lang.xaml 与 lang.ru-RU.xaml。配置搜索路径与选项在路径窗口中添加要扫描的文件夹支持排除路径在选项中按需勾选要扫描的图片格式、是否包含隐藏/系统文件以及比对阈值、缺陷检测开关等参数对应上文adSearchOptions/adCompareOptions/adDefectOptions结构。开始搜索程序递归扫描所选路径先收集全部图片并缩略再进入多线程比对阶段线程数可在高级选项中调整最后把重复对/缺陷图汇总到结果列表。处理结果在结果列表中审阅重复图片利用删除、重命名、移动等批量操作清理冗余误删可借助撤销队列undoQueueSize回退勾选删除到回收站则进一步降低风险。八、总结与延伸阅读AntiDupl.NET 的价值在于把按内容找相似图片这一计算密集型任务通过格式白名单收集 → 小图缩略 → 多维索引粗筛 → SSIM/平方和精判的多级流水线做到实用化并以 17 种格式的解码覆盖和块效应/模糊/截断三种缺陷检测补齐了图片管理工具的能力拼图。对想深入源码的读者推荐按以下顺序阅读格式与枚举定义AntiDupl.h引擎与线程模型adEngine.h、adThreads.h、adThreadManagement.h比对算法家族adImageComparer.h、adImageComparer.cpp缺陷检测adBlurringDetector.h、adImageUtils.cpp解码调度adImage.cpp前端对接CoreLib.cs、MainViewModel.cs按照本文第四部分的操作步骤你可以在自己的 Windows 机器上从源码完整构建出 AntiDupl.NET也可以进一步阅读界面帮助文档docs/data/help/english 与 docs/data/help/russian 下的options.html、paths.html、table.html等章节掌握每个选项的详细含义。赞分享图像处理桌面应用【免费下载链接】AntiDuplA program to search similar and defect pictures on the disk项目地址https://gitcode.com/gh_mirrors/an/AntiDupl点击查看免费下载相关推荐MCP Apps 沙箱代理机制深入Host 如何代理 MCP 请求完整指南MCP Apps 沙箱代理机制深入Host 如何代理 MCP 请求完整指南 在 MCP Apps 协议中工具 UI 运行在 AI 聊天机器人Host数据库文档数据库分布式数据库CamP Zip-NeRF性能对比分析单尺度与多尺度场景的终极测试CamP Zip NeRF性能对比分析单尺度与多尺度场景的终极测试 CamP Zip NeRF是谷歌研究团队开发的高性能神经辐射场NeRF实现结合了Zi快速清理重复图片AntiDupl.NET图像去重完全指南快速清理重复图片AntiDupl.NET图像去重完全指南 你的电脑里是不是塞满了各种重复的图片 从旅行照片到工作素材从表情包到截图这些重复文件不仅占图像处理桌面应用上一篇AO3 镜像站怎么用地址怎么开、失效了怎么办下一篇猫抓资源嗅探扩展指南视频下载、音频分离与图片批量另存的本地做法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进