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 对象的指定部分。
图片分隔说明:就是把一张大图,按指定的宽度和高度分隔成一组小图
![]() |
| 图1 |
对初学者的提示:在我们读书时学过的数学坐标如图2所示,在GDI+里的坐标如图3所示
![]() | ![]() |
| 图2 | 图3 |
3. 实现代码
1
public 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
}
public class CropImageManipulator2

{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
}

