[工具]图片等比例压缩工具

写在前面

在网盘中有这样一个功能,需要获取所有图片的列表,想来想去,觉得还是生成相同比例的图片,在排版上更美观一些。所以就没事高了一个压缩的工具玩玩。

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Wolfy.ImageCompress
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        private string _strImageFilter = "All Image Files|*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.png;*.tif;*.tiff|" +
                "Windows Bitmap(*.bmp)|*.bmp|" +
                "Windows Icon(*.ico)|*.ico|" +
                "Graphics Interchange Format (*.gif)|(*.gif)|" +
                "JPEG File Interchange Format (*.jpg)|*.jpg;*.jpeg|" +
                "Portable Network Graphics (*.png)|*.png|" +
                "Tag Image File Format (*.tif)|*.tif;*.tiff";
        private string[] filePaths = null;
        private void btnOpenImage_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = _strImageFilter;
            ofd.Multiselect = true;
            if (ofd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            {
                filePaths = ofd.FileNames;
            }
            if (filePaths != null)
            {
                this.plBefore.BackgroundImage = Image.FromFile(filePaths[0]);
            }
        }

        /// <summary>
        /// 等比例压缩图片
        /// </summary>
        private async Task<string> SaveImageByWidthHeight(int intImgCompressWidth, int intImgCompressHeight, Stream stream, string strFileSavePath)
        {
            return await Task.Run<string>(() =>
            {
                //从输入流中获取上传的image对象
                using (Image img = Image.FromStream(stream))
                {
                    //根据压缩比例求出图片的宽度
                    int intWidth = intImgCompressWidth / intImgCompressHeight * img.Height;
                    int intHeight = img.Width * intImgCompressHeight / intImgCompressWidth;
                    //画布
                    using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(img, new Size(intImgCompressWidth, intImgCompressHeight)))
                    {
                        //在画布上创建画笔对象
                        using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap))
                        {
                            //将图片使用压缩后的宽高,从0,0位置画在画布上
                            graphics.DrawImage(img, 0, 0, intImgCompressWidth, intImgCompressHeight);
                            //保存图片
                            bitmap.Save(strFileSavePath);
                        }
                    }
                }
                return strFileSavePath;
            });

        }
        /// <summary>
        /// 界面压缩比例信息提示
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        private string SetCompressMsg(int width, int height)
        {
            this.txtWidth.Text = width.ToString();
            this.txtHeight.Text = height.ToString();
            this.plImageCompress.Width = width;
            this.plImageCompress.Height = height;
            this.lblImageAfter.Text = width.ToString() + "X" + height.ToString();
            return this.lblImageAfter.Text;
        }
        private void MainForm_Load(object sender, EventArgs e)
        {
            SetCompressMsg(80, 80);
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            {
                this.txtSavePath.Text = fbd.SelectedPath;
            }

        }

        private async void btnRun_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.txtHeight.Text) || string.IsNullOrEmpty(this.txtWidth.Text))
            {
                MessageBox.Show("请填写压缩后的图片的宽高");
                return;
            }
            if (string.IsNullOrEmpty(this.txtSavePath.Text))
            {
                MessageBox.Show("请选择文件保存路径");
                return;
            }
            int width = Convert.ToInt32(this.txtWidth.Text);
            int height = Convert.ToInt32(this.txtHeight.Text);
            if (width <= 0 || height <= 0)
            {
                MessageBox.Show("宽高数据不合法,请重新填写");
                return;
            }
            string saveformat = SetCompressMsg(width, height);
            if (filePaths != null)
            {
                foreach (var path in filePaths)
                {
                    string fileName = Path.GetFileNameWithoutExtension(path);
                    string fileExt = Path.GetExtension(path);
                    this.plBefore.BackgroundImage = Image.FromFile(path);
                    string fileNewName = fileName + "_" + saveformat + fileExt;
                    string fileSavePath = Path.Combine(this.txtSavePath.Text, fileNewName);
                    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
                    {
                        await SaveImageByWidthHeight(width, height, fs, fileSavePath);
                        this.plImageCompress.BackgroundImage = Image.FromFile(fileSavePath);
                    }

                }
            }
            else
            {
                MessageBox.Show("请选择图片");
            }
        }

    }
}

界面

支持图片多选

压缩后

总结

工具实现起来很简单,通过异步的方式进行压缩,速度还是比较快的。

时间: 2024-10-15 05:49:07

[工具]图片等比例压缩工具的相关文章

12款实用免费批量图片体积优化压缩工具!网页设计必备 (在线网页版+桌面工具下载)(转)

转载 楼主我用的第一个图片优化,效果非常好,推荐! 我们都知道,漂亮的图片可以让一个网页看起来更加高端大气上档次.然而,一般高分辨率的高清图片/照片的体积都比较巨大,如果网页里包含很多图片,那网页加载的速度就会变得很慢. 不仅如此,如果网页的访问量较大,其中图片消耗的流量带宽也会成倍增加!因此,如能在不损失图片质量或在肉眼不易辨别的情况下优化压缩图片,尽可能减小图片体积,那么一来可以加快网页显示速度,二来减轻服务器负担,三来还能大大减少带宽流量的成本支出,实乃好处多多.因此今天整理了这些实用的图

jQuery实现的图片等比例缩放效果

jQuery实现的图片等比例缩放效果:如果一个容器中放一个比容器还要大的图,那就可能就造成布局出现问题,就算是不容器大,有时候也看起来不够美观,这时候就要限制图片的尺寸,当然不能变形,否则就难看了,下面就介绍一下如何使用jQuery实现等比例缩放效果.代码如下: <div id="demo"> <img src="a.jpg" width="800" height="300" alt="图片&quo

Java 实现图片等比例缩略图 (Thumbnailator + Jsp+SpringMVC)

Web应用为上传图片生成缩略图是常见的基本功能,通过缩略图生成提高了信息浏览时的性能,在保证用户使用体验的同时减少了数据传输量.本次以实例的方式,讲解如何使用使用Java实现图片等比例缩略图生成功能. 效果查看 代码编写 Thumbnailator 是一个为Java界面更流畅的缩略图生成库.从API提供现有的图像文件和图像对象的缩略图中简化了缩略过程,两三行代码就能够从现有图片生成缩略图,且允许微调缩略图生成,同时保持了需要写入到最低限度的代码量. 1.导入相关的包 2.配置web.xml we

图片保持比例,padding的妙用

要保持图片的比例不变 这一张图片在不同分辨率(1980px, 1364px,移动端400px)下均保持了一定的比例不变. 方法: padding以及margin的上下(margin-top | margin-bottom | padding-top | padding-bottom)使用百分比时.参考的是容器的宽度.注意不是容器的高度. 容器使用width:100% ,这样容器的高度由padding-top撑开,高度为宽度的35%.这样图片的比例始终是 100:35 不会变形.

CSS3结合jQuery制作的冒泡工具图片提示效果

一款基于CSS3技术的冒泡提示效果,为了演示效果,生成了许多冒泡的提示,实际使用中,可能不需要这么多,结合jQuery和jquery UI共同实现的网页提示特效,挺不错.因CSS不支持IE8及以下低版本,所以请使用IE9.chrome或火狐测试. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transition

javascript图片等比例缩放代码

javascript图片等比例缩放代码: 图片的尺寸在初始的状态下往往不能够完美的适应网页的布局,这个时候就需要对图片进行缩放处理,当然不能够是无规则的进行缩放,否则可能出现图片变形现象,下面是一段能够对图片进行等比例缩放的实例代码. 代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content=&q

微信小程序学习点滴《十二》:图片等比例缩放 获取屏幕尺寸图片尺寸 自适应

原文:http://www.wxapp-union.com/portal.php?mod=view&aid=360 早上在论坛上看到有人写了关于图片等比例缩放的文章,只是判断了图片宽是否大于屏幕宽.我之前在做Android的时候也会遇到图片等比例缩放的问题.应该是用图片宽高比和屏幕宽高比做判断.做个笔记. 老规矩,先上图. 1.图片高宽比小于屏幕高宽比 2.图片高宽比大于屏幕高宽比 3.这种其实也是图片高宽比小于屏幕高宽比,但是高宽都大于屏幕高宽.所以不能简单用高宽来判断,应该是用高宽比判断后做

利用 :before 特性实现图片按比例显示

好吧,想不到自称布局小沙弥的我会被图片按比例显示给尴尬到. 设计师跟我说,这里的图要按 750x330 的,好吧,但这图是屏宽呀,屏幕宽度会变化的,那高度也会不定咯, 要么裁图片(工作量大),要么给定高(图片会比例不对,或者用 background 显示不全),来体会一下... 当宽度变化时,立马就呵呵了,一脸懵逼... 后来吧,在研究大量图片数据加载优化问题时,去调研了下淘宝天猫京东,然后一不小心发现了 :before 这种布局方式,先看一眼代码 .img { position: relati

利用javascript设置图片等比例缩小

网站的内容页面,经常要放图片,如果图片太大会撑出,影响页面美观.如果只是用css限 制图片的最大宽度,会引起图片的变形,本文建议还是用js来实现,实现方式如下: <script language="javascript" type="text/javascript"> window.onload = function () { //判断图片大小,超过一定宽度,要通过js定义图片大小 $.each($(".sec-content img"