在阅读这篇文章之前,最好能够接触过以下几项
gdi+
利用atl生成组件
stl
asp使用组件
aspimage是serverobjects站点上非常好的一个组件,它可以使我们利用asp实现很多对于图形的处理功能,他的功能强大,如果你需要了解更详细的信息你可以访问它的官方网站,在这里就不讲如何使用这个组件了,我们在这里要讲的是如何实现这类组件,当然下面的例子中使用gdi+并不是实现组件图形处理的唯一方法,大家也可以自己试试其他的方法.
以下是实现过程
一、首先使用visual c++的向导建立atl项目
二、接下来添加一个atl active server page 组件接口类
三、生成名称为asppiccom的类并且选择asp内部对象response
四、在iasppiccom接口上添加属性和方法,如下表
名称 | 类别 | 含义 | 调用方法 |
fontname | 属性 | 字体名称 | 字符串类型
使用方法 |
fontsize | 属性 | 字体大小 | 整型
使用方法 |
fontstyle | 属性 | 字体类型 | 整形
regular = 0, 使用方法 |
imgformat | 属性 | 图形格式 | 字符串类型
image/gif 使用方法 |
setfontcolor | 方法 | 设置字体颜色 | 使用方法 .setfontcolor 255,3,242,4 上面的数字分别代表alpha,red,green,blue |
setbackcolor | 方法 | 设置字体背景颜色 | 使用方法 .setbackcolor 255,3,242,4 上面的数字分别代表alpha,red,green,blue |
showpic | 方法 | 将图片发送到客户端 | 使用方法 .showpic |
五、 要在asp组件中使用gdi+,需要加入一些代码
1、你需要在stdafx.h文件中加入下面两行:
#include <gdiplus.h> using namespace gdiplus;
而且需要连接gdiplus.lib库
#pragma comment(lib,"gdiplus.lib")
2、声明ulong_ptr gdiplustoken;为一个全局或者类的内部成员变量。
3、在实现类的finalconstruct函数中加入:
gdiplusstartupinput gdiplusstartupinput; //初始化 gdi+ gdiplusstartup(&gdiplustoken, &gdiplusstartupinput, null);
4、在finalrelease函数中加入:
gdiplusshutdown(gdiplustoken);
这样你就可以使用gdi+提供的图形处理函数了。
注:关于gdi+的使用你可以在以下网址找到参考
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/gdi+/gdi+.asp
http://www.codeproject.com/vcpp/gdiplus/
六 接下来就是实现在四中列出的这些属性和方法,下面列出showpic方法的一段代码,其他代码请查看源代码
bitmap bitmap(1,1,pixelformat48bpprgb); graphics graphics(&bitmap); uses_conversion; font font( ole2cw(m_bstrfontname),(float)m_ffontsize,m_nfontstyle,
unitpoint,null); pointf origin(0, 0); stringformat format; format.setalignment(stringalignmentcenter); rectf boundrect; graphics.measurestring(ole2cw(m_bstrtext),m_bstrtext.length (),
&font, origin, &format, &boundrect); int nwidth = (int)boundrect.width; int nheight = (int)boundrect.height; bitmap bm(nwidth,nheight,pixelformat48bpprgb); graphics* g=graphics::fromimage (&bm); boundrect.width=boundrect.width*2; solidbrush solidbrush(m_cbackground); g->fillrectangle(&solidbrush,boundrect); solidbrush solidfont(m_cfontcolor); pointf fpoint(0,0); g->drawstring(ole2cw(m_bstrtext),m_bstrtext.length (),
&font,fpoint,&solidfont); int result; clsid pngclsid; result = getcodecclsid(ole2w(m_btrimgformat ), &pngclsid); hresult hr; hglobal hglobal = globalalloc(gmem_moveable, 0); ccomptr<istream> pstm; if (failed(hr = createstreamonhglobal(hglobal, true, &pstm) )) return hr; bm.save(pstm,&pngclsid,null); ulong celements = (ulong)globalsize(hglobal); lpbyte lpdata = (lpbyte)globallock(hglobal); safearray* parray = safearraycreatevector(vt_ui1, 0, celements); for (uint ielement = 0; ielement < celements; ielement++) { long idx = ielement; safearrayputelement(parray, &idx, ((lpbyte)lpdata) + ielement); } globalunlock(hglobal); ccomvariant vbytes; vbytes.vt = vt_array | vt_ui1; vbytes.parray = parray; m_piresponse->clear (); m_piresponse->put_contenttype (m_btrimgformat); m_piresponse->binarywrite(vbytes); m_piresponse->end ();
七、现在组件的实现部分就大功告成了,我们写一段asp来测试以下这个组件
<%@language="vbscript" codepage="936"%> <html> <body> <% set picture=server.createobject("asppic.asppiccom") picture.text ="你能看见我吗?我来自www.goodassister.com!" picture.fontname="黑体" picture.fontsize= 40 picture.imgformat = "image/jpeg" picture.fontstyle= 1 picture.setfontcolor 255,3,242,4 代表alpha ,red,green,blue picture.setbackcolor 10,243,42,54 代表alpha ,red,green,blue picture.showpic set picture=nothing %> </body> </html>
注:在使用前先注册组件 regsvr32 asppic.dll
打开这个asp网页,你将会看到如下的图片
现在实现aspimage的具体思路就讲完了,现在如果需要更多的效果,你可以自己丰富这个组件
题外话:这类组件的用途很广,如yahoo.com注册会员时会显示图形单词以防止计算机自动注册,因为计算机要识别图片上的文字是低效而且很不容易的事情,这类组件更多的是应用到图表的生成,如柱状图、馅饼图、波形图等等。