C#实现图片分割方法与代码
程序员文章站
2023-10-30 15:36:10
1. 概述 有时候我们需要在web页面上显示一张图,比如说一张地图,而这张地图会比较大。这时候如果我们把一张大图分隔成一组小图,那么客户端的显示速度会明显地感觉块...
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 }