在日常工作中经常会出现图片过大,导致不能打印的情况,在这里会介绍将一张大图切割为若干小图的方法。
首先操作图片使用的是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); } //对图片的流进行操作 //...