博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C#开发一个WinForm版的批量图片压缩工具
阅读量:6846 次
发布时间:2019-06-26

本文共 2886 字,大约阅读时间需要 9 分钟。

我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如jpg格式、bmp格式等)、压缩(因为有的图片很大很占空间,看能否在保证清晰可辨、尺寸适中的前提下,适当的压缩掉一部分空间)的小程序。这里只是重点分享一下如何对图片进行压缩。

我们也不是水平非常高的图像处理专家,但是实际项目中又有这个需求,作为普通的程序员应该如何满足这个要求呢?

很显然,最简单的思路就是适当的缩小原图的尺寸大小或者是适当的降低原图的质量要求,这样就能有效地降低原图所占的空间。

先上一个程序的截图:

Center

我们通过选择图片的原目录以及目标目录,设置好压缩大小和压缩质量,点击开始压缩按钮,即可进行批量图片压缩。

在图片的原目录选择当中,能够遍历根目录下的所有图片(包括子目录下的图片)。

好了,很简单的一个界面,下面我们直接上几段核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// <summary>
/// 压缩图片方法
/// </summary>
/// <param name="sourcePath">原目录</param>
/// <param name="targetPath">目标目录</param>
/// <returns>压缩是否成功</returns>
private 
bool 
CompressPicture(
string 
sourcePath, 
string 
targetPath)
{
    
try
    
{
        
double 
sizeRate = 
double
.Parse(cbSizeRate.Text) / 100;
// 大小比率
        
int 
qualityRate = 
int
.Parse(cbQualityRate.Text);
// 品质比率
               
        
Image sourceImage = Image.FromFile(sourcePath);
        
//调整图片大小
        
Bitmap bmp = 
new 
Bitmap(sourceImage, 
new 
Size((
int
)(sourceImage.Width * sizeRate), (
int
)(sourceImage.Height * sizeRate)));
        
//压缩图片
        
SaveAsJPEG(bmp, targetPath, qualityRate);
               
        
GC.Collect();
        
return 
true
;
    
}
    
catch
    
{
        
return 
false
;
    
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/// <summary>
/// 保存为JPEG格式,支持压缩质量选项
/// </summary>
/// <param name="bmp">原始位图</param>
/// <param name="FileName">新文件地址</param>
/// <param name="Qty">压缩质量,越大越好,文件也越大(0-100)</param>
/// <returns>成功标志</returns>
public 
static 
bool 
SaveAsJPEG(Bitmap bmp, 
string 
FileName, 
int 
Qty)
{
    
try
    
{
        
EncoderParameter p;
        
EncoderParameters ps;
            
        
ps = 
new 
EncoderParameters(1);
            
        
p = 
new 
EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qty);
        
ps.Param[0] = p;
            
        
bmp.Save(FileName, GetCodecInfo(
"image/jpeg"
), ps);
            
        
return 
true
;
    
}
    
catch
    
{
        
return 
false
;
    
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>
/// 保存JPG时用
/// </summary>
/// <param name="mimeType"></param>
/// <returns>得到指定mimeType的ImageCodecInfo</returns>
private 
static 
ImageCodecInfo GetCodecInfo(
string 
mimeType)
{
    
ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
    
foreach 
(ImageCodecInfo ici 
in 
CodecInfo)
    
{
        
if 
(ici.MimeType == mimeType) 
return 
ici;
    
}
    
return 
null
;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// <summary>
/// 遍历文件
/// </summary>
/// <param name="info"></param>
public 
void 
ListFiles(FileSystemInfo info)
{
    
if 
(!info.Exists) 
return
;
    
DirectoryInfo dir = info 
as 
DirectoryInfo;
    
if 
(dir == 
null
return
;
    
FileSystemInfo[] files = dir.GetFileSystemInfos();
    
for 
(
int 
i = 0; i < files.Length; i++)
    
{
        
FileInfo file = files[i] 
as 
FileInfo;
        
if 
(file != 
null 
&& file.Name.Trim().LastIndexOf(
"."
) > -1)
        
{
            
if 
(file.Name.Substring(file.Name.LastIndexOf(
"."
)).ToUpper() == 
".JPG"
)
            
{
                
this
.lvSourceFolderList.Items.Add(file.FullName);
                
imageList.Add(file.FullName);
            
}
        
}
        
else
        
{
            
ListFiles(files[i]); 
//对于子目录,进行递归调用
        
}
    
}
}

源代码下载地址:

本文转自 guwei4037  51CTO博客,原文链接:http://blog.51cto.com/csharper/1330029

你可能感兴趣的文章
AI自学时代:Python、JavaScript、Swift 、Java如何选? ...
查看>>
SEO技巧:新网站关键词优化怎么优化到百度首页【思维篇】 ...
查看>>
第二十章:异步和文件I/O.(二十一)
查看>>
低成本学习IT技术
查看>>
用 Go 搭建 Kubernetes Operators
查看>>
kubernetes 服务发现和负载均衡
查看>>
腾讯系互联网券商富途证券将赴美IPO,最高融资3亿美元
查看>>
shell输入内容时不显示内容
查看>>
杭州国芯科技完成1.5亿元B轮融资,专注物联网人工智能芯片
查看>>
Python零基础学习笔记(七)—— Number数字类型及其转换
查看>>
浅析ServiceMesh & Istio
查看>>
python设计模式(十三):解释器模式
查看>>
列式存储系列(一)C-Store
查看>>
MINIEYE周翔:6年后更加清晰自己的定位是什么
查看>>
使用Java SDK实现离线签名
查看>>
OSS工具篇
查看>>
OpenStack与Kubernetes融合架构下的优化实践
查看>>
Linux基础命令---cpio
查看>>
10 分钟让你明白 MySQL 是如何利用索引的
查看>>
免费报名 | 十年沉淀 阿里双11数据库技术峰会北京站邀您同行
查看>>