Help!!!:用delphi写计数器的CGI时,如何完成图象向HTML的输出(100分)

  • 主题发起人 主题发起人 njgyn
  • 开始时间 开始时间
N

njgyn

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi写一个计数器的CGI程序时,记数及图象合成步骤都顺利完成,但不知如何将合成好的记数图象(对应程序中变量为newbmp:TBitmap,保存后的图象文件为counter.bmp)返回index.html文件中,用writeln()函数还是用Response自带的属性?具体如何用?望大虾指点!急盼!先谢过!
 
1.你的基本概念可能有混淆.Index.html应该是系统的HTTP
服务器自动发送给浏览器的,故不需要处理.但Index.html
中应该有调用CGI的TAG:
<Img src="/CGI/Counter.EXE?Name=MainCounter">
2.CGI要处理的调用是上面对Counter.EXE的调用.如果已经生成
图象,则:
(1)不要将图象存盘
(2)将图象变换为JPEG或GIF格式,也不要存盘
(3)Response->ContentType = "image/jpeg"
(4)Response->SendStream(picStream)或类似的等效调用
 
lhz:你好,首先感谢你的迅速解答,尚有两点不明:
1、我曾这么试过:
uses
Windows, Messages, SysUtils, Classes, Graphics,HTTPApp;
...
var
picstream:TStream;
begin
...
{标准输出流输出部分}
picstream:=Tstream.Create;
newbmp.SaveToStream(picstream);//newbmp是合成图象的图形变量
response.ContentType:='image/bmp';
response.SendStream(picstream);
picstream.Free;
bewbmp.Free;
运行时,语法通过,但提示出错:
Project counter.exe raised exception class
EAbstractError with message'Abstract Error'
是程序开头的uses中少什么或其它地方问题?
2、引用cgi的tag中Name后应跟什么?如下对吗?
<Img src="/cgi/counter.exe?Name="index.html">
 
不知何故,少传送一行:
<Img src="/CGI/Counter.EXE?Name=index.html">
 
1.
(1)浏览器一般不支持BMP,所以应变换成JPEG/GIF
(2)
>picstream:=Tstream.Create;
picstrean := TMemoryStream.Create;
TStream 只是抽象的流,不能直接使用,创建时应该用实例化的
类如TMemoryStream.
2.Tag中的所有参数都是为你的CGI准备的,所以如何写要看你的
CGI如何编写.如果你的CGI只有一个计数器,可以不要任何参数.
 
不好意思,请问gif或jpg(最好是gif格式)的图形变量该如何定义?
 
??
GIF/JPEG和BMP是对等的.对D4,内部支持JPEG,如果要
变换到GIF,应该安装控件(说控件有些不准确,因为只是
一个注册了的类).有很多支持GIF的包,各个用法略有差
异.不管是JPEG还是GIF,都应该可以这样些:

jpg := TJpegImage.Create;
jpg.Assign(bmp);
jpg.SaveToStream(pciStream);
 
我现在写的CGI只是个单纯的记数器,未加其它功能,经指点,
现jpg图象的问题已解决,引用cgi的tag如下
<img src=".../dscripts/counter.exe">
这样对吗?执行html时,counter.exe确实被执行了,但并未返回图象,
输出流部分程序如下:
...//前面是记数和图象合成部分
//标准输出流输出部分
picstream:= TMemoryStream.Create;
newjpg := TJpegImage.Create;
newjpg.Assign(newbmp);//newbmp是合成图象时使用的bmp格式变量
newjpg.SaveToStream(picStream);
Response.ContentType:='image/jpeg';
Response.SendStream(picstream);
picstream.Free;
newbmp.Free;
end;
 
怎么又少传一句?我引用cgi的tag如下:
<img src="http://.../dscripts/counter.exe">
cgi中没有设定参数,上面这样引用可以吗?
 
引用cgi的tag:
<img src="http://202.119.108.250/dscripts/counter.exe">
 
怎么回事?HTML语句总传不过来?引用cgi的tag:
<img src="http://.../dscripts/counter.exe">
 
引用cgi的tag:
img src="http://.../dscripts/counter.exe
 
>Response.SendStream(picstream);
>picstream.Free;
这两句改成:
picStream.Position := 0;
Response.ContentStream := picStream;
记住不要Free这个Stream.
 
谢谢lhz分坛主,计数器OK了,多亏耐心指点,多谢!多谢!
 
请教一下,图象合成是怎样实现的呢
 
图象合成示例:
(按显示十位示例,即记数不满十位的,已事先补0凑足十位。若想按实际记数显示,
只需修改算法既可)

//读字模图orig.bmp
orig:=Tbitmap.Create;
orig.LoadFromFile('orig.bmp');
//创建位图
newbmp:=Tbitmap.Create;
//确定显示尺寸
newbmp.Height:=orig.Height;
newbmp.Width:=orig.Width-2;
//计算单元尺寸
chunkx:=newbmp.Width div 10; //chunkx为合成图象的长度
chunky:=newbmp.Width; //chunky为合成图象的高度
//合成
for x:=0 to 9 do
begin
newx:=StrToInt(Copy(FStr,x+1,1)); //FStr为存放记数数字的字符型变量
newy:=0;
y:=0;
newbmp.Canvas.CopyRect(
rect(x*chunkx,y*chunky,(x+1)*chunkx,(y+1)*chunky),
orig.Canvas,
rect(newx*chunkx,newy*chunky,
(newx+1)*chunkx,(newy+1)*chunky));
end;
 
后退
顶部