网友作品 #000091 · 提交于 2026/08/10
WPF图片查看器:批量压缩与尺寸调整桌面工具
★★★☆☆程序员水平AI 编程工具国际顶级模型dotnet

作品简介
ImageViewer 是基于 WPF 开发的 Windows 桌面图片浏览与批量处理工具,支持 JPG、PNG、WebP、BMP、GIF、TIFF 等常见格式的查看、转换、压缩、旋转和尺寸调整。作者因为通用图片工具大多不能钻取子文件夹浏览,于是自己动手做了一个,经过持续迭代已能流畅浏览数万张图片。
核心亮点
- 顺滑浏览:文件夹树导航 + 递归加载子文件夹,缩略图网格支持 Ctrl+滚轮 在 60~300px 间调节,双击进入全屏轮播翻页
- 海量不卡:懒加载只处理可见区域(150ms 防抖、并发 3),LRU 缓存 600 张缩略图,虚拟化面板优化大图库性能
- 批量处理:JPG/PNG/WebP/BMP/GIF/TIFF 互转、保持原格式压缩并移除元数据、最长边等比或指定宽高调整尺寸
- 旋转矫正:手动左右旋 90 度,也可按 EXIF 方向智能旋转,并支持“固化方向”写入像素数据
- 灵活筛选:按格式过滤、按时间/文件名排序、文件名关键字搜索(可选匹配路径),Ctrl/Shift 多选批量操作
- 贴心细节:记忆上次目录与排序设置、右键打开所在文件夹、按日期分文件记录操作日志并自动清理
- 覆盖可控:可直接覆盖原文件或输出到指定目录,转换生成新文件时不删除原图
技术与工具
- 技术栈:.NET 6(Windows)+ WPF,界面采用 HandyControl 3.5.1 控件库
- 图像引擎:Magick.NET-Q16-AnyCPU(基于 ImageMagick),支持 WebP 等格式
- 架构:CommunityToolkit.Mvvm 源码生成器驱动的 MVVM 模式,IImageService / IFolderService 接口解耦
- 性能设计:DispatcherTimer 防抖 + SemaphoreSlim 并发控制 + 线程安全 LRU 缓存,耗时操作 Task.Run 异步执行
- 开发方式:AI 编程类工具搭配国际顶级模型完成
适用场景
- 电商、设计等行业:快速浏览和批量压缩、转换商品图与素材图,提升素材管理效率
- 摄影爱好者、影像工作者:批量预处理摄影作品,完成格式转换、尺寸压缩与方向矫正
原始提交内容(点开查看,可复制全文去问 AI)
ImageViewer - 图片查看器
基于 WPF 开发的 Windows 桌面图片浏览与批量处理工具,支持常见图片格式的查看、转换、压缩、旋转和尺寸调整。
功能概览
图片浏览
- 文件夹树导航:左侧文件夹树快速切换目录,支持递归加载子文件夹图片
- 缩略图网格:以缩略图网格展示图片,支持 Ctrl+滚轮 实时调整缩略图大小(60~300px)
- 悬停信息:鼠标悬停缩略图显示文件名、完整路径、文件大小、格式、原始宽高
- 懒加载:滚动时按需加载可见区域缩略图,150ms 防抖,并发数 3,流畅浏览大量图片
- 多选操作:支持 Ctrl 点击多选、Shift 范围选择,以及全选/取消全选按钮
- 格式过滤:可按图片格式筛选显示(全部 / .jpg / .png / .webp / .bmp / .gif / .tiff)
- 排序方式:支持按修改时间升序/降序、文件名升序/降序排列
- 文件名搜索:支持关键字搜索文件名,可选是否匹配完整路径,300ms 防抖
- 轮播大图:双击图片打开全屏轮播窗口,支持前后翻页浏览原图,显示当前序号/总数
图片处理
- 格式转换:支持 JPG、PNG、WebP、BMP、GIF、TIFF 之间互转,可调节输出质量
- 图片压缩:保持原格式,降低画质并移除元数据以减小文件体积
- 尺寸调整:支持最长边等比缩放、指定宽高(等比例/强制拉伸)等多种模式
- 旋转:支持左旋 90 度、右旋 90 度,直接覆盖原文件
- 智能旋转:根据 EXIF 方向信息自动旋转图片到正确方向,支持“固化方向”将当前方向写入像素数据
- 覆盖模式:可选择直接覆盖原文件或输出到指定目录;转换时若后缀不同则生成新文件,不删除原文件
其他特性
- 右键菜单:打开所在文件夹(资源管理器定位)、定位到文件夹树、查看大图
- 设置记忆:自动恢复上次打开的文件夹、子文件夹显示状态、排序方式和智能旋转开关
- 文件日志:按日期分文件记录操作日志,单文件上限 5MB,自动清理 30 天前的日志
- 缩略图缓存:LRU 缓存最多 600 张缩略图,操作后自动失效对应缓存
技术架构
运行时环境
- 目标框架:.NET 6.0 (Windows)
- UI 框架:WPF (.NET 原生) + HandyControl 3.5.1(现代化控件库)
- 图像处理:Magick.NET-Q16-AnyCPU 13.10.0(基于 ImageMagick,支持 WebP 等格式)
- MVVM 工具包:CommunityToolkit.Mvvm 8.2.2(源码生成器驱动的 MVVM 框架)
项目结构
ImageViewer/
Models/ # 数据模型
ImageItem.cs # 图片项(含缩略图、选中状态、文件信息)
ImageFileEntry.cs # 目录枚举阶段的轻量文件信息记录
FolderNode.cs # 文件夹树节点(含子节点、展开/选中状态)
ViewModels/ # 视图模型(MVVM)
MainViewModel.cs # 主窗口 ViewModel(图片加载、选择、转换、压缩、调整尺寸、旋转)
CarouselViewModel.cs # 轮播窗口 ViewModel(前后翻页、加载原图)
Views/ # 视图(XAML + Code-Behind)
MainWindow.xaml/.cs # 主窗口(工具栏、文件夹树、缩略图网格、状态栏)
CarouselWindow.xaml/.cs # 轮播大图窗口
HelpWindow.xaml/.cs # 使用说明窗口
Controls/ # 自定义控件
VirtualizingWrapPanel.cs # 虚拟化流式面板(替代 WrapPanel,优化大量缩略图性能)
Services/ # 服务层
IImageService.cs # 图片服务接口(缩略图、转换、压缩、调整尺寸、旋转)
ImageService.cs # 图片服务实现(基于 Magick.NET)
IFolderService.cs # 文件夹服务接口(扫描、构建树)
FolderService.cs # 文件夹服务实现(目录枚举、格式过滤、排序、搜索)
UserSettings.cs # 用户设置持久化(JSON 文件读写)
FileLogger.cs # 文件日志(按日期分文件,自动清理)
Converters/ # 值转换器
Converters.cs # BoolToVisibilityConverter
Resources/ # 资源文件
Icons.xaml # 图标 Path 定义
ThemeOverrides.xaml # 主题覆盖样式
ImageViewer.csproj # 项目文件
架构设计要点
| 层次 | 说明 |
|---|---|
| MVVM 模式 | 使用 CommunityToolkit.Mvvm 的 [ObservableProperty]、[RelayCommand] 源码生成器,减少样板代码 |
| 服务接口抽象 | IImageService / IFolderService 接口解耦,便于测试和替换实现 |
| 缩略图缓存 | ConcurrentDictionary + ConcurrentQueue 实现线程安全的 LRU 缓存,上限 600 张 |
| 懒加载策略 | 滚动事件触发 150ms 防抖(DispatcherTimer) 计算可见行 SemaphoreSlim(3) 并发加载 |
| 异步处理 | 转换/压缩/调整尺寸/旋转等耗时操作均通过 Task.Run 异步执行,不阻塞 UI 线程 |
| 设置持久化 | 用户设置以 JSON 文件保存到程序目录,启动时自动加载恢复 |
支持格式
| 格式 | 浏览 | 转换 | 压缩 | 旋转 |
|---|---|---|---|---|
| JPG / JPEG | 支持 | 支持 | 支持 | 支持 |
| PNG | 支持 | 支持 | 支持 | 支持 |
| WebP | 支持 | 支持 | 支持 | 支持 |
| BMP | 支持 | 支持 | 支持 | 支持 |
| GIF | 支持 | 支持 | 支持 | 支持 |
| TIFF / TIF | 支持 | 支持 | 支持 | 支持 |
| ICO | 支持 | 支持 | - | - |
使用方式
运行环境
- Windows 7 SP1 及以上
- .NET 6.0 Desktop Runtime
编译
dotnet build -c Release
发布
dotnet publish -c Release -o publish
快捷键
| 快捷键 | 功能 |
|---|---|
| 单击 | 选中单张图片 |
| Ctrl + 单击 | 多选/取消选中 |
| Shift + 单击 | 范围选择 |
| 双击 | 打开轮播大图 |
| Ctrl + 滚轮 | 调整缩略图大小 |
| 右键 | 打开上下文菜单 |
| / | 轮播窗口:上一张/下一张 |
| / | 轮播窗口:上一张/下一张 |
| ESC | 退出轮播窗口 |