请问如何使用asp输出jpg图像(50分)

  • 主题发起人 主题发起人 硕鼠
  • 开始时间 开始时间

硕鼠

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是小弟写的程序,完成的功能是将一幅jpg图像输出到IE

procedure TAspTest.WriteImage;
var
jpg:TJPEGImage;
fname:string;
v:OleVariant;
begin
fname:='d:/photo/myphoto/image-01.jpg';
jpg:=TJPEGImage.Create;
jpg.LoadFromFile(fname);
JPEGToVariant(jpg,v);
Response.ContentType:='image/jpeg';
Response.BinaryWrite(v);
end;

procedure TAspTest.JPEGToVariant(aJPEG: TJPEGImage;
var aVariant: OleVariant);
var
Stream : TMemoryStream;
begin
try
Stream := TMemoryStream.Create;

aJPEG.SaveToStream(Stream);

StreamToVariant(Stream, aVariant);
finally
Stream.Free;
end;
end;

procedure TAspTest.StreamToVariant(Stream: TMemoryStream;
var v: OleVariant);
var
p : pointer;
begin
v := VarArrayCreate ([0, Stream.Size - 1], varByte);
p := VarArrayLock (v);
Stream.Position := 0;
Stream.Read (p^, Stream.Size);
VarArrayUnlock(v);
end;

然后通过这种方式调用。
<% Set DelphiASPObj = Server.CreateObject("asptest1.AspTest")
DelphiASPObj.WriteImage
%>

其结果却输出了很多乱码,而不是图像,请各位大侠指点迷津。[:)]
 


1。可生成JPEG格式的图形文件
2。可生成透明的GIF格式的图形文件
3。可生成交错的GIF格式的图形文件
4。可以使用两种方式保存图形文件:一种是直接生成图形文件 另外一种是保存到数组中然后直接输出到WWW页面中
5。可以绘制文本图形,并且支持安装在你机器上的任何字体的文本
6。可以导出和预览由OLE服务程序生成的文档,例如MS Word,Excel等等。
7。可以使用位图方式自由的缩放,镜像,旋转和剪切图形
8。可使用本地图形缓存
9。可以ZOOM图片
10。可以获取任何JPEG, GIF ,BMP格式文件的详细信息
11。可以进行Windows抓屏
12。可生成动态GIF
非注册版本的限制如下:
1。只能够最多使用8种颜色,不过我认为对大多数人来说根本不算什么限制的.
2。能够生成的最大图形尺寸为320x240
如果是注册版本:
13。可在线修改现有的GIF, JPEG 和 BMP文件
14。可自定义调色板
15。可循环放映GIF动画

例子程序:
VBScript的例子:
代码:
set obj=CreateObject("shotgraph.image") 
size=201 
obj.CreateImage size,size,4 
obj.SetColor 0,255,255,255 
obj.SetColor 1,0,0,0 
obj.SetColor 2,255,108,0 
obj.SetColor 3,0,0,204 
obj.SetBgColor 0 
obj.FillRect 0,0,size-1,size-1 
obj.SetDrawColor 1 
obj.Line size-1,0,0,size-1 
obj.SetBgColor 2 
obj.Ellipse 5,5,size-6,size-6 
obj.SetBgColor 3 
obj.Ellipse 5,(size-5)/4,size/2,(size-5)*3/4 
obj.GifImage 0,1,"test.gif" 
ASP的例子代码: 

Response.ContentType="image/gif" 
set obj=Server.CreateObject("shotgraph.image") 
size=201 
obj.CreateImage size,size,4 
obj.SetColor 0,255,255,255 
obj.SetColor 1,0,0,0 
obj.SetColor 2,255,108,0 
obj.SetColor 3,0,0,204 
obj.SetBgColor 0 
obj.FillRect 0,0,size-1,size-1 

obj.SetDrawColor 1 
obj.Line size-1,0,0,size-1 
obj.SetBgColor 2 
obj.Ellipse 5,5,size-6,size-6 
obj.SetBgColor 3 
obj.Ellipse 5,(size-5)/4,size/2,(size-5)*3/4 

img=obj.GifImage(0,1,"") 
Response.BinaryWrite img  

那么如何画动画呢,步骤如下: 
1.Create一个"shotgraph.image"对象 
2.随便画点东西把,就看你的创意了 
3.调用TrackAdd函数 
4.重复2,3步知道你想要的祯数 
5.如果想要重复放动画,调用TrackLoop方法,不过只有注册版本有此功能 
6.调用TrackPlay方法生成这个动化文件 
例子代码如下: 
set obj=CreateObject("shotgraph.image") 
xsize=400 
ysize=50 

obj.CreateImage xsize,ysize,256 
obj.InitClipboard xsize,ysize*2 
obj.SelectClipboard True 
obj.ReadImage "frame1.gif",pal1,0,0 
obj.ReadImage "frame2.gif",pal2,0,ysize 
obj.BuildPalette 0 

obj.Copy 0,0,xsize,ysize,0,0,"SRCCOPY" 
obj.TrackAdd -1,0,0,0,0,xsize,ysize,50 
obj.Copy 0,0,xsize,ysize,0,ysize,"SRCCOPY" 
obj.TrackAdd -1,0,0,0,0,xsize,ysize,50 

obj.TrackLoop 0 
obj.TrackPlay "frames12.gif" 

怎么画文本文字呢,呵呵,过程如下: 
使用时,请注意FontSmoothing这个属性: 
它是用来定义文字是否防锯齿的。 
0 - 使用系统默认设置 
1 - 不防锯齿 
2 - 防锯齿 
代码如下: 

<% 
Response.Contenttype="image/gif" 
Set g=CreateObject("shotgraph.image") 
g.CreateImage 320,200,16 
g.SetColor 0,255,255,255 
g.SetColor 1,0,0,0 
g.SetBgColor 0 
g.SetTextColor 1 
g.FillRect 0,0,320,200 
g.FontSmoothing=1 
g.CreateFont "Arial",0,42,0,True,False,False,False 
g.TextOut 0,30,"Non-Antialiased" 
g.FontSmoothing=2 
g.CreateFont "Arial",0,42,0,True,False,False,False 
g.TextOut 0,120,"Antialiased" 
g.BuildPalette 2 
Response.BinaryWrite g.GifImage(-1,0,"") 
%> 

[code]
下载地址: 
http://download.proxy.ru/mike/shotgraph/ 
http://www.geocities.com/SiliconValley/Foothills/9219/shotgraph/ 
-------------------------- 


通过上面这篇文章,可以明白,关键是在输出数据之前,需要显输出一个文件类型的定义. 
这样浏览器就知道你送过来的不是文本而是图片,或其他的什么,比如声音,电影. 
Response.Contenttype="image/gif" //输出文件类型 
.....    //这里就可以替换成 读入硬盘图片文件二进制数据 
Response.BinaryWrite g.GifImage(-1,0,"") //图片数据 就可换成写入你的二进制数据 

...
 
请问wsn大侠,我写的程序经过如何的修改就可以正确了。
本人需要写的是一个档案网站,需要将存储在光盘库上的图像文件输出到网页上,
为了安全原因,所以希望能够尽量将代码放在服务器端,望指点迷津。
另,您给的两个网站都上不去,如果可能的话,希望将shotgraph组件mail给我,fanlu@public3.bta.net.cn
 
还请各位大侠再指教,不感谢.
 
通过我的仔细研究,发现问题发生在调用哪个ASP的文件的写法上。这是我的ASP文件
<% Set DelphiASPObj = Server.CreateObject("Demo.Demo")
' DelphiASPObj.DateTime 有这一行就不行了
DelphiAspObj.Test
%>
并且在这个ASP的文件中不能有像<HTML>这样的东西。
 
在脚本前加这个
Response.ContentType="image/gif"
出乱码是浏览器以2进制格式返回。组件本身没问题。
其实脚本可以直接取,效率并不差。
<script runat="server" language="VBScript">
InfoID = Request("InfoID")

Set adoconn = Server.CreateObject("ADODB.Connection")
Set adoRecord = Server.CreateObject("ADODB.Recordset")
adoconn.Open(StrConnectionString)
call adoRecord.Open("Select * from images where Info_ID ='" + InfoID + "'",adoconn)
Response.ContentType = "image/*"
Response.BinaryWrite adoRecord("Image") '这里可以自己处理了
adoRecord.Close
adoconn.Close
Set adoRecord = Nothing
Set adoconn = Nothing
Response.End
</script>
 
个位大侠,这里谢过了。但是我遇到了一个奇怪的问题,当我在IE中输入 
http://localhost/asptest/project2.asp 时,IE提示我时要在本地打开还是要下载?
不知我把什么地方搞错了。
 
估计离成功已经不远了,还请大家再拉一把。
 
接受答案了.
 
后退
顶部