zoukankan      html  css  js  c++  java
  • 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);
                            }
                            //对图片的流进行操作
                            //...
  • 相关阅读:
    LaTeX下的表格处理
    accumulate函数用法的坑
    将博客搬至CSDN
    linux; 文件名乱码;问价名出现问号
    vim打开多窗口、多文件之间的切换
    关于ssh-server
    更改Ubuntu gcc、g++默认编译器版本
    Elasticsearch nest实现类似Contains和Like功能
    Redis大幅性能提升之Batch批量读写
    Ext.NET 4.1 系统框架的搭建(后台) 附源码
  • 原文地址:https://www.cnblogs.com/Yuuuuu/p/7771529.html
Copyright © 2011-2022 走看看