怎么错了,急呀!(可能白送了)(50分)

  • 主题发起人 主题发起人 gdd
  • 开始时间 开始时间
G

gdd

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
aWidth,aHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
jpeg1:tjpegimage;
jpegstream:tmemorystream;
begin
jpegstream:=tmemorystream.Create;
jpeg1:=tjpegimage.Create;
aWidth:=640;
aHeight:=480;
SourceDC:=CreateDC('DISPLAY','','',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,aWidth,aHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,aWidth,aHeight,SourceDC,0,0,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;

jpeg1.Assign(bitmap);
jpeg1.JPEGNeeded;

jpeg1.CompressionQuality:=50;
jpeg1.Compress;
jpeg1.SaveToStream(jpegstream);
jpegstream.Position :=0;
jpeg1.LoadFromStream (jpegstream);
canvas.Draw(0,0,jpeg1);
bitmap.free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
end;

end.

运行到jpeg1.JPEGNeeded;时就提示out of system resource!
到底是那里错了呀!请大虾门帮个忙吧。
 
有错吗?我怎么看不出来,我去试试.
 
请liangdewei兄帮忙看看了。
我刚刚在Bitmap.Handle:=BHandle;
后多加了两句
bitmap.SaveToFile('myfile.bmp');
bitmap.LoadFromFile('myfile.bmp');
就可以,不知道为什么了。
 
在WIN32中最好不要用SelectObject,它是从在一个进程中调用另一个进程的句柄,GDI对象在
不同的进程中可能有不同的含义,最好不要用了(WIN16中是可以的)。
你这样用的话,由于GDI对象在WIN32不是共享的,对应的句柄表(LDT)可能是错的(有时候
碰巧也可能是对的)。
我只知道这么多了,希望能帮你了。:)
 
先谢过hspdel的回答。
但是为什么我加了那两句后试了每次都可以,说明取的句柄没错呀!
 
你添了那两句后,Bitmap.Handle就不是BHandle了
是你bitmap.LoadFromFile那个文件的HANDLE了。
当你调用jpeg1.JPEGNeeded那个HANDLE当然是正确的。
我可以帮你试试了。不过得等我下班后了呵呵
 
刚开始myfile.bmp是不存在的,是bitmap.SaveToFile存进去的。
bitmap.handle应该是取对了的。
不过我不会解决,谁叫我自己菜呢,呵呵,有劳hspdel了。
 
gdd老兄是不是在研究delphi下的图像传输
 
仔细看一下 SelectObject 的定义,DC 本身是包含有自己的 Object 的,SelectObject
在把自定义对象 Select 入 DC 之后,同时还会返回 DC 中原有的 Object 的句柄,在使用
完 DC 之后,还需要把原来的 Object Select 回去,否则就会造成 Out of System Resource。
Remarks
This function returns the previously selected object of the specified type.
An application <font color = #ff0000><strong>should always replace a new object with the original, default
object after it has finished drawing with the new object</font></strong>.
 
问题解决了,谢谢各位!
 
多人接受答案了。
 
后退
顶部