c#使用ImageProcessor 对图片进行切片

在日常工作中经常会出现图片过大,导致不能打印的情况,在这里会介绍将一张大图切割为若干小图的方法。

  首先操作图片使用的是ImageProcessor.dll。(下载方法,程序包管理控制台输入“Install-Package ImageProcessor”)

  然后开始直接上代码

 1      /// <summary>
 2         /// 切片
 3         /// </summary>
 4         /// <param name="imagePath">图片路径</param>
 5         /// <param name="silceUpWidth">切片宽</param>
 6         /// <param name="silceUpHeight">切片高</param>
 7         public static void SliceUp(string imagePath, int silceUpWidth, int silceUpHeight)
 8         {
 9             Image orginalImage = Image.FromFile(imagePath);
10             //计算x方向上的切片份数,如果原图宽度100 ,切片宽度30,则切片在x方向上的份数为4
11             int widthCount = (int)Math.Ceiling((orginalImage.Width * 1.0) / (silceUpWidth * 1.0));
12             //计算y方向上的切片份数,如果原图宽度100 ,切片宽度30,则切片在x方向上的份数为4
13             int heightCount = (int)Math.Ceiling((orginalImage.Height * 1.0) / (silceUpHeight * 1.0));
14             for (int i = 0; i < heightCount; i++)
15             {
16                 //设置最终切割的高度
17                 int recHeight = 0;
18                 //判断图片高度是否满足本次切片的高度
19                 if (orginalImage.Height - silceUpHeight * i > silceUpHeight)
20                 {
21                     recHeight = silceUpHeight;
22                 }
23                 else
24                 {
25                     recHeight = orginalImage.Height - silceUpHeight * i;
26                 }
27                 for (int j = 0; j < widthCount; j++)
28                 {
29                     //设置最终切割的宽度
30                     int recWidth = 0;
31                     //判断图片高度是否满足本次切片的宽度
32                     if (orginalImage.Width - silceUpWidth * i > silceUpWidth)
33                     {
34                         recWidth = silceUpWidth;
35                     }
36                     else
37                     {
38                         recWidth = orginalImage.Width - silceUpWidth * i;
39                     }
40                     //保留exif元数据,初始化ImageFactory
41                     using (ImageFactory imageFactory = new ImageFactory(true))
42                     {
43                         //创建截取图片的大小
44                         Rectangle rectangle = new Rectangle
45                             (j * silceUpWidth
46                             , i * silceUpHeight
47                             , recWidth, recHeight
48                             );
49                         string savePath = "D:\\" + Guid.NewGuid().ToString() + ".jpg";
50                         //切割图片
51                         imageFactory.Load(orginalImage)
52                             .Crop(rectangle)
53                             .Save(savePath);
54                     }
55                 }
56             }
57         }

  上面的代码为直接将图片保存到本地,也可以将切割后的图片保存为流,代码如下:

               //也可以保存为输出流
                        using (MemoryStream outStream=new MemoryStream())
                        {
                            imageFactory.Load(orginalImage)
                            .Crop(rectangle)
                            .Save(outStream);
                        }
                        //对图片的流进行操作
                        //...

 

posted @ 2017-11-02 11:55  Yu2  阅读(2133)  评论(0编辑  收藏  举报