乔乔lovefreedom

导航

.NET图片处理

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Diagnostics;

namespace ImageCompressTool
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime start = DateTime.Now;

            ImageDealTool dealtool = new ImageDealTool();
            //获得exe文件所在的路径(包含了exe文件的名称)
            string filelocation = Process.GetCurrentProcess().MainModule.FileName;
            //获得当前执行的exe文件的名称
            string exefilename =Process.GetCurrentProcess().MainModule.ModuleName;
            //要获取子字符串的长度
            int index =filelocation.IndexOf(exefilename);
            //获得当前的文件夹路径,以//结尾,下面直接放文件夹即可
            string aimlocation = filelocation.Substring(0, index);
            //读取待处理图片的名称
            DirectoryInfo info = new DirectoryInfo(aimlocation);
            //在当前文件夹下获得图片名称,这里必须做成一个集合,因为图片会有很多张
            FileInfo[] filesimages = info.GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
            //遍历循环获得每一张图片
            foreach (FileInfo fileinfoimage in filesimages)
            {
                //获得每一张图片的名称
                string foundimagename = fileinfoimage.Name;
                //建立一个与图片同名称的文件夹
                //获得需要建立文件夹的名称

                //处理图片的名称,从后往前寻找字符,只要后面发现. 就可以确定文件夹的名称,这样可以防止bug
                int foundpointlocation = foundimagename.LastIndexOf('.');
                string foundedfoldername = foundimagename.Substring(0, foundpointlocation);
               //此时我们遍历一次就为一个文件夹进行命名
                //在当前的文件夹下面创建一个文件夹

                //首先获得新建文件夹的路径
                string cutimagepathpath = aimlocation + foundedfoldername;
                //创建新的文件夹用以保存图片
                Directory.CreateDirectory(cutimagepathpath);
                DirectoryInfo infoinfo = new DirectoryInfo(cutimagepathpath);
                //在对应的创建好的文件夹下面存放切好的图片和压缩好的图片
                //ImageDealTool dealtool = new ImageDealTool();
               
                //1.压缩图片,比较节省时间
                //设置压缩图片的名称,这里都是固定的
                string compreesedimagenamename = "snapshot.jpg";
                //执行压缩操作
                //观察压缩操作传递的参数
                //dealtool.ImageCompress(aimlocation+imagenamename, aimlocation+dealimagename, "jpg");
                dealtool.ImageCompress(foundimagename, infoinfo + "\\" + compreesedimagenamename, "jpg");
                //imgtool.ImageCompress(@"D:\张开发\百花谷场景(高质量).jpg", @"D:\新建文件夹 (2)\hds.jpg", "jpg");
                //2.切割图片
                //观察切割操作需要传递的参数
                //cutimg.Cut(@"D:\张开发\百花谷场景(高质量).jpg", 200, 200, @"D:", "jpg");
                //切图操作将切割好的图片保存时传递的参数比较特殊,需要注意
                dealtool.Cut(foundimagename, 200, 200, infoinfo + "\\", "jpg");
            }
            DateTime end = DateTime.Now;
            TimeSpan timewaste = end - start;
            Console.WriteLine("计算耗时:"+timewaste.TotalSeconds.ToString());
            //string imagenamename = filesimage[0].Name;
            //设置压缩完成之后文件夹的名称
            //string dealimagename = string.Format("{0}" + imagenamename, "被压缩的");
            //切割图片的操作,切割完成之后放入exe所在文件夹的子文件夹

            //设置切割完毕之后图片存放的文件夹路径,在当前的文件夹下新建一个文件夹
            //文件夹名称
            //string foldernamename = "cutimage";
           
            //获得图片要存到哪个文件夹下的路径
           // string aimdiretorypath = infoinfo + "\\";

            //dealtool.Cut(aimlocation + imagenamename, 200, 200, aimdiretorypath, "jpg");
            //cutimg.Cut(@"D:\张开发\百花谷场景(高质量).jpg", 200, 200, @"D:", "jpg");
            //压缩图片的操作
            //dealtool.ImageCompress(aimlocation+imagenamename, aimlocation+dealimagename, "jpg");
           
            //imgtool.ImageCompress(@"D:\张开发\百花谷场景(高质量).jpg", @"D:\新建文件夹 (2)\hds.jpg", "jpg");


            //Console.ReadLine();

            //Console.WriteLine("欢迎进入图片转换系统,请选择要执行的操作:选择的操作代号为:1,2,3   以下为1,2,3操作的解释说明");
            //Console.WriteLine("1.将指定像素的图片转换成指定200*200像素的图片");
            //Console.WriteLine("2.将指定将指定像素的图片转换成最大像素(宽或高其一均可)为500pixel的图片");
            //Console.WriteLine("3.退出系统");
            //string operselection = Console.ReadLine();
            //switch (operselection.ToLower())
            //{
            //  case "1":
            //找到调用函数
            //cutimg.Cut(@"D:\张开发\百花谷场景(高质量).jpg", 200, 200, @"D:", "jpg");
            //    Console.WriteLine("欢迎进入图片切割系统,输入每一项后按回车键");
            //  Console.WriteLine("输入要处理图片所在的位置:");
            //string inputpath = Console.ReadLine();
            //Console.WriteLine("输入被处理图片的宽度:输入200即可");
            //string inputwidth = Console.ReadLine();
            //Console.WriteLine("输入被处理图片的高度:输入200即可");
            //string inputheight = Console.ReadLine();
            //Console.WriteLine("输入图片要保存的位置:");
            //string outputpath = Console.ReadLine();
            //Console.WriteLine("输入图片切割后保存的格式,支持输入jpg,png,bmp,gif格式");
            //string savetype = Console.ReadLine();
            //参数输入完毕,我们进行方法调用
            //ImageDealTool dealtool = new ImageDealTool();
            //获得exe文件所在的路径
            //string inputpath = "";

            //dealtool.Cut(inputpath, Convert.ToInt32(inputwidth),
//Convert.ToInt32(inputheight), outputpath, savetype);
            //    Console.WriteLine("请等待");
            //    break;
            //case "2":
            //    Console.WriteLine("欢迎进入图片压缩系统,输入每一项后按回车键");
            //    //找到调用函数
            //    //imgtool.ImageCompress(@"D:\张开发\百花谷场景(高质量).jpg", @"D:\新建文件夹 (2)\hds.jpg", "jpg");
            //    Console.WriteLine("输入要处理图片所在的位置:");
            //    string imagelocation = Console.ReadLine();
            //    Console.WriteLine("输入图片要保存的位置:");
            //    string outputlocation = Console.ReadLine();
            //    Console.WriteLine("输入图片切割后保存的格式,支持输入jpg,png,bmp,gif格式");
            //    string imagetype = Console.ReadLine();
            //参数输入完毕,我们进行方法调用
            //ImageDealTool dealtool1 = new ImageDealTool();
            //dealtool1.ImageCompress(imagelocation, outputlocation, imagetype);
            //Console.WriteLine("请等待");
            //break;
            //case "3":
            //    break;
            // }
            //string imageurl = Console.ReadLine();
            //string createurl = Console.ReadLine();
            //imgtool.ImageCompress(@"D:\张开发\百花谷场景(高质量).jpg", @"D:\新建文件夹 (2)\hds.jpg", "jpg");
        }
    }
    public class ImageDealTool
    {
        //操作需求可能改变,开发出面向对象的代码


        /// <summary>
        /// 图片等比例压缩方法
        /// </summary>
        /// <param name="url">图片所在的文件夹</param>
        /// <param name="savepath">压缩后图片所在的文件夹</param>
        /// <param name="fileExt">压缩后图片的保存格式,例如jpg,gif等</param>
        public void ImageCompress(string url, string savepath, string fileExt)
        {
            //读取一张图片
            Bitmap myImage = new Bitmap(url);
            //原来图片的宽和高(以像素为单位)
            int widthPre = myImage.Width;
            int heightPre = myImage.Height;
            //设置压缩以后图片的宽和高
            int widthNex = 1;
            int heightNex = 1;
            //计算压缩后图片的宽和高
            if (widthPre == heightPre)
            {
                //如果宽和高相等,就设置成500px
                widthNex = 500;
                heightNex = 500;
            }
            else if (widthPre > heightPre)
            {
                //如果宽大于高,则将较大的设置成为500px
                widthNex = 500;
                //较小的数按比例去计算
                heightNex = ((widthNex * heightPre) / widthPre);
            }
            else
            {
                heightNex = 500;
                widthNex = ((widthPre * heightNex) / heightPre);
            }
            //取得图片大小
            Size mySize = new Size(widthNex, heightNex);
            //新建一张bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(mySize.Width, mySize.Height);
            //新建一张画板
            Graphics g = Graphics.FromImage(bitmap);
            //设置高质量插入值方法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //清空一下画布
            g.Clear(Color.White);
            //在指定位置画图
            g.DrawImage(myImage, new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
            new System.Drawing.Rectangle(0, 0, myImage.Width, myImage.Height),
            System.Drawing.GraphicsUnit.Pixel);
            //画图完毕后可以设置保存图片的格式
            ImageFormat format = ImageFormat.Jpeg;
            switch (fileExt.ToLower())
            {
                case "jpg":
                    format = ImageFormat.Jpeg;
                    break;
                case "png":
                    format = ImageFormat.Png;
                    break;
                case "bmp":
                    format = ImageFormat.Bmp;
                    break;
                case "gif":
                    format = ImageFormat.Gif;
                    break;
                default:
                    break;
            }
            //保存缩略图
            bitmap.Save(savepath, System.Drawing.Imaging.ImageFormat.Jpeg);
            g.Dispose();
            myImage.Dispose();
            bitmap.Dispose();
        }
        /// <summary>
        /// 图片按指定像素切割成字图片的方法
        /// </summary>
        /// <param name="url">要切割图片的存放位置</param>
        /// <param name="width">切割后图片的宽度</param>
        /// <param name="height">切割后图片的高度</param>
        /// <param name="savepath">切割后图片的保存路径</param>
        /// <param name="fileExt">切割后图片的保存格式</param>
        public void Cut(string url, int width, int height, string savepath, string fileExt)
        {
            //这里需要考虑像素不能整除的情况,需要将剩下的像素点进行补齐

            //创建一张图片
            Bitmap bitmap = new Bitmap(url);
            //纵向能切成多少张
            Decimal MaxRow = Math.Ceiling((Decimal)bitmap.Height / height);
            //Decimal MaxColumn = Math.Ceiling((Decimal)bitmap.Height / height);
            //算出纵向切割完成之后最后一张图片剩余的像素点,对处理结果进行求于操作
            //精确到一像素
            int Columnleft = (int)(bitmap.Height % height);
            //横向能切成多少张
            Decimal MaxColumn = Math.Ceiling((Decimal)bitmap.Width / width);
            //Decimal MaxRow = Math.Ceiling((Decimal)bitmap.Width / width);
            //算出横向切割完成之后剩余的像素点
            int Rowleft = (int)(bitmap.Width % width);

            //外层两个循环是为了图片的命名
            for (Decimal i = 0; i < MaxRow; i++)
            {
                for (Decimal j = 0; j < MaxColumn; j++)
                {
                    //设置文件名称
                    string filename = j.ToString() + "_" + i.ToString() + "." + fileExt;
                    //切割成小图片的宽度和高度,参数为用户输入的宽度和高度
                    Bitmap bmp = new Bitmap(width, height);

                    //画图这里是核心操作

                    //画图
                    for (int offsetX = 0; offsetX < width; offsetX++)
                    {
                        for (int offsetY = 0; offsetY < height; offsetY++)
                        {
                            //如果没有超越边界
                            if (((j * width + offsetX) < bitmap.Width) && ((i * height + offsetY) < bitmap.Height))
                            {
                                //这一步是核心的操作
                                //按照每一像素绘制图片
                                bmp.SetPixel(offsetX, offsetY, bitmap.GetPixel((int)(j * width + offsetX), (int)(i * height + offsetY)));
                            }
                        }
                    }


                    //Graphics g = Graphics.FromImage(bmp);
                    //加水印
                    //g.DrawString(
                    //  "a", new Font("黑体", 20), new SolidBrush(Color.FromArgb(70, Color.WhiteSmoke)), 60, height / 2);

                    ImageFormat format = ImageFormat.Jpeg;
                    switch (fileExt.ToLower())
                    {
                        case "jpg":
                            format = ImageFormat.Jpeg;
                            break;
                        case "png":
                            format = ImageFormat.Png;
                            break;
                        case "bmp":
                            format = ImageFormat.Bmp;
                            break;
                        case "gif":
                            format = ImageFormat.Gif;
                            break;
                        default:
                            break;
                    }
                    bmp.Save(savepath + "\\" + filename, format);
                    bmp.Dispose();
                }
            }
        }

    }
}

posted on 2011-02-14 14:34  乔乔lovefreedom  阅读(715)  评论(1编辑  收藏  举报