C#制作图片压缩工具
最近做的项目当中,需要将视频采集卡采集过来的图片进行压缩处理,原有一张JPG默认320*240大小为300KB,经过压缩之后为6KB,压缩50倍!
先放上截图吧:
可以添加单个文件,支持多选,也可以添加文件夹,自动遍历文件夹中的图片,当然,还有很多不完善的地方,只是个例子而已!呵呵!
贴出所有完整代码吧,一看就懂!呵呵,用到了皮肤加载,就在构造函数当中!不好意思有点懒,代码都没有注释!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using SKINPPDOTNETLib;
namespace EcanPicTools
{
public partial class frmMain : Form
{
Image img;
Bitmap bmp;
Graphics grap;
int width, height;
SKINPPDOTNETLib.SkinPPDotNetClass myskin = new SkinPPDotNetClass();
public frmMain()
{
InitializeComponent();
this.txtbili.KeyPress += new KeyPressEventHandler(txt_KeyPress);
this.txtWidth.KeyPress += new KeyPressEventHandler(txt_KeyPress);
this.txtHeight.KeyPress += new KeyPressEventHandler(txt_KeyPress);
Control.CheckForIllegalCrossThreadCalls = false;
myskin.LoadSkin(Application.StartupPath + @"\spring.ssk", true);
}
private void frmMain_Load(object sender, EventArgs e)
{
init();
}
private void init()
{
this.Text = "图片压缩工具(作者:刘典武)---普通模式";
labTransparent.Text = "透明值:100%";
txtWidth.Enabled = false;
txtHeight.Enabled = false;
rbtnbili.Checked = true;
txtbili.Focus();
}
private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8))
{
e.Handled = true;
}
base.OnKeyPress(e);
}
private void yasuo(string frompath, string topath)
{
try
{
img = Image.FromFile(frompath);
if (rbtnbili.Checked)
{
width = Convert.ToInt32(img.Width * (Convert.ToDouble(txtbili.Text) / 100));
height = Convert.ToInt32(img.Height * (Convert.ToDouble(txtbili.Text) / 100));
}
else
{
width = Convert.ToInt32(txtWidth.Text.Trim());
height = Convert.ToInt32(txtHeight.Text.Trim());
}
bmp = new Bitmap(width, height);
grap = Graphics.FromImage(bmp);
grap.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
grap.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grap.DrawImage(img, new Rectangle(0, 0, width, height));
bmp.Save(topath, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Dispose();
img.Dispose();
grap.Dispose();
}
catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); }
finally { }
}
private void btnStart_Click(object sender, EventArgs e)
{
if (lboxPicPath.Items.Count <= 0)
{
MessageBox.Show("你还没有选择要压缩的图片!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (txtSavePath.Text == "")
{
MessageBox.Show("你还没有选择要保存的文件夹路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
pbar.Maximum = lboxPicPath.Items.Count;
pbar.Value = 0;
if (rbtnbili.Checked && txtbili.Text == "")
{
MessageBox.Show("请填好比例值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtbili.Focus();
return;
}
else if (rbtnkg.Checked && (txtHeight.Text == "" || txtWidth.Text == ""))
{
MessageBox.Show("请填好宽高值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtWidth.Focus();
return;
}
for (int i = 0; i < lboxPicPath.Items.Count; i++)
{
pbar.Value = i + 1;
this.yasuo(lboxPicPath.Items[i].ToString(), txtSavePath.Text + "\\" + Path.GetFileName(lboxPicPath.Items[i].ToString()));
labInfo.Text = "已经压缩图片张数:" + Convert.ToString(i + 1);
}
MessageBox.Show("恭喜,压缩图片成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnShow_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
this.getFile(fbd.SelectedPath);
}
}
private void getFile(string path)
{
DirectoryInfo pic = new DirectoryInfo(path);
foreach (FileInfo file in pic.GetFiles("*.*"))
{
lboxPicPath.Items.Add(file.FullName);
}
}
private void btnShowSavePath_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "请选择保存输出图像路径";
fbd.ShowNewFolderButton = true;
if (fbd.ShowDialog() == DialogResult.OK)
{
if (fbd.SelectedPath.ToString() != "")
{
txtSavePath.Text = fbd.SelectedPath;
}
}
}
private void btnSelect_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Title = "请选择要压缩的图片";
open.Filter = "图片文件(*.jpg,*.bmp,*.png,*.gif)|*.jpg;*.bmp;*.png;*.gif";
open.Multiselect = true;
if (open.ShowDialog() == DialogResult.OK)
{
foreach (string file in open.FileNames)
{
lboxPicPath.Items.Add(file);
}
}
}
private void picTop_Click(object sender, EventArgs e)
{
if (this.TopMost)
{
this.TopMost = false;
this.Text = "图片压缩工具(作者:刘典武)---普通模式";
}
else
{
this.TopMost = true;
this.Text = "图片压缩工具(作者:刘典武)---置顶模式";
}
}
private void tbarTransparent_Scroll(object sender, EventArgs e)
{
labTransparent.Text = "透明值:" + Convert.ToString(100 - tbarTransparent.Value) + "%";
this.Opacity = 1 - (float)(tbarTransparent.Value) / 100;
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (lboxPicPath.SelectedItems.Count > 0)
{
for (int i = lboxPicPath.SelectedItems.Count - 1; i >= 0; i--)
{
lboxPicPath.Items.Remove(lboxPicPath.SelectedItems[i]);
}
}
else
{
MessageBox.Show("请选择要移除的文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void rbtnbili_CheckedChanged(object sender, EventArgs e)
{
txtbili.Enabled = rbtnbili.Checked;
if (rbtnbili.Checked)
{
txtbili.Focus();
}
}
private void rbtnkg_CheckedChanged(object sender, EventArgs e)
{
txtWidth.Enabled = rbtnkg.Checked;
txtHeight.Enabled = rbtnkg.Checked;
if (rbtnkg.Checked)
{
txtWidth.Focus();
}
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using SKINPPDOTNETLib;
namespace EcanPicTools
{
public partial class frmMain : Form
{
Image img;
Bitmap bmp;
Graphics grap;
int width, height;
SKINPPDOTNETLib.SkinPPDotNetClass myskin = new SkinPPDotNetClass();
public frmMain()
{
InitializeComponent();
this.txtbili.KeyPress += new KeyPressEventHandler(txt_KeyPress);
this.txtWidth.KeyPress += new KeyPressEventHandler(txt_KeyPress);
this.txtHeight.KeyPress += new KeyPressEventHandler(txt_KeyPress);
Control.CheckForIllegalCrossThreadCalls = false;
myskin.LoadSkin(Application.StartupPath + @"\spring.ssk", true);
}
private void frmMain_Load(object sender, EventArgs e)
{
init();
}
private void init()
{
this.Text = "图片压缩工具(作者:刘典武)---普通模式";
labTransparent.Text = "透明值:100%";
txtWidth.Enabled = false;
txtHeight.Enabled = false;
rbtnbili.Checked = true;
txtbili.Focus();
}
private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8))
{
e.Handled = true;
}
base.OnKeyPress(e);
}
private void yasuo(string frompath, string topath)
{
try
{
img = Image.FromFile(frompath);
if (rbtnbili.Checked)
{
width = Convert.ToInt32(img.Width * (Convert.ToDouble(txtbili.Text) / 100));
height = Convert.ToInt32(img.Height * (Convert.ToDouble(txtbili.Text) / 100));
}
else
{
width = Convert.ToInt32(txtWidth.Text.Trim());
height = Convert.ToInt32(txtHeight.Text.Trim());
}
bmp = new Bitmap(width, height);
grap = Graphics.FromImage(bmp);
grap.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
grap.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grap.DrawImage(img, new Rectangle(0, 0, width, height));
bmp.Save(topath, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Dispose();
img.Dispose();
grap.Dispose();
}
catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); }
finally { }
}
private void btnStart_Click(object sender, EventArgs e)
{
if (lboxPicPath.Items.Count <= 0)
{
MessageBox.Show("你还没有选择要压缩的图片!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (txtSavePath.Text == "")
{
MessageBox.Show("你还没有选择要保存的文件夹路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
pbar.Maximum = lboxPicPath.Items.Count;
pbar.Value = 0;
if (rbtnbili.Checked && txtbili.Text == "")
{
MessageBox.Show("请填好比例值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtbili.Focus();
return;
}
else if (rbtnkg.Checked && (txtHeight.Text == "" || txtWidth.Text == ""))
{
MessageBox.Show("请填好宽高值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtWidth.Focus();
return;
}
for (int i = 0; i < lboxPicPath.Items.Count; i++)
{
pbar.Value = i + 1;
this.yasuo(lboxPicPath.Items[i].ToString(), txtSavePath.Text + "\\" + Path.GetFileName(lboxPicPath.Items[i].ToString()));
labInfo.Text = "已经压缩图片张数:" + Convert.ToString(i + 1);
}
MessageBox.Show("恭喜,压缩图片成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnShow_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
this.getFile(fbd.SelectedPath);
}
}
private void getFile(string path)
{
DirectoryInfo pic = new DirectoryInfo(path);
foreach (FileInfo file in pic.GetFiles("*.*"))
{
lboxPicPath.Items.Add(file.FullName);
}
}
private void btnShowSavePath_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "请选择保存输出图像路径";
fbd.ShowNewFolderButton = true;
if (fbd.ShowDialog() == DialogResult.OK)
{
if (fbd.SelectedPath.ToString() != "")
{
txtSavePath.Text = fbd.SelectedPath;
}
}
}
private void btnSelect_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Title = "请选择要压缩的图片";
open.Filter = "图片文件(*.jpg,*.bmp,*.png,*.gif)|*.jpg;*.bmp;*.png;*.gif";
open.Multiselect = true;
if (open.ShowDialog() == DialogResult.OK)
{
foreach (string file in open.FileNames)
{
lboxPicPath.Items.Add(file);
}
}
}
private void picTop_Click(object sender, EventArgs e)
{
if (this.TopMost)
{
this.TopMost = false;
this.Text = "图片压缩工具(作者:刘典武)---普通模式";
}
else
{
this.TopMost = true;
this.Text = "图片压缩工具(作者:刘典武)---置顶模式";
}
}
private void tbarTransparent_Scroll(object sender, EventArgs e)
{
labTransparent.Text = "透明值:" + Convert.ToString(100 - tbarTransparent.Value) + "%";
this.Opacity = 1 - (float)(tbarTransparent.Value) / 100;
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (lboxPicPath.SelectedItems.Count > 0)
{
for (int i = lboxPicPath.SelectedItems.Count - 1; i >= 0; i--)
{
lboxPicPath.Items.Remove(lboxPicPath.SelectedItems[i]);
}
}
else
{
MessageBox.Show("请选择要移除的文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void rbtnbili_CheckedChanged(object sender, EventArgs e)
{
txtbili.Enabled = rbtnbili.Checked;
if (rbtnbili.Checked)
{
txtbili.Focus();
}
}
private void rbtnkg_CheckedChanged(object sender, EventArgs e)
{
txtWidth.Enabled = rbtnkg.Checked;
txtHeight.Enabled = rbtnkg.Checked;
if (rbtnkg.Checked)
{
txtWidth.Focus();
}
}
}
}
源文件下载:点击这里下载