-
C#教程之C#实现图片分割方法与代码
1. 概述
有时候我们需要在web页面上显示一张图,比如说一张地图,而这张地图会比较大。这时候如果我们把一张大图分隔成一组小图,那么客户端的显示速度会明显地感觉块。希望阅读本文对你有所帮助。
2. 实现思路
.NET Framework GDI+ 为我们提供了一组丰富地类来编辑图形图像。有关.NET Framework GDI+的详细资料请查阅msdn相关文档。这里只简要叙述本程序要用的的几个类。
System.Drawing.Image.LoadFile 方法可以从指定的文件创建 Image 对象。System.Drawing.Image.Save方法可以将此 Image 对象保存到指定文件。 System.Drawing.Image.Width和System.Drawing.Image.Height属性可以得到图片的宽度和高度。
System.Drawing.Graphics类可以编辑图像。System.Drawing.Graphics.DrawImage方法在指定位置并且按指定大小绘制指定的 Image 对象的指定部分。
图片分隔说明:就是把一张大图,按指定的宽度和高度分隔成一组小块
对初学者的提示:在我们读书时学过的数学坐标如图2所示,在GDI+里的坐标如图3所示
3. 实现代码
1public class CropImageManipulator
2 {
3 public CropImageManipulator()
4 {
5
6 }
7
8 // 不含扩展名的文件名
9 private string _fileNameWithoutExtension;
10 // 文件扩展名
11 private string _fileExtension;
12 // 文件所属的文件夹
13 private string _fileDirectory;
14 public string Cropping(string inputImgPath, int cropWidth, int cropHeight)
15 {
16 this._fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(inputImgPath);
17 this._fileExtension = System.IO.Path.GetExtension(inputImgPath);
18 this._fileDirectory = System.IO.Path.GetDirectoryName(inputImgPath);
19
20 // 装载要分隔的图片
21 Image inputImg = Image.FromFile(inputImgPath);
22 int imgWidth = inputImg.Width;
23 int imgHeight = inputImg.Height;
24
25 // 计算要分几格
26 int widthCount = (int)Math.Ceiling((imgWidth * 1.00) / (cropWidth * 1.00));
27 int heightCount = (int)Math.Ceiling((imgHeight * 1.00) / (cropHeight * 1.00));
28 //----------------------------------------------------------------------
29 ArrayList areaList = new ArrayList();
30
31 System.Text.StringBuilder sb = new System.Text.StringBuilder();
32 sb.Append("<table cellpadding='0' cellspacing='0' border='[$border]'>");
33 sb.Append(System.Environment.NewLine);
34
35 int i = 0;
36 for (int iHeight = 0; iHeight < heightCount ; iHeight ++)
37 {
38 sb.Append("<tr>");
39 sb.Append(System.Environment.NewLine);
40 for (int iWidth = 0; iWidth < widthCount ; iWidth ++)
41 {
42 //string fileName = "<img src='http://localhost/SRcommBeijingFile/" + this._fileNameWithoutExtension + " _" + i.ToString() + this._fileExtension + "'>";
43 string fileName = string.Format("<img src='http://localhost/SRcommBeijingFile/{0}_{1}{2}' />",this._fileNameWithoutExtension,i,this._fileExtension);
44 sb.Append("<td>" + fileName + "</td>");
45 sb.Append(System.Environment.NewLine);
46
47
48 int pointX = iWidth * cropWidth;
49 int pointY = iHeight * cropHeight;
50 int areaWidth = ((pointX + cropWidth) > imgWidth) ? (imgWidth - pointX) : cropWidth;
51 int areaHeight = ((pointY + cropHeight) > imgHeight) ? (imgHeight - pointY) : cropHeight;
52 string s = string.Format("{0};{1};{2};{3}",pointX,pointY,areaWidth,areaHeight);
53
54 Rectangle rect = new Rectangle(pointX,pointY,areaWidth,areaHeight);
55 areaList.Add(rect);
56 i ++;
57 }
58 sb.Append("</tr>");
59 sb.Append(System.Environment.NewLine);
60 }
61
62 sb.Append("</table>");
63
64
65 //----------------------------------------------------------------------
66
67 for (int iLoop = 0 ; iLoop < areaList.Count ; iLoop ++)
68 {
69 Rectangle rect = (Rectangle)areaList[iLoop];
70 string fileName = this._fileDirectory + "\\" + this._fileNameWithoutExtension + "_" + iLoop.ToString() + this._fileExtension;
71 Bitmap newBmp = new Bitmap(rect.Width,rect.Height,PixelFormat.Format24bppRgb);
72 Graphics newBmpGraphics = Graphics.FromImage(newBmp);
73 newBmpGraphics.DrawImage(inputImg,new Rectangle(0,0,rect.Width,rect.Height),rect,GraphicsUnit.Pixel);
74 newBmpGraphics.Save();
75 switch (this._fileExtension.ToLower())
76 {
77 case ".jpg":
78 case ".jpeg":
79 newBmp.Save(fileName,ImageFormat.Jpeg);
80 break;
81 case "gif":
82 newBmp.Save(fileName,ImageFormat.Gif);
83 break;
84 }
85
86 }
87 inputImg.Dispose();
88 string html = sb.ToString();
89 return html;
90 }
91
92 }
有时候我们需要在web页面上显示一张图,比如说一张地图,而这张地图会比较大。这时候如果我们把一张大图分隔成一组小图,那么客户端的显示速度会明显地感觉块。希望阅读本文对你有所帮助。
2. 实现思路
.NET Framework GDI+ 为我们提供了一组丰富地类来编辑图形图像。有关.NET Framework GDI+的详细资料请查阅msdn相关文档。这里只简要叙述本程序要用的的几个类。
System.Drawing.Image.LoadFile 方法可以从指定的文件创建 Image 对象。System.Drawing.Image.Save方法可以将此 Image 对象保存到指定文件。 System.Drawing.Image.Width和System.Drawing.Image.Height属性可以得到图片的宽度和高度。
System.Drawing.Graphics类可以编辑图像。System.Drawing.Graphics.DrawImage方法在指定位置并且按指定大小绘制指定的 Image 对象的指定部分。
图片分隔说明:就是把一张大图,按指定的宽度和高度分隔成一组小块
对初学者的提示:在我们读书时学过的数学坐标如图2所示,在GDI+里的坐标如图3所示
3. 实现代码
1public class CropImageManipulator
2 {
3 public CropImageManipulator()
4 {
5
6 }
7
8 // 不含扩展名的文件名
9 private string _fileNameWithoutExtension;
10 // 文件扩展名
11 private string _fileExtension;
12 // 文件所属的文件夹
13 private string _fileDirectory;
14 public string Cropping(string inputImgPath, int cropWidth, int cropHeight)
15 {
16 this._fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(inputImgPath);
17 this._fileExtension = System.IO.Path.GetExtension(inputImgPath);
18 this._fileDirectory = System.IO.Path.GetDirectoryName(inputImgPath);
19
20 // 装载要分隔的图片
21 Image inputImg = Image.FromFile(inputImgPath);
22 int imgWidth = inputImg.Width;
23 int imgHeight = inputImg.Height;
24
25 // 计算要分几格
26 int widthCount = (int)Math.Ceiling((imgWidth * 1.00) / (cropWidth * 1.00));
27 int heightCount = (int)Math.Ceiling((imgHeight * 1.00) / (cropHeight * 1.00));
28 //----------------------------------------------------------------------
29 ArrayList areaList = new ArrayList();
30
31 System.Text.StringBuilder sb = new System.Text.StringBuilder();
32 sb.Append("<table cellpadding='0' cellspacing='0' border='[$border]'>");
33 sb.Append(System.Environment.NewLine);
34
35 int i = 0;
36 for (int iHeight = 0; iHeight < heightCount ; iHeight ++)
37 {
38 sb.Append("<tr>");
39 sb.Append(System.Environment.NewLine);
40 for (int iWidth = 0; iWidth < widthCount ; iWidth ++)
41 {
42 //string fileName = "<img src='http://localhost/SRcommBeijingFile/" + this._fileNameWithoutExtension + " _" + i.ToString() + this._fileExtension + "'>";
43 string fileName = string.Format("<img src='http://localhost/SRcommBeijingFile/{0}_{1}{2}' />",this._fileNameWithoutExtension,i,this._fileExtension);
44 sb.Append("<td>" + fileName + "</td>");
45 sb.Append(System.Environment.NewLine);
46
47
48 int pointX = iWidth * cropWidth;
49 int pointY = iHeight * cropHeight;
50 int areaWidth = ((pointX + cropWidth) > imgWidth) ? (imgWidth - pointX) : cropWidth;
51 int areaHeight = ((pointY + cropHeight) > imgHeight) ? (imgHeight - pointY) : cropHeight;
52 string s = string.Format("{0};{1};{2};{3}",pointX,pointY,areaWidth,areaHeight);
53
54 Rectangle rect = new Rectangle(pointX,pointY,areaWidth,areaHeight);
55 areaList.Add(rect);
56 i ++;
57 }
58 sb.Append("</tr>");
59 sb.Append(System.Environment.NewLine);
60 }
61
62 sb.Append("</table>");
63
64
65 //----------------------------------------------------------------------
66
67 for (int iLoop = 0 ; iLoop < areaList.Count ; iLoop ++)
68 {
69 Rectangle rect = (Rectangle)areaList[iLoop];
70 string fileName = this._fileDirectory + "\\" + this._fileNameWithoutExtension + "_" + iLoop.ToString() + this._fileExtension;
71 Bitmap newBmp = new Bitmap(rect.Width,rect.Height,PixelFormat.Format24bppRgb);
72 Graphics newBmpGraphics = Graphics.FromImage(newBmp);
73 newBmpGraphics.DrawImage(inputImg,new Rectangle(0,0,rect.Width,rect.Height),rect,GraphicsUnit.Pixel);
74 newBmpGraphics.Save();
75 switch (this._fileExtension.ToLower())
76 {
77 case ".jpg":
78 case ".jpeg":
79 newBmp.Save(fileName,ImageFormat.Jpeg);
80 break;
81 case "gif":
82 newBmp.Save(fileName,ImageFormat.Gif);
83 break;
84 }
85
86 }
87 inputImg.Dispose();
88 string html = sb.ToString();
89 return html;
90 }
91
92 }
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式