4.5 实验指导——在窗体页绘制并输出图像数据
本章重点介绍Page、Response、Request和Server 4个对象,作为ASP.NET基本对象之一的Response对象不仅可以通过Write()方法直接在页面上输出字符串数据,还可以用BinaryWrite()方法直接显示二进制表示的数据,如图像和图片等。
本节利用Response对象在Web窗体页中绘制并输出图像数据。实现步骤如下。
(1)在当前的解决方案资源管理器中创建OutputImage.aspx窗体页面。
(2)在OutputImage.aspx.cs页面后台的Load事件中添加代码,首先设置ContentType属性,将其指定为“image/jpeg”,以便将整个页面呈现为一幅JPEG图像。然后调用Clear()方法,以确保不会将无关的内容(包括标头)与此响应一同发送。代码如下。
protected void Page_Load(object sender, EventArgs e) { Response.ContentType = "image/jpeg"; Response.Clear(); /* 其他代码 */ }
(3)继续在Load事件中添加代码,将BufferOutput属性的值设置为true,对响应做出缓冲以便处理完成后发送页面,代码如下。
Response.BufferOutput = true;
(4)创建Font类的实例对象,通过Font创建字体风格,代码如下。
Font rectangleFont = new Font( "Arial", 10, FontStyle.Bold);
(5)声明int类型的变量height和width,将height变量的值设置为300, width变量的值设置为500。
(6)通过Random类创建一个随机数字生成器,并基于该生成器获取随机数的变量x、a和x1,代码如下。
Random r = new Random(); int x = r.Next(150); int a = r.Next(255); int x1 = r.Next(200);
(7)通过Bitmap类创建一张位图,并且使用位图对象创建一个Graphics对象,代码如下。
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(bmp); g.SmoothingMode = SmoothingMode.AntiAlias; g.Clear(Color.LightGray);
(8)使用步骤(7)创建的Graphics对象绘制三个矩形,代码如下。
g.DrawRectangle(Pens.Yellow, 1, 1, width -3, height -3); g.DrawRectangle(Pens.Blue, 2, 2, width -3, height -3); g.DrawRectangle(Pens.Black, 0, 0, width, height);
(9)通过Graphics对象输出一个字符串数据,数据内容是“这是ASP.NET例子”,代码如下。
g.DrawString("这是ASP.NET例子", rectangleFont, SystemBrushes.WindowText, new PointF(200, 130));
(10)通过Graphics对象的FillRectangle()方法填充矩形,代码如下。
g.FillRectangle(new SolidBrush(Color.FromArgb(a, 255, 128, 255)), x, 20, 100, 150); g.FillRectangle(new LinearGradientBrush(new Point(x, 130), new Point(x1 + 75, 50 + 30), Color.FromArgb(128, 0, 0, 128), Color.FromArgb(255, 255, 255, 240)), x1, 150, 125, 50);
FillRectangle()方法填充由一对坐标、一个宽度和一个高度指定的矩形的内部,基本语法如下:
public void FillRectangle(Brush brush, int x, int y, int width, int height);
其中,brush确定填充的矩形框内的背景色;x和y分别表示矩形的左上角顶点位置的x坐标和y坐标;width和height表示要填充的矩形的宽度和高度。
(11)调用位图对象的Save()方法把位图保存到响应流中并且把它转换成JPEG格式,代码如下。
bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
(12)调用Dispose()方法释放掉Graphics和位图使用的内存空间,代码如下。
g.Dispose(); //释放掉Graphics所使用的内存空间 bmp.Dispose(); //释放掉位图所使用的内存空间
(13)调用Response对象的Flush()方法把输出结果发送到客户端,代码如下。
Response.Flush(); //把输出结果发送到客户端
(14)运行OutputImage.aspx窗体页查看效果,由于FillRectangle()方法填充矩形时的坐标和透明度都是随机产生的,因此,运行页面时可能会看到不同的效果。如图4-19~图4-22所示分别为Chrome浏览器、Firefox浏览器、Opera浏览器和IE浏览器的初始运行效果。
图4-19 Chrome浏览器
图4-20 Firefox浏览器
图4-21 Opera浏览器
图4-22 IE浏览器