1、需求分析

用winform窗体程序,开发一个能够自动、批量对图片进行缩放和裁剪的程序。

原本想直接从网上找类型的工具直接用,但是无奈现在网上能找到的工具,要么不能用,要么就是很

恶心的下载完后还有一堆插件的,要么就是我用不来的。

这个程序是我根据个人需求,想要把所有拍好的人像照,直接批处理成1寸的照片,就能省去很多裁剪图片的时间。

这里要对生成的1寸图片做个说明:1寸图片我网上查到的大小是:照片规格(英寸) (厘米) (像素)

  1寸 2.5*3.5cm 413*295

由于在拍摄时可能存在横拍和竖拍,所以生成后图片虽然也是1寸的,但是方向不一样,这个不影响,还可以根据需求在代码中修改。

先看效果:

可以看出缩放图片后,图片的质量也会随之变低,而裁剪则不会有这个问题。

2、图片裁剪代码

      /// <summary>
/// 裁剪按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button1_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog(); //打开文件夹,选择图片
dialog.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif;*.JPG;*.PNG;|All files(*.*)|*.*";
dialog.Multiselect = true;
if (dialog.ShowDialog() == DialogResult.OK)
{
string path = dialog.FileName;
Bitmap img = new Bitmap(path);
Image img2 = ImageTailor(img, , ); //设置大小为1寸照片
string imgSaveUrl = @"D:/我的图片/处理完成/" + dialog.SafeFileName; //保存图片到文件夹
img2.Save(imgSaveUrl);
img2.Dispose(); //释放资源
}
} public Image ImageTailor(Bitmap bmp,int nowWidth,int nowHeight)
{
Bitmap newbm = new Bitmap(nowWidth, nowHeight);
Graphics g = Graphics.FromImage(newbm);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
//前Rectangle代表画布大小,后Rectangle代表裁剪后右边留下的区域
g.DrawImage(bmp, new Rectangle(, , nowWidth, nowHeight), new Rectangle(, , bmp.Width / , bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return newbm;
}

裁剪按钮方法还没完善好,目前只完成了单张图片的裁剪。要想修改成批量的,只需在openfiledialog控件设置成允许多选,然后根据选中的图片数量进行循环处理,就可以了。

后面的缩放按钮是比较完善的,可以允许多选图片,并进行批处理。

3、图片缩放代码:

缩放图片的代码看起来会比较复杂些,但是逻辑并不难。一些代码也是在网上看其他人写的,拿过来用(那个“中间件确实是自己写着玩的,懒得改回去,哈哈”)

  1      /// <summary>
/// 显示图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_SelectImg_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif;*.JPG;*.PNG;|All files(*.*)|*.*";
dialog.Multiselect = true; //允许文件多选
string folder = "";
if (Directory.Exists(@"D:/我的图片/处理完成/"))
{
folder = @"D:/我的图片/处理完成/";
}
else
{
Directory.CreateDirectory(@"D:/我的图片/处理完成/");
folder = @"D:/我的图片/处理完成/";
}
if (dialog.ShowDialog() == DialogResult.OK)
{
int fileCount = dialog.FileNames.Length; //获取选中图片数量
int countNum = fileCount;
for (int i = ; i < fileCount; i++)
{
string path = dialog.FileNames[i]; //图片绝对路径,包含图片名称
Image img = GetReducedImage(path);
string imgSaveUrl = folder + dialog.SafeFileNames[i]; //保存图片到文件夹
img.Save(imgSaveUrl);
img.Dispose(); //释放资源
countNum--;
if (countNum == )
{
MessageBox.Show("处理图片完成,总计处理:" + fileCount + "张");
}
}
}
} /// <summary>
/// 中间件,写着玩
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public Image GetReducedImage(string fileName)
{
Image ResourceImage = Image.FromFile(fileName);
Bitmap img = new Bitmap(ResourceImage);
return ZoomImage(img, , );
} #region 等比例缩放图片
/// <summary>
/// 等比例缩放图片
/// </summary>
/// <param name="bitmap"></param>
/// <param name="destHeight"></param>
/// <param name="destWidth"></param>
/// <returns></returns>
private Bitmap ZoomImage(Bitmap bitmap, int destHeight, int destWidth)
{
try
{
Image sourImage = bitmap;
ImageCodecInfo ici = GetEncoder(ImageFormat.Jpeg);
int width = , height = ;
//按比例缩放
int sourWidth = sourImage.Width;
int sourHeight = sourImage.Height;
if (sourHeight > destHeight || sourWidth > destWidth)
{
if ((sourWidth * destHeight) > (sourHeight * destWidth))
{
width = destWidth;
height = (destWidth * sourHeight) / sourWidth;
}
else
{
height = destHeight;
width = (sourWidth * destHeight) / sourHeight;
}
}
else
{
width = sourWidth;
height = sourHeight;
}
Bitmap destBitmap = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage(destBitmap);
g.Clear(Color.Transparent);
//设置画布的描绘质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.DrawImage(sourImage, new Rectangle((destWidth - width) / , (destHeight - height) / , width, height), , , sourImage.Width, sourImage.Height, GraphicsUnit.Pixel);
g.Dispose();
//设置压缩质量
EncoderParameters encoderParams = new EncoderParameters();
long[] quality = new long[];
quality[] = ;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[] = encoderParam;
sourImage.Dispose();
return destBitmap;
}
catch
{
return bitmap;
}
}
#endregion public static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}

4、总结:

以上,就完成了简单的图片批量缩放(裁剪)成1寸图片的功能。

C#开发自动照片(图片)裁剪(缩放)工具的更多相关文章

  1. 如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放

    如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放 参考网站:nginx-lua-fas ...

  2. web开发实战--图片裁剪和上传

    前言: 最近的开发中, 有一个上传头像的任务. 由于头像本身的特殊性, 其一般流程为选择图片, 编辑裁剪区域, 再继而上传图片操作. 看似简单的东西, 实则是挺麻烦的一件事. 借助这次开发机会, 来具 ...

  3. 鸿蒙Java开发模式11:鸿蒙图片裁剪功能的实现

    鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口] 目录: 1. 鸿蒙版图片裁剪功能效果展示 2.Java代码实现 3.裁剪工具类实现 4.<鸿蒙Java开发模式>系 ...

  4. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

  5. iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码

    iOS精选源码 扩展内容的cell - folding-cell 一个近乎完整的可识别中国身份证信息的Demo 可自动快速... JPImageresizerView 仿微信的图片裁剪 带年月和至今以 ...

  6. C#图片处理示例(裁剪,缩放,清晰度,水印)

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

  7. C#图片处理高级应用(裁剪,缩放,清晰度,水印)

    转自:http://wu-jian.cnblogs.com/ 前言 需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示.随便看一下, ...

  8. Android开发技巧——定制仿微信图片裁剪控件

    拍照--裁剪,或者是选择图片--裁剪,是我们设置头像或上传图片时经常需要的一组操作.上篇讲了Camera的使用,这篇讲一下我对图片裁剪的实现. 背景 下面的需求都来自产品. 裁剪图片要像微信那样,拖动 ...

  9. 使用PHP的GD2裁剪 + 缩放图片

    /** * 裁剪 + 缩放图片 * @param array $params 包含x,y,width,height,path * @return string */ public function t ...

随机推荐

  1. XAF中多对多关系 (XPO)

    In this lesson, you will learn how to set relationships between business objects. For this purpose, ...

  2. 函数的防抖---js

    执行规定一段时间后执行 <input type="text" id="inp" /> <script> var oInp = docum ...

  3. export default和export的使用

    export default和export都是用来向外暴露成员 export default 向外暴露的成员可以使用任意的变量来接收,在一个模块中,export default只允许向外暴露一次,可以 ...

  4. 区块链社交APP协议分析:Qbao

    - Qbao是什么 - Qbao报文情况 本节我们开始使用Qbao软件,并抓取其报文进行分析. 对APP进行协议分析抓包的一般过程是: 1.打开抓包APP进行抓包: 2.打开APP开始使用: 3.对每 ...

  5. react 地图可视化 cesium 篇

    Vue Function-based API RFC 一出来,感觉 vue 越来越像 react 了.新立项目,决定尝试下 react.js.下面是 react 集成 cesium,核心部分是 web ...

  6. pyecharts和echarts的混合使用

    ECharts是一个由百度开发的纯 Javascript 的图表库,pyecharts是某三位大佬将ECharts移植到Python项目中的产物,在Python网站中可以更轻松的接入图表,但是个人感觉 ...

  7. nginx在centos下的安装

    第一步:打开浏览器下载,再上传到centOS系统中 http://nginx.org/download/ 或者在 centOS系统输入: wget http://nginx.org/download/ ...

  8. linux下配置jdk,tomcat,mysql,redis,zookeeper

    jdk: 解压: tar zxvf jdk-8u144-linux-x64.tar.gz 执行:vi /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0 ...

  9. python语法区别

    python语法区别: 大小写敏感 (动态语言:python)变量不用声明 p.s: 静态语言(Java)必须声明变量 语句末尾可以不打分号 可以直接进行数学计算 复制.粘贴功能失效,粘贴到别的地方的 ...

  10. 初学JavaScript正则表达式(五)

    范围类 [ ] 例: 'a1b1c1s1v1d1f1'.replace(/[a-z]/g,'q') //q1q1q1q1q1q1q1 将a-z范围内的字符替换为q 'a1b1c1s1v1d1f1AKS ...