当前位置: 首页 > 编程日记 > 正文

在ASP.NET中随意创建图形信息

如果没有一个外部组件的支持,在ASP中是不能动态创建图形的,不管它是一个图表,一个横幅或仅仅是一个图形计数器。可喜的是,这一点在ASP.NET中改变了。现在,我们只需要使用内置功能,就能够很容易动态创建图形,并向客户端发送具有最佳配置的图形。  
用命令行程序创建图形  
在讨论一大堆ASP.NET代码之前,我们先执行一个简单的命令行程序做一个测试,然后使用这些源代码作为 ASP.NET 脚本的基础。实际上,两者的区别在于:命令行程序将图形保存在一个文件中,而ASP.NET 脚本将图形直接发送到客户端。  
举例的程序做什么呢?按照惯例,我们从众所周知的"Hello World" 程序开始,把这个文本信息输出到一个图形文件中,这个图形的大小要与当前选中的 "Hello World" 文本的字体和字号完全相同。  
下面的脚本pagecounter.cs是一个典型的简单命令行程序:如果忽略包围在其周围的必须的类代码,就只剩下程序运行时要调用的主函数了,这也正是生成图形的代码所在处:  
using System;  
using System.IO;  
using System.Drawing;  
using System.Drawing.Imaging;  
   
public class CTestBitmapFunctionality  
{  
public static void Main()  
{  
Bitmap newBitmap = null;  
Graphics g = null ;  
   
try  
{  
Font fontCounter = new Font("Lucida Sans Unicode", 12);  
   
// calculate size of the string.  
newBitmap = new Bitmap(1,1,PixelFormat.Format32bppARGB);  
g = Graphics.FromImage(newBitmap);  
SizeF stringSize = g.MeasureString("Hello World", fontCounter);  
int nWidth = (int)stringSize.Width;  
int nHeight = (int)stringSize.Height;  
g.Dispose();  
newBitmap.Dispose();  
   
newBitmap = new Bitmap(nWidth,nHeight,PixelFormat.Format32bppARGB);  
g = Graphics.FromImage(newBitmap);  
g.FillRectangle(new SolidBrush(Color.White),  
new Rectangle(0,0,nWidth,nHeight));  
   
g.DrawString("Hello World", fontCounter,  
new SolidBrush(Color.Black), 0, 0);  
   
newBitmap.Save("c://test.png", ImageFormat.PNG);  
}  
catch (Exception e)  
{  
Console.WriteLine(e.ToString());  
}  
finally  
{  
if (null != g) g.Dispose();  
if (null != newBitmap) newBitmap.Dispose();  
}  
}  
}  
在任何情况下,执行上面代码后,就会生成下面的图形test.png,它将存放在C驱动器上:  
 
我们来仔细研究一下源代码,看看这个图形是如何创建的。关键一点是生成的图形必须与文本 "Hello World" 的字体和字号相同。因此,首先要计算文本的尺寸,为此我们使用了一个尺寸为1 x 1的虚拟图形。计算结束之后,再废弃这个虚拟图形并生成一个适当尺寸的图形。  
源代码中有一点很有趣,这就是 Graphics 对象。要创建一个位图时,用这个对象做什么呢?奥妙在于:这是可以向其中绘图的上下文环境。我们可以在屏幕上、打印机上和内存中使用一个图形上下文环境,准确地说就是一个位图。图形的上下文环境使我们能够在任何设备上进行绘图操作,甚至是在虚拟设备上。  
接着,用DrawString将文本 "Hello World"按照规格输出到一个白色背景的矩形(用 FillRectangle创建的)中。图形完成后,将其保存在磁盘上。凡是亲自研究过图形文件格式的人都知道这有多困难,但是使用 GDI+ (图形设备接口)就不那么困难了,这只需要下面的简单命令就可以:  
newBitmap.Save("c://test.png", ImageFormat.PNG);  
如果用ImageFormat.JPEG替换ImageFormat.PNG,就可以得到一个 jpeg文件。这正是我们所期待的操作图形的最简单用法。  
例外处理代码也很有必要,因为有些函数会造成例外,比如没有足够的内存用来创建位图。而且,不要忘记释放图形和位图,这是编程的良好习惯,有始有终吗!最后,程序结束。  
好了,现在请使用下面的命令将源代码进行编译,生成EXE文件pagecounter.exe,然后在安装了Microsoft .NET框架的系统上测试运行:  
csc /R:System.DLL /R:System.Drawing.DLL pagecounter.cs  
在Web服务器上创建ASP.NET程序  
上面的代码作为一个命令行应用程序已经足够了,但是要编写相应的 ASP.NET 脚本,就必须再添加几个功能:  
●可选择的文本(如一个计数器)  
●可选择的文本颜色  
●可选择的背景颜色  
●可选择的字体  
●可选择的字号  
如果你认为这些太难做到了,那么就请先看看相关的ASP.NET 脚本源代码pagecounter.aspx。要提醒的是:增加任意数量的错误处理代码以查看所传递参数的有效性,这是所必须做的修改中最大的一部分。  
另一个需要修改的地方是将图形发送给客户端而不是将它写入一个文件中。这个新部分的代码是这样的:  
MemoryStream tempStream = new MemoryStream();  
newBitmap.Save(tempStream,ImageFormat.PNG);  
   
Response.ClearContent();  
Response.ContentType = "image/png";  
Response.BinaryWrite(tempStream.ToArray());  
Response.End();  
这里只是将图形"缓存"到内存中,然后将其作为一个字节数组传递给BinaryWrite函数。  
仔细研究了源代码的人会注意到这里将所有可选择参数都作为查询字符串进行了传递,这可能会成为一个很长的尾巴

相关文章:

做动态图表没有数据?用Python就能获取

来源 | 法纳斯特(ID:walker398)刷爆全网的动态条形图,原来 5 行 Python 代码就能实现!这是小F在国庆之前写的一篇文章,既然有了Python这个制作动态条形图工具,缺的那便是数据了。先看一下B站2019年「数据可…

CCTouchDispatcher sharedDispatcher 方法过期

//[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:selfpriority:0swallowsTouches:YES];转载于:https://www.cnblogs.com/sell/archive/2013/01/14/2…

哪些听起来像段子一样的故事?

杭州海底世界,一个小走廊两边都是各种爬行动物展览。有两只蜥蜴当时是这个样子人还年轻,还比较猥琐,看到一个趴在另一个身上就觉得在做什么羞羞的事。于是就拍下来,发到群里,然后说了句交配中。然后一天就光拍照&#…

立足高校矢志创新,鲲鹏计算生态长沙在行动

在今年,虽然全球经济发展受到疫情和国际形势变化影响增速减缓,但我国在AI、云计算、大数据、5G等前沿技术方面的发展却依然没有停下脚步。发展前沿技术,计算产业是基础。因此,培养计算产业人才成为当前全社会共同面对的一大关键。…

用好ASP.NET 2.0的URL映射

简介:   URL映射是ASP.NET 2.0中提供的新特性。URL映射技术帮助我们将一个特定URL映射为另一个URL。为了帮助理解,我们假设你在站点有一个叫Homepage.aspx的页面来访问主页,所有的用户也都用这个页面来访问你的主页。但由于某些原因&#x…

N皇后问题的位运算求解——目前最快的方法

核心代码如下: 1 void test(int row, int ld, int rd) 2 { 3 int pos, p; 4 if ( row ! upperlim ) 5 { 6 pos upperlim & (~(row | ld | rd )); 7 while ( pos ) 8 { 9 p pos & (~pos 1); 1…

cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)

记录一下,好开心,感觉今天自己又学到东西了,对于屏幕双击事件本来还毫无头绪的,今天得以解决总算没白费加班,其实原理很简单;就是在点击事件里做一个判断,这个判断就是需要获取当前系统的时间的…

怎么样给下拉框加载背景色

选择自 PPLUNCLE 的 Blog 部分代码:------aspx页面&#xff1a; <tr> <td><select id“job“ name“job“ runat“server“></td></tr>说明&#xff1a;下拉框必须写成上面的形式&#xff0c;用<asp:dropdownlist....>不能实现------cs页…

Windows 7 部署(一):安装和部署简述

术语表&#xff1a; 英文缩写英文全称中文全称备注 MDT Microsoft Deployment Toolkit 微软部署工具包 免费&#xff0c;需要域环境及DHCP服务器(Port 66 and 67)&#xff0c;需要首先安装WAIK。使用MDT部署Windows 7时&#xff0c;也需要WDS&#xff0c;WDS主要负责推送WinP…

希捷发布CORTX对象存储软件与开源社区,普惠超大规模数据存储

数据存储和管理解决方案提供商希捷科技今日&#xff08;10月29日&#xff09;举行了“Let’s Rethink Data”希捷科技Datasphere线上峰会。在本次峰会&#xff0c;希捷科技携手行业专家与生态合作伙伴洞见数据产业趋势&#xff0c;并发布了对象存储软件CORTXTM以及CORTXTM开源社…

最优化:拉格朗日乘子法

作者&#xff1a;桂。 时间&#xff1a;2017-03-27 20:26:17 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/6628785.html 声明&#xff1a;欢迎被转载&#xff0c;不过记得注明出处哦~ 【读书笔记06】 前言 看到西蒙.赫金的《自适应滤波器原理》第四版第四章&#xf…

在Asp.Net中从sqlserver检索(retrieve)图片

介绍&#xff1a;这篇文章是我写的"如何把图片存入sqlServer中"的后续。我建议你在读这篇文章之前先看看那篇。和存储图片相比&#xff0c;读取图片就要简单多了。输出一副图片我们要做的就是使用Response对象的BinaryWrite方法。同时设置图片的格式。在这篇文章中&a…

华为鲲鹏产业生态加速算力升级,企业数字化转型在山西吹响号角

2020年&#xff0c;新基建风口已至&#xff0c;建设数字基础设施&#xff0c;打造数字产业生态是其关键与核心&#xff0c;而算力底座将成为其重要的运行支撑。数字化浪潮大背景下&#xff0c;鲲鹏计算产业生态&#xff0c;充满巨大的想象与发展空间。从企业数字化转型角度来看…

隐藏TabBar

在项目中经常遇到隐藏tabBar,实力很多种方法&#xff0c;可以解决不同情况下问题1&#xff1a;//隐藏tabBar WebViewController *webVc [[WebViewController alloc] init]; webVc.hidesBottomBarWhenPushed YES; [self.navigationController pushViewController:web…

Linux下安装JDK和Eclipse

安装Eclipse时前需要确保系统中已经具备Java运行环境&#xff0c;本文以干净系统初次安装Eclipse为例&#xff0c;同时安装JDK和Eclipse. 1.下载JDK压缩包&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html  假设保存位置为&#xff1a;/hom…

如何在ASP.Net 中把图片存入数据库

介绍 可能有很多的时候&#xff0c;我们急需把图片存入到数据库当中。在一些应用程序中&#xff0c;我们可能有一些敏感的资料&#xff0c;由于存储在文件系统&#xff08;file system&#xff09;中的东西&#xff0c;将很容易被某些用户盗取&#xff0c;所以这些数据不能存…

人类偏好的“可塑性”,从博弈说起

作者 | 斯图尔特罗素来源 | 《AI新生》出品 | AI科技大本营经济学家通过为人类受试者提供选择来套取他们的偏好。该技术广泛应用于产品设计、营销和交互式电子商务系统中。例如&#xff0c;汽车设计师向受测试者提供具有不同油漆颜色、座位安排、后备厢大小、电池容量、杯架等选…

基于python的一个运维自动化的项目(进度更新)【已开源】

文章已经转到 http://xiaorui.cc 个人博客里&#xff0c;欢迎浏览 !!!交流Python & Golang 可以加群 278517979 .

关于Android方法数量限制的问题

限制Android方法数量的原因是&#xff1a; Android应用以DEX文件的形式存储字节码文件&#xff0c;在Dalvik字节码规范里&#xff0c;方法引用索引method referenceindex只有16位,即65536个。 Op & Format Mnemonic / Syntax Arguments 6e..72 35c invoke-kind {vC, vD…

asp.net中显示DataGrid控件列序号的几种方法

在aps.net中多数据绑定的控件很多&#xff0c;论功能来说&#xff0c;应该属DataGrid最为齐全&#xff0c;但它没有提供现成的显示记录序号的功能&#xff0c;不过我们可以通过它所带的一些参数来间接得到序号&#xff0c;下面来看看怎样得到和显示序号值计算方式如下&#xff…

一口气看完45个寄存器,CPU核心技术大揭秘

作者 | 轩辕之风O来源 | 编程技术宇宙头图 | CSDN下载自视觉中国自1946年冯诺伊曼领导下诞生的世界上第一台通用电子计算机ENIAC至今&#xff0c;计算机技术已经发展了七十多载。从当初专用于数学计算的庞然大物&#xff0c;到后来大型机服务器时代&#xff0c;从个人微机技术蓬…

用友公司Java面试题(含答案)

为什么80%的码农都做不了架构师&#xff1f;>>> 用友公司Java面试题&#xff08;含答案&#xff09; 1.Hashtable和HashMap有什么区别&#xff1f; a.Hashtable是继承自陈旧的Dictionary类的&#xff0c;HashMap继承自AbstractMap类同时是Java 1.2引进的Map接口…

使用memcache做web缓存

为什么80%的码农都做不了架构师&#xff1f;>>> 下载: memcached server [密码: vTI8, 安装启动和调用, 内部有说明] 下载: python-memcached 1.57 现在准备用web.py写个网站, 缓存这块一直没想好用哪个, 今天终于想好了, 直接用memcache # coding: utf-8import me…

Asp.net中DataGrid控件的自定义分页

使用实现起来虽然比较方便&#xff0c;但是效率不高&#xff0c;每次都需要读取所有页&#xff08;整个记录集&#xff09;&#xff0c;而加载的只是其中一页&#xff0c;造成了资源的浪费&#xff0c;记录多又会使效率变得很低。下面通过DataGrid的自定义分页功能来减少资源使…

实战:在Windows Server2008上配置NLB

1.1 在Windows Server2008上配置NLB 试验环境&#xff1a; DCServer是ESS.COM域的域控制器。 Fileserver和Research属于ESS.COM域&#xff0c;安装有Windows Server 2008企业版。 Sales计算机是ESS.COM域的成员&#xff0c;安装Vista企业版。 试验要求&#xff1a; 实现FileSer…

无人驾驶矿山赛道单笔最大融资:踏歌智行完成2亿元B轮融资

10月30日&#xff0c;矿山无人驾驶运输企业踏歌智行完成了2亿元的B轮融资&#xff0c;本轮融资由前海母基金和宝通投资共同领投&#xff0c;清研资本、蓝焱资本等跟投。踏歌智行继2019年连续完成三轮融资后&#xff0c;再创行业新高。据了解&#xff0c;踏歌智行2019年签订了超…

Python加密—RSA加密

为什么80%的码农都做不了架构师&#xff1f;>>> 公钥加密&#xff0c;私钥解密。 import rsa import base64 from Crypto.PublicKey import RSA # RSA加密解密pubkey -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcB4zYqi3mjdP3E2f9jyPuF0X…

在asp.net中为Web用户控件添加属性和事件

在90年代初&#xff0c;Microsoft为Web程序员提供的 Active Server Pages(ASP)革命性地改变了Web的编程。它可以利用十分易用的模型在Web服务器上动态生成HTML&#xff0c;并且很容易的实现了对数据库的访问&#xff0c;就当时来说&#xff0c;这是一项多么吸引人的技术&#x…

1024 鲲鹏开发者技术沙龙·福州站圆满收官!给程序员的福利你收到了吗?

10月24日&#xff0c;由华为技术有限公司与福建鲲鹏生态创新中心联合主办的“1024鲲鹏开发者技术沙龙”在福州顺利举行。在沙龙上&#xff0c;来自福建鲲鹏生态创新中心运营总监宋宗佑为活动进行致辞&#xff0c;福建鲲鹏生态创新中心生态总监朱晓彤对鲲鹏生态创业中心进行介绍…

IPsec ××× 配置實例

試驗top:ipsec ***的配置包括一下幾個步驟:1.配置ike的協商2.配置ipsec的協商3.配置端口的應用4ike的調試和排錯按照步驟建立ike 的協商策略和參數R1<config>#crypto isakmp policy 編號<1-10000>編號越低優先級越高#hash { md5 | sha1 } 此命令表明設置密匙認…