您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
利用Visual C++开发ASP图像处理组件
[文章信息]
作者:符文科 (龙飞)
时间:2005-02-03
出处:vckbase
责任编辑:方舟
[文章导读]
在Windows中有各种图形用户界面GUI(Graphics User Interface)对象,当我们在进行绘图时就需要利用这些对象
advertisement
热点推荐
· EJB 3.0 开发指南之定时服务
· MSN“性感鸡”预防措施及杀毒方案
· 江民MSN“性感鸡”蠕虫技术报告
· 最新MSN蠕虫病毒分析报告
· MSN最新蠕虫的手工清除方法
[正文]

上一页  1 2 3 4  下一页

  三、COM组件接口设计

  前面我们在输入文本后,在程序中创建设备上下文,对输入的文本进行计算并输出了指定文件名的位图文件,在本设计中,我们使用了以JPEG压缩格式存储文件的方式以减小网络传输时间,因jpeg压缩方法的论述已超出本文范围,故在此不再赘述。

  为了让其他语言调用此接口,我们以 COM 组件的方式发布此程序,可供VB,DELPHI,PB,ASP等程序调用,下面给出COM组件的设计方法,一般COM组件的创建及编译超出本文范围,故不再作解释。

  在组件中清加方法:

STDMETHOD(OutTextImg)(/*[out, retval]*/ long *pVal);ltvalue(500)] long lWeight,
[in,optional,defaultvalue(0)] long l3D);

  和

STDMETHOD(OutImg)(BSTR bstrFileName, long lDelFile);

  分别实现处理文件本保存为图像及把图像输出到用户浏览器。实现代码如下:

STDMETHODIMP CAspImage::OutImgFromText(BSTR bstrFilePath,
BSTR bstrText,
BSTR bstrBgImg,
long lCSet,
BSTR bstrFont,
long lWidth,
long lHeight,
long lLeft,
long lTop,
long llfHeight,
long lWeight,
long l3D)
{
 CImg img;
 try{
  if(0 == img.OutImgFromText(
   bstrFilePath,
   bstrText,
   bstrBgImg,
   lCSet,
   bstrFont,
   lWidth,
   lHeight,
   lLeft,
   lTop,
   llfHeight,
   lWeight,
   l3D))
  {
   return S_OK;
  }
  else
  {
   return S_FALSE;
  }
 }
 catch(...)
 {
  return S_FALSE;
 }

 return S_OK;
 /**/

}

  一些处理代码我们封装在了Cimg类中,在前面做过介绍,在这里只是简单调用即可。

STDMETHODIMP CAspImage::OutTextImg(long *pVal)
{
 HRESULT hr = OutImgFromText(bstrFilePath,
  bstrText,
  bstrBgImg,
  lCSet,
  bstrFont,
  lWidth,
  lHeight,
  lLeft,
  lTop,
  llfHeight,
  lWeight,
  l3D);

 if(SUCCEEDED(hr))
  *pVal = 0;
 else
  *pVal = -1;

 return S_OK;
}

  OutTextImg 函数只简单调用OutImgFromText 接口。

STDMETHODIMP CAspImage::OutImg(BSTR bstrFileName, long lDelFile)
{
// TODO: Add your implementation code here

_variant_t vReturnBuffer;
LPSAFEARRAY psaFile;
HANDLE hFile;
DWORD dwSizeOfFile;
DWORD dwNumberOfBytesRead;
BOOL bResult;
unsigned char *pReturnBuffer = NULL;
long k;
HRESULT hr = S_OK;


// Create file in this case only OPENS an existing file (or fails
// if the file does not exist!)
hFile = ::CreateFile(
bstrFileName, // name of the file
GENERIC_READ, // desired access
FILE_SHARE_READ, // shared access
NULL, // security attributes
OPEN_EXISTING, // creation disposition - open only if existing!
FILE_FLAG_SEQUENTIAL_SCAN, // flag attributes
NULL );

if( hFile == INVALID_HANDLE_VALUE )
{
return E_FAIL;
}

dwSizeOfFile = ::GetFileSize( hFile, NULL );
if (dwSizeOfFile == 0xFFFFFFFF)
{
return E_FAIL;
}

pReturnBuffer = new unsigned char[dwSizeOfFile];

// Get the binary content of the file
bResult = ::ReadFile( hFile, pReturnBuffer, dwSizeOfFile, &dwNumberOfBytesRead, NULL );
if( FALSE == bResult )
{
return E_FAIL;
}

psaFile = ::SafeArrayCreateVector( VT_UI1 , 0, dwSizeOfFile );

if( !psaFile )
{
return E_FAIL;
}

// Fill in the SAFEARRAY with the binary content of the file
for( k = 0; k < (int) dwSizeOfFile; k++ )
{
if( FAILED(::SafeArrayPutElement( psaFile, &k, &pReturnBuffer[k] )) )
{
return E_FAIL;
}
}

vReturnBuffer.vt = VT_ARRAY | VT_UI1;
V_ARRAY(&vReturnBuffer) = psaFile;

m_piResponse->BinaryWrite(vReturnBuffer);

if( pReturnBuffer )
delete [] pReturnBuffer;


//_variant_t vOut("OutImg TEST....................");
//m_piResponse->Write(vOut);

::CloseHandle(hFile);

if(lDelFile != 0)
::DeleteFile(bstrFileName);

return SUCCEEDED(hr) ? S_OK : E_FAIL;


return S_OK;
}

  此接口我们使用m_piResponse->BinaryWrite(vReturnBuffer);将读入内存的图像数据转发给用户浏览器。另外,为了灵活地改变图像字体,大小,字符集及图像长宽等,我们要为组件添加以下属性。

STDMETHOD(get_bAutoHeighten)(/*[out, retval]*/ BOOL *pVal);
STDMETHOD(put_bAutoHeighten)(/*[in]*/ BOOL newVal);
STDMETHOD(get_l3D)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_l3D)(/*[in]*/ long newVal);
STDMETHOD(get_lWeight)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_lWeight)(/*[in]*/ long newVal);
STDMETHOD(get_lTop)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_lTop)(/*[in]*/ long newVal);
STDMETHOD(get_lLeft)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_lLeft)(/*[in]*/ long newVal);
STDMETHOD(get_lCSet)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_lCSet)(/*[in]*/ long newVal);
STDMETHOD(put_bstrBgImg)(/*[in]*/ BSTR newVal);
STDMETHOD(put_bstrFilePath)(/*[in]*/ BSTR newVal);
STDMETHOD(put_bstrFont)(/*[in]*/ BSTR newVal);
STDMETHOD(put_bstrText)(/*[in]*/ BSTR newVal);
STDMETHOD(get_llfHeight)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_llfHeight)(/*[in]*/ long newVal);
STDMETHOD(get_lHeight)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_lHeight)(/*[in]*/ long newVal);
STDMETHOD(get_lWidth)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_lWidth)(/*[in]*/ long newVal);

  分别实现自定义图象长,宽,字体大小,字体名称等属性。如:设置图像文本

STDMETHODIMP CAspImage::put_bstrText(BSTR newVal)
{
bstrText = newVal;
return S_OK;
}

  设置图像高度

STDMETHODIMP CAspImage::put_lHeight(long newVal)
{
lHeight = newVal;
return S_OK;
}


上一页  1 2 3 4  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • MFC程序员的WTL指南之工具条与状态条
  • Visual C++初学者指针学习指南
  • 使用VC++ ATL实现Office的COM插件
  • VC中利用FTP协议实现多线程断点续传
  • 防止Visual C++应用程序缓冲区溢出
  • 国内最早的黑客组织“红客联盟”宣布解散
  • 零关税引爆数码相机降价 洋品牌争抢市场
  • 新陈代谢:老家伙们撤退与新生一代的天下
  • 同工不同酬:跨国公司经营不能承受之重
  • 17.75万元奢华“天价手机”热销大连惹争议
  • 胡鞍钢不再沉默 此番焦点在就业与3G关系
  • 双模小灵通样机现身 可兼容GSM网络
  • 品牌重塑案例:柯达在中国的坎坷市场路
  • Advertisement