使用 GDI+ 在 ISAPI 扩展中动态生成图像(带实时演示)






3.88/5 (8投票s)
2002 年 10 月 2 日
2分钟阅读

66303

425
一个类包装器,用于使用 ISAPI 扩展将 GDI+ 图像写入客户端浏览器。
引言
是否曾经想在您的 Web 服务器上生成“堆上”图像并将其发送给客户端? 现在可以在您的 ISAPI 扩展中仅用 2 行代码(好吧,几乎)做到这一点。
事实上,本文介绍了一个辅助类,用于 MFC ISAPI 扩展,该扩展将 GDI+ 图像写入客户端浏览器。 您所要做的就是加载或生成 GDI+ 图像!
先决条件
在本文中,我假设
- 读者具有 GDI+ 的基本知识。 这是 CodeProject 上关于此主题的一些不错的介绍性文章:GDI+ 部分。
- 读者具有 MFC ISAPI 扩展的基本知识。 这是 CodeProject 上关于此主题的一些不错的介绍性文章
- 什么是 ISPAPI 扩展? 作者:Mehdi Mousavi
- 发现 ISAPI。 使用 GET-POST 数据 作者:Adrian Bacaianu
渲染管道
渲染管道封装在 WriteImage
函数中
请注意,使用此方法,无需在磁盘上创建临时文件,因为它们直接写入内存 (hGlobal
)。
使用 CGDIpISAPI
基本用法
该类的使用非常简单:构建一个 CGDIpISAPI
对象并调用 WriteImage
void CHttpServerDerviedClass::Default( CHttpServerContext* pCtxt) { // GDI+ namespace using namespace Gdiplus; // creating bitmap Bitmap bitmap(320,200); // drawing on this bitmap ... // sending bitmap to the browser CGDIpISAPI renderer( this, pCtxt, &bitmap ); // sending image renderer.WriteImage(); }
输出选项
您可以选择图像类型(PNG、JPEG、BMP 或 TIFF)。 有一个 enum
用于可用的编解码器。 您还可以自定义 PNG 和 JPEG 文件的质量。 它必须介于 0 和 100 之间。
所有这些选项都可以在构造时或通过 setter 设置。
- 设置 BMP 类型
renderer.SetImageType( CGDIpISAPI::ImageBMP);
- 更改质量
renderer.SetQuality( 98 );
初始化 GDI+
不要忘记初始化和取消初始化 GDI+。 我为此使用了一个辅助类:CGDIpInitializer
。 它的用途是不言自明的。
// extension declaration class CMyExtension : public CHttpServer { ... CGDIpInitializer m_GDIpInitializer; }
BOOL CMyExtension::GetExtensionVersion(HSE_VERSION_INFO* pVer)
{
CHttpServer::GetExtensionVersion(pVer);
// Initialize GDI+
m_GDIpInitializer.Initialize();
...
}
BOOL CMyExtension::TerminateExtension(DWORD dwFlags)
{
// Shutting down GDI+
m_GDIpInitializer.Deinitialize();
...
}
什么不该做...
- 写入图像时,请勿写入任何文本... 因此请忘记
StartContent
、EndContent
、WriteClient
等...
演示项目
演示项目是一个 MFC ISAPI 扩展(用于 VC7),它说明了 CGDIpISAPI
的不同选项。 请注意,您也可以在 VC6 中使用此类。
您可以通过查看test.html文件来测试所有功能。 当然,在此之前,您必须编译项目,将 DLL 放入您的脚本目录等... 下面是test.htm输出的屏幕截图
参考
更新历史
- 2002 年 10 月 4 日
- 修复了
CGDIpISAPI
类中的一个小错误(始终导出为 JPEG)
- 修复了