65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.88/5 (8投票s)

2002 年 10 月 2 日

2分钟阅读

viewsIcon

66303

downloadIcon

425

一个类包装器,用于使用 ISAPI 扩展将 GDI+ 图像写入客户端浏览器。

引言

是否曾经想在您的 Web 服务器上生成“堆上”图像并将其发送给客户端? 现在可以在您的 ISAPI 扩展中仅用 2 行代码(好吧,几乎)做到这一点。

事实上,本文介绍了一个辅助类,用于 MFC ISAPI 扩展,该扩展将 GDI+ 图像写入客户端浏览器。 您所要做的就是加载或生成 GDI+ 图像!

先决条件

在本文中,我假设

渲染管道

渲染管道封装在 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();
    ...
}

什么不该做...

  • 写入图像时,请勿写入任何文本... 因此请忘记 StartContentEndContentWriteClient 等...

演示项目

演示项目是一个 MFC ISAPI 扩展(用于 VC7),它说明了 CGDIpISAPI 的不同选项。 请注意,您也可以在 VC6 中使用此类。

您可以通过查看test.html文件来测试所有功能。 当然,在此之前,您必须编译项目,将 DLL 放入您的脚本目录等... 下面是test.htm输出的屏幕截图

参考

  1. MSDN 示例:PINBALL
  2. 什么是 ISPAPI 扩展? 作者:Mehdi Mousavi

更新历史

  • 2002 年 10 月 4 日
    • 修复了 CGDIpISAPI 类中的一个小错误(始终导出为 JPEG)
© . All rights reserved.