原文:C#照片批量压缩小工具
做了一个照片批量压缩工具,其实核心代码几分钟就完成了,但整个小工具做下来还是花了一天的时间。中间遇到了大堆问题,并寻求最好的解决方案予以解决。现在就分享一下这个看似简单的小工具所使用的技术。
软件界面如下:
要做真实场景的测试,拿的都是单反照的大相片:图片尺寸3888*2592 图片大小5.37M:
其中遇到的问题与解决方案分享:
1.用listview显示图片缩略图非常慢的问题
这个问题是始料未及的,如果不做也可以,但是没有缩略图就有损软件体验,这是所有最求完美的程序员所不能容忍的,我当然也不例外。
最初的代码如下:(此方法加载每张5M左右的图片需要200-500ms)
+ ?
|
解决办法是用微软提供的Windows
API Code Pack
1.0.1库,通过该库可以直接使用到win7/vista/win8系统的一些特性功能,如资源管理器、桌面、任务栏等等。详细介绍见官方主页
本程序使用WindowsApiCode完成对文件夹下的图片迅速建缩略图的代码如下:
先在界面上添加一个该库提供的explorerBrowser控件,然后初始化该控件:
?
|
完成打开文件夹并显示图片缩略图的代码非常简单:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
采用这种方法打开图片缩略图列表时间可以忽略不计。
2.好看的图片界面库
从前面的界面可以看出,本工具的界面并不丑,可以说还很精美,这也是花了心思的。
本工具的界面我采用的是
官方主页为http://www.componentfactory.com/
3.充分利用多核并行计算,提高图片处理速度
处理批量任务当然要考虑速度,否则就失去了工具的意义了
.netFrameWork4.0里面提供了Parallel系列、Task系列来支持并行运算,让并行计算变得如此简单(为什么不跟着微软走呢,后悔了吧
^_^)。
并行指的是利用现在的CUP多核,同时开启多个任务。跟以往的并发计算不同的是,并发的多个线程其实并非真正同时在运行,他们只是按照时间片,走走停停,逻辑上在同时进行,而并行则是在多个完全独立的核上同时运行任务,是真正的同时在跑。
本程序中并行进行图片压缩的代码如下:
?
|
这里主要强调一下并发任务数量的设置、以及资源的显示释放。
并发数量通过ParallelOptions参数的MaxDegreeOfParallelism来设置,这里必须设置,否则几百张5M的图片同时跑,立马内存就占满了。
资源的显式释放:sourceImg.Dispose(); ThumbImg.Dispose();
这点也非常重要,处理大图片是非常耗内存的,测试过程中就因为没有显式释放内存,偷懒想着.net的自动垃圾回收机制会帮忙善后,结果跑到40多张图片的时候就内存不足了。显式处理资源释放后,压缩图片的速度也因为空余的内存比较多而变快了。
下载本程序 Demo
C#照片批量压缩小工具,码迷,mamicode.com