在日常工作中經常會出現圖片過大,導致不能打印的情況,在這里會介紹將一張大圖切割為若干小圖的方法。
首先操作圖片使用的是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); } //對圖片的流進行操作 //...