c# 练手案例,2DImage图片处理

C# 专栏收录该内容
37 篇文章 1 订阅

案例所涉及到的内容:文件读取,写入。图片的形变,切割,缝合。

项目的流程如下:

1.检索文件

2.修改图片的尺寸比例成3:2

3.按3:2比例分割图片成一块块正方形

4.批量修改名字

5.按顺序名字把子图片合并完整的一张图

 

 

namespace ImageTool
{
    class Program
    {
        private static string _fileNameWithoutExtension; //文件名
        private static string _fileExtension;//扩展名
        private static string _fileDirectory;//所属文件夹
        private static string _targetImagePath = null;//分割图片所属的文件路径
        private static string _imageSuffix; //设置图片后缀格式

        public static class Data
        {
            public const string jpg = ".jpg";
            public const string bmg = ".bmg";
            public const string png = ".png";
            public const string tiff = ".tiff";

            public const string sprit = "\\";

            private static string image = null;

            public static string Image
            {
                get
                {
                    if (image == null)
                    {
                        return image = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString();
                    }
                    else
                    {
                        return image;
                    }

                }
            }

        }


        enum StatusMessage
        {
            Null,
            Move,
            Unusual
        }

        static void MessageHandling(StatusMessage SM)
        {
            switch (SM)
            {
                case StatusMessage.Null:
                    Console.WriteLine("程序未启动...");
                    break;
                case StatusMessage.Move:
                    Console.WriteLine("程序运行中...");
                    break;
                case StatusMessage.Unusual:
                    Console.WriteLine("出现异常...");
                    return;
            }
        }

        public Program() { }

        static void Main()
        {
            Program program = new Program();

            Console.WriteLine("输入修改图片的地址...");
            var inputImgPath = Console.ReadLine();

            string[] suffix = { ".exe" };
            ArrayList Lists = FileSearch(inputImgPath, suffix);
            Console.WriteLine("\n" + "检索到的文件列表如下: ");
            if (Lists.Count == 0) {

                Console.WriteLine("文件列表为null");
            }
            for (int i = 0; i < Lists.Count; i++)
            {
                Console.WriteLine("files[" + i + "]: "+Lists[i].ToString());
            }
            for (int i = 0; i < Lists.Count; i++)
            {
                if (File.Exists(Lists[i].ToString()))
                {
                    _fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(Lists[i].ToString());
                    _fileExtension = System.IO.Path.GetExtension(Lists[i].ToString());
                    _fileDirectory = System.IO.Path.GetDirectoryName(Lists[i].ToString());

                }
                else
                {
                    Console.WriteLine("文件不存在...");
                    MessageHandling(StatusMessage.Unusual);
                    return;
                }
                Console.WriteLine("\n#####################################################################");
                Console.WriteLine("开始对文件:[--“" + Lists[i].ToString() + "”--]进行处理####");
                var inputChangImgPath = _fileDirectory + Data.sprit + Data.Image;
                string ChangImgPath = program.ChangImageSize(inputChangImgPath, Data.jpg);
                program.CroppingToScale(ChangImgPath, Program._imageSuffix,false);
                program.ChangeFilesName(_targetImagePath);
                program.CombineImages(_targetImagePath, _targetImagePath + Data.sprit + Data.Image +"_"+ _fileNameWithoutExtension, Program._imageSuffix);
                initialise();
            }

            System.Diagnostics.Process.Start(inputImgPath);//处理完成后打开相应的文件夹
            Console.WriteLine("\n" + "---输入回车键退出程序---");
            Console.ReadLine();

        }

        public static void initialise() {

            _fileNameWithoutExtension = null;
            _fileExtension = null;
            _fileDirectory = null;
            _targetImagePath = null;
            _imageSuffix = null;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="exception">排除文件名</param>
        /// <returns></returns>
        public static ArrayList FileSearch(string path, string[] exception)
        {
            if (!Directory.Exists(path))
            {
                Console.WriteLine("不存在文件...");
                return null;
            }

            int j = 0;
            ArrayList mItem = new ArrayList();
            DirectoryInfo search = new DirectoryInfo(path);
            FileSystemInfo[] fsinfos = search.GetFileSystemInfos();

            foreach (FileSystemInfo fsinfo in fsinfos)
            {
                if (!(fsinfo is DirectoryInfo))
                {
                    for (int i = 0; i < exception.Length; i++)
                    {
                        if (fsinfo.Name.Contains(exception[i]) == false)
                        {
                            mItem.Add(fsinfo.FullName);
                            j++;
                        }
                    }

                }
                else
                {
                    //这个用于检索当前文件夹下包含的所有子文件夹
                    //DirectoryInfo dtinfo = new DirectoryInfo(fsinfo.FullName);
                    //FileInfo[] f = dtinfo.GetFiles();
                    //foreach (FileInfo file in f)
                    //{
                    //    for (int i = 0; i < exception.Length; i++)
                    //    {
                    //        if (file.Name.Contains(exception[i]) == false)
                    //        {

                    //            mItem.Add(file.FullName);
                    //            j++;
                    //        }
                    //    }
                    //}

                }
            }

            return mItem;
        }

        /// <summary>
        /// 修正图片比例,更改为3:2比例
        /// </summary>
        /// <param name="destPath">修正后图片生成地址</param>
        /// <param name="imageSuffix">图片格式</param>
        /// <returns></returns>
        public string ChangImageSize(string destPath, string imageSuffix = Data.png)
        {
            var srcPath = _fileDirectory + Data.sprit + _fileNameWithoutExtension + _fileExtension;
            Program._imageSuffix = imageSuffix;
            try
            {
                Image inputImg = Image.FromFile(srcPath);
                Console.WriteLine("\n" + "修正图片尺寸");
                int imgWidth = inputImg.Width;
                int imgHeight = inputImg.Height;

                if (imgWidth < imgHeight)
                {
                    Console.WriteLine("当前图像“imgWidth < imgHeight”,旋转为水平方向");
                    int heightAfter = (int)Math.Ceiling(imgHeight * 1.00);
                    int widthAfter = (int)Math.Ceiling(((heightAfter * 2) / 3) * 1.00);
                    int OffsetWidth = Math.Abs((widthAfter - imgWidth) / 2);

                    Bitmap newBmp = new Bitmap(heightAfter, widthAfter, PixelFormat.Format24bppRgb);
                    Graphics newBmpGraphics = Graphics.FromImage(newBmp);
                    newBmpGraphics.Clear(SystemColors.AppWorkspace);

                    Rectangle rect = new Rectangle(0, 0, imgHeight, imgWidth);
                    Rectangle rectangle = new Rectangle(0, OffsetWidth, imgHeight, imgWidth);
                    rectangle.Inflate(0, OffsetWidth);
                    inputImg.RotateFlip(RotateFlipType.Rotate90FlipNone);//图片旋转,与画布Graphics无关
                    newBmpGraphics.DrawImage(inputImg, rectangle, rect, GraphicsUnit.Pixel);
                    newBmpGraphics.Save();

                    var ChangFinishImagePath = destPath + _fileNameWithoutExtension + imageSuffix;
                    BitMapSave(newBmp, ChangFinishImagePath);

                    inputImg.Dispose();
                    newBmp.Dispose();
                    newBmpGraphics.Dispose();

                    Console.WriteLine("修正成功,图片地址另存为: " + ChangFinishImagePath);
                    return ChangFinishImagePath;

                }else{

                    int widthAfter = (int)Math.Ceiling(imgWidth * 1.00);
                    int heightAfter = (int)Math.Ceiling(((widthAfter * 2) / 3) * 1.00);
                    int OffsetHeight = Math.Abs((heightAfter - imgHeight) / 2);

                    Bitmap newBmp = new Bitmap(widthAfter, heightAfter, PixelFormat.Format24bppRgb);
                    Graphics newBmpGraphics = Graphics.FromImage(newBmp);
                    newBmpGraphics.Clear(SystemColors.AppWorkspace);

                    Rectangle rect = new Rectangle(0, 0, imgWidth, imgHeight);
                    Rectangle rectangle = new Rectangle(0, OffsetHeight, imgWidth, imgHeight);
                    rectangle.Inflate(0, OffsetHeight);                   
                    newBmpGraphics.DrawImage(inputImg, rectangle, rect, GraphicsUnit.Pixel);
                    newBmpGraphics.Save();

                    var ChangFinishImagePath = destPath + _fileNameWithoutExtension + imageSuffix;
                    BitMapSave(newBmp, ChangFinishImagePath);

                    inputImg.Dispose();
                    newBmp.Dispose();
                    newBmpGraphics.Dispose();

                    Console.WriteLine("修正成功,图片地址为: " + ChangFinishImagePath);
                    return ChangFinishImagePath;
                }
            }
            catch (OutOfMemoryException e)
            {
                Console.WriteLine("该文件没有有效的图像格式", e);
                MessageHandling(StatusMessage.Unusual);
                return null;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                MessageHandling(StatusMessage.Unusual);
                return null;
            }

        }

        /// <summary>
        /// 按比例分割图片
        /// </summary>
        /// <param name="inputImgPath">导入地址</param>
        /// <param name="imageSuffix">图片格式</param>
        /// <param name="Bool">是否删除源文件</param>
        /// <returns></returns>
        public string CroppingToScale(string inputImgPath, string imageSuffix = Data.png, bool Bool = true)
        {

            if (!File.Exists(inputImgPath))
            {
                Console.WriteLine("修正后的图片找不到,文件不存在...");
                MessageHandling(StatusMessage.Unusual);
                return null;
            }
           
            // 装载要分隔的图片 
            Image inputImg = Image.FromFile(inputImgPath);

            int imgWidth = inputImg.Width;
            int imgHeight = inputImg.Height;
            int cropWidth = imgWidth / 3;
            int cropHeigth = imgHeight / 2;

            //---------------------------------------------------------------------- 
            ArrayList areaList = new ArrayList();

            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("<table cellpadding='0' cellspacing='0' border='[$border]'>");
            sb.Append(System.Environment.NewLine);

            int i = 0;
            int pointY = 0;
            for (int iHeight = 0; iHeight < 2; iHeight++)
            {
                int pointX = 0;
                sb.Append("<tr>");
                sb.Append(System.Environment.NewLine);
                for (int iWidth = 0; iWidth < 3; iWidth++)
                {
                    string fileName = string.Format("<img src='http://localhost/File/{0}_{1}{2}'  />", _fileNameWithoutExtension, i, imageSuffix);
                    sb.Append("<td>" + fileName + "</td>");
                    sb.Append(System.Environment.NewLine);
                    string s = string.Format("{0};{1};{2};{3}", pointX, pointY, cropWidth, cropHeigth);

                    Rectangle rect = new Rectangle(pointX, pointY, cropWidth, cropHeigth);
                    areaList.Add(rect);
                    pointX += cropWidth;
                    i++;
                }
                pointY += cropHeigth;
                sb.Append("</tr>");
                sb.Append(System.Environment.NewLine);
            }

            sb.Append("</table>");

            Console.WriteLine("\n" + "检测是否存在子文件夹...");

            string fileSonName = System.IO.Path.GetDirectoryName(inputImgPath) + Data.sprit + Data.Image + Data.sprit + _fileNameWithoutExtension;
            _targetImagePath = fileSonName;

            if (Directory.Exists(fileSonName) == false)
            {
                Console.WriteLine("文件夹不存在,创建中..");
                Directory.CreateDirectory(fileSonName);
            }
            else
            {
                Console.WriteLine("生成图片文件夹存在,清空已有数据..");
                DirectoryInfo dirInfo = new DirectoryInfo(fileSonName);
                FileInfo[] files = dirInfo.GetFiles();

                foreach (FileInfo file in files)
                {
                    file.Delete();
                    Console.WriteLine("删除数据的路径 : " + file.DirectoryName + Data.sprit + file.Name);
                }
                Console.WriteLine("删除完毕!!!");
            }
            Console.WriteLine("\n" + "开始切割图片...");

            for (int iLoop = 0; iLoop < areaList.Count; iLoop++)
            {
                Rectangle rect = (Rectangle)areaList[iLoop];
                string fileName = fileSonName + Data.sprit + iLoop.ToString() + imageSuffix;

                Bitmap newBmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format24bppRgb);
                Graphics newBmpGraphics = Graphics.FromImage(newBmp);
                Rectangle rectangle = new Rectangle(0, 0, rect.Width, rect.Height);
                newBmpGraphics.DrawImage(inputImg, rectangle, rect, GraphicsUnit.Pixel);

                newBmpGraphics.Save();
                BitMapSave(newBmp, fileName);

                Console.WriteLine("图片生成路径: " + fileName);
                newBmp.Dispose();
                newBmpGraphics.Dispose();
            }

            inputImg.Dispose();

            if (Bool)
            {
                File.Delete(inputImgPath);
                Console.WriteLine("\n" + "修正图已被删除(***默认处理***)...,路径: " + inputImgPath);
            }

            string html = sb.ToString();
            Console.WriteLine("\n" + "Html(表): " + "\n" + html + "\n");
            return html;
        }

        /// <summary>
        /// 修改分割文件名字
        /// </summary>
        /// <param name="folderPath"></param>
        public void ChangeFilesName(string folderPath)
        {
            if (!Directory.Exists(folderPath)) {
                MessageHandling(StatusMessage.Unusual);
                return;
            }
            var files = new DirectoryInfo(folderPath).GetFiles();
            Console.WriteLine("进行图片名字批处理..." + "\n" + "读取到的总数: " + files.Length);

            if (files.Length == 0)
            {
                Console.WriteLine("未读取到文件");
                MessageHandling(StatusMessage.Unusual);
                return;
            }
                Console.WriteLine("开始修改... " + "\n\n" + "修改后名字: ");
                int i = 0;
                //文件名字处理在此修改
                foreach (FileInfo file in files)
                {
                    //string move_test = file.DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(file.Name.Remove(file.Name.IndexOf("."))));
                    //file.MoveTo(move_test + Data.png);

                    string move = file.DirectoryName + Data.sprit + "New_image_" + file.Name;
                    file.MoveTo(move);
                    Console.WriteLine("files[" + i + "]: " + move);

                    i++;
                }
                //int i = 0;
                //while (i == files.Length)
                //{
                //    switch (i)
                //    {
                //        case 0:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));                            
                //            break;
                //        case 1:                            
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 2:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 3:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 4:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 5:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //    }
                //    Console.WriteLine("Newfile: " + files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //    i++;
                //}
            

        }

        /// <summary>
        /// 缝合图片,根据名字顺序
        /// </summary>
        /// <param name="folderPath">导入地址</param>
        /// <param name="toPath">导出图片地址</param>
        /// <param name="imageSuffix">图片格式</param>
        private void CombineImages(string folderPath, string toPath, string imageSuffix = Data.png)
        {
            if (!Directory.Exists(folderPath))
            {
                MessageHandling(StatusMessage.Unusual);
                return;
            }
            //var files = new DirectoryInfo(folderPath).GetFiles("*" + Data.png, SearchOption.TopDirectoryOnly);//目前检索到的文件只有图片,干脆全部获取
            var files = new DirectoryInfo(folderPath).GetFiles();
            if (files.Length == 0)
            {
                Console.WriteLine("文件不存在...");
                MessageHandling(StatusMessage.Unusual);
            }
            Console.WriteLine("\n" + "进行图片缝合..." + "\n" + "处理中...Biubiubiu...");

            var imgs = files.Select<FileInfo, Image>(f => Image.FromFile(f.FullName));
            var finalWidth = imgs.Max<Image>(img => img.Width * 3);
            var finalHeight = imgs.Max<Image>(img => img.Height * 2);

            var finalImg = new Bitmap(finalWidth, finalHeight);
            Graphics g = Graphics.FromImage(finalImg);
            g.Clear(SystemColors.AppWorkspace);

            var width = 0;
            var height = 0;
            for (int i = 0; i < files.Length; i++)
            {

                Image img = Image.FromFile(files[i].FullName);
                g.DrawImage(img, width, height);
                width += img.Width;

                bool res = (i == 2) ? true : false;

                if (res)
                {
                    width = 0;
                    height += img.Height;
                }

                img.Dispose();
            }

            var finalImage = toPath + imageSuffix;
            BitMapSave(finalImg, finalImage);

            finalImg.Dispose();
            g.Dispose();

            Console.WriteLine("文件已保存,地址: " + finalImage);
            Console.WriteLine("文件:[--" + _fileNameWithoutExtension + _fileExtension + "--]处理完毕!!!!");

        }

        /// <summary>
        /// 保存BitMap
        /// </summary>
        /// <param name="bmp"></param>
        /// <param name="path">保存路径</param>
        /// <param name="imageSuffix">文件后缀</param>
        public static void BitMapSave(Bitmap bmp, string path)
        {

            switch (_imageSuffix.ToLower())
            {

                case ".bmg":
                    bmp.Save(path, ImageFormat.Bmp);
                    break;
                case ".png":
                    bmp.Save(path, ImageFormat.Png);
                    break;
                case ".jpg":
                case ".jpeg":
                    bmp.Save(path, ImageFormat.Jpeg);
                    break;
                case "gif":
                    bmp.Save(path, ImageFormat.Tiff);
                    break;
            }

        }

    }
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页

打赏

Le_Sam

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值