关于图像远程传输的问题(主要是TJpegImage的用法)(100分)

  • 主题发起人 主题发起人 liling
  • 开始时间 开始时间
L

liling

Unregistered / Unconfirmed
GUEST, unregistred user!
现在现在网上实现图像的传输,本地端是BMP图像,由于较大,故先转为
JPEG格式,然后打包、发送。想用TJpegImage控件完成,但好像不能直
接访问该控件里的数据,所以想通过一个TStream作过渡,再由该TStream
写入一数组中,但程序出错。

tempJpeg:=TJPEGImage.Create;
tempJpeg.Assign(tempBmp);
tempJpeg.JPEGNeeded;
tempJpeg.CompressionQuality:=50;
tempJpeg.Compress;

tempStream:=TStream.Create;
tempBmp.Free;
tempJpeg.SaveToStream(tempStream);
tempJpeg.Free;
当运行到SaveToStream时,程序出错,报告说
‘EAbstractError‘。Help中有一段说明:
SaveToStream expects JPEG image data and may
incur overhead of a compression cycle if the
source is a bitmap.
意思好像是这样不安全。请有经验的高手指教。
当然,别的方案也有,比如先写入一个文件,再读出来,
但总觉得这样太傻。另外,是否有别的方案?比如直接
调API函数?是否有例程?
 
tempJpeg:=TJPEGImage.Create;
tempJpeg.Assign(tempBmp);

执行了这两句,tempjpeg里已经有数据了。
 
我也知道有数据了,问题是怎样把数据读出来?唉,可怜,我也知它
在控件里,可我就是不知怎样读出它
 
你要读到什么里,blobfield?
 
一个数组里
tempChar:array [0..65535] of char;
我原先是设想数据先进TStream后再调用
tempStream.ReadBuffer(tempChar,tempStream.Size);
我想这样就可以把数据倒到数组里了。
但是。。。。。
 
到STREAM应该是没问题的。
 
用TMemoryStream试一试
 
不过还有更简单的办法:

myjpeg:array of Tjpegimage;

:-)
 
H:/Borland/Delphi4/Demos/Internet/Strm
其实好多答案都在sample里。
 
To Energy:
那个DEMO太简单了,我现在碰到的主要问题是TStream不能从
TJpegImage中获得数据,TStream从文件中获得数据是没问
题,但从TJpegImage中就获得不了数据。

To All:
全部源程序(该程序的功能是抓取当前应用程序的显示内容
并存到一个jpg文件中):

procedure TForm1.Button1Click(Sender: TObject);
var
ActWnd:THandle;
DC,WDC: HDC;
rect: TRect;
tempBmp: TBitmap;
tempJpeg:TJpegImage;
tempStream:TStream;
tempChar:array[0..65535]of char;
tempsize:integer;
begin
tempBmp:=TBitmap.Create;
ActWnd:=GetForeGroundWindow; //获得活动窗口句柄
if ActWnd=handle then exit;
label1.Caption:=inttostr(ActWnd);
WDC:=GetDC(GetDesktopWindow); //获得DC
DC:=GetDC(ActWnd);
GetWindowRect(ActWnd, rect);
tempBmp.Width:=Rect.Right-Rect.Left+2;
tempBmp.Height:=Rect.Bottom-Rect.Top+30;
BitBlt(tempBmp.Canvas.Handle, 0,0, width, height+30, WDC, Rect.Left, Rect.Top, SRCCOPY);
//获得BMP图像
tempJpeg:=TJPEGImage.Create; //创建JPG并压缩
tempJpeg.Assign(tempBmp);
tempJpeg.JPEGNeeded;
tempJpeg.CompressionQuality:=50;
tempJpeg.Compress;

tempStream:=TStream.Create; //创建TStream并获得数据
tempBmp.Free;
tempJpeg.SaveToStream(tempStream); //出错
tempJpeg.Free;
tempsize:=tempStream.Size;
tempStream.ReadBuffer(tempChar,tempSize);
tempStream.Free;

tempStream:=TStream.Create;
tempStream.WriteBuffer(tempChar,tempSize);

tempJpeg:=TJPEGImage.Create;
tempJpeg.LoadFromStream(tempStream);
Form1.Width:=Rect.Right-Rect.Left+2;
Form1.Height:=Rect.Bottom-Rect.Top+30;
Canvas.Draw(0,0,tempJpeg);
tempJpeg.free;
tempStream.Free;
ReleaseDC(ActWnd, DC);
ReleaseDC(GetDesktopWindow, WDC);
timer1.Enabled:=false;
end;
 
TStream是抽象(abstract)类,通常做为基类,不直接使用,根据需要派生一些类,如memorystream,filestream,blobstream....见help.
根据你的程序要求,可以使用memorystream.
可以改为:
tempStream:=TmemoryStream.Create;
tempJpeg.SaveToStream(tempStream);
另外要注意的是,用流操作时,load前reset 一下:tempstream.position:=0;

你的程序我试过了,经过修改已经可以了。
 
非常感谢各位的鼎力支持,问题已基本解决。
 
多人接受答案了。
 
后退
顶部