关于内存流操作的问题

huang_2 2003-02-06 05:45:29
我使用如下一个函数进行屏幕的截取
其中函数里面的bmpStream是 TMemoryStream类型的全局变量,在formCreat的时候我为他分配空间
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ServerSocket1->Active=true;
bmpStream=new TMemoryStream();
}

以下是我的函数,当第一次调用的时候,能够成功的运行,但当我发出第二次指令的时候,在函数里面的 bmpStream->Clear(); 这一行通不过,我不太清楚是什么原因。

void __fastcall TForm1::Net_Snap_Screen(int leftPos,int topPos,int

rightPos,int bottomPos)
{
int rectWidth,rectHeight;
HDC sourceDC,destDC,bHandle;
Graphics::TBitmap *bitMap=new Graphics::TBitmap();
rectWidth=rightPos-leftPos;
rectHeight=bottomPos-topPos;

/*以屏幕坐标位置读取源设备*/
sourceDC=CreateDC("DISPLAY",NULL,NULL,NULL);
destDC=CreateCompatibleDC(sourceDC);
bHandle=CreateCompatibleBitmap(sourceDC,rectWidth,rectHeight);
SelectObject(destDC,bHandle);

BitBlt(destDC,0,0,rectWidth,rectHeight,sourceDC,leftPos,topPos,SRCCOPY);

bitMap->Handle=bHandle;
bmpStream->Clear();
bitMap->SaveToStream(bmpStream);

/* 释放资源 */

delete bitMap;
DeleteDC(destDC);
ReleaseDC(bHandle,sourceDC);

/*保存截取的屏幕*/

bmpStream->SaveToFile("temp.bmp");

/* 将bmp转换成.jpg文件 */

Graphics::TBitmap *bitMap1=new Graphics::TBitmap(); //bitMap1是为了读取刚才储存的bmp文件
bitMap1->LoadFromFile("temp.bmp");
Graphics::TBitmap *tmpBitmap=new Graphics::TBitmap();

tmpBitmap->Width=bitMap1->Width;
tmpBitmap->Height=bitMap1->Height;
tmpBitmap->Canvas->StretchDraw(TRect(0,0,tmpBitmap->Width,tmpBitmap->Height),bitMap1);

TJPEGImage *jpeg=new TJPEGImage();
jpeg->PixelFormat=jf8Bit;
jpeg->CompressionQuality=75;
jpeg->Assign((TPersistent *)tmpBitmap);
jpeg->Compress();

/* 把jpg格式的图像储存在内存流中 */

bmpStream->Clear();
jpeg->SaveToStream(bmpStream);
jpeg->SaveToFile("temp.jpg");

/* ******记录图像文件的大小 *********/


/******** 释放资源 ***********/

delete jpeg;
delete bitMap1;
}
...全文
101 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
halibut 2003-02-16
  • 打赏
  • 举报
回复
用:bmpStream->Size = 0;试试
iamleejun 2003-02-16
  • 打赏
  • 举报
回复
mark
大大怪老张 2003-02-12
  • 打赏
  • 举报
回复
你把发送的部分先注释掉,只是不停的截图保存,看看会不会出错。
猛禽 2003-02-08
  • 打赏
  • 举报
回复
MemoryStream的Clear应该是没有问题的,怀疑你是不是在Socket方面出错了,用非阻塞方式是会比较麻烦的。

huang_2 2003-02-07
  • 打赏
  • 举报
回复
...........我看得出还要问吗
huang_2 2003-02-07
  • 打赏
  • 举报
回复
我现在不知道是哪里操作错了,当把函数运行一遍后,我是没有delete bmpStream的,只是在formDestory的时候才删除她

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete bmpStream;
}

顺带附上我发生bmpStream的代码
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString recText="";
recText=Socket->ReceiveText();
Label6->Caption=recText;

if(recText=="getImage")
{
Label2->Caption="收到要求截图的命令";
Net_Snap_Screen(0,0,Screen->Width,Screen->Height);
Socket->SendText(IntToStr(bmpStream->Size));
}
if(recText=="ok")
{
Label3->Caption="开始发送图片文件流";
bmpStream->Position=0;
Socket->SendStream(bmpStream);
}
}
pp616 2003-02-06
  • 打赏
  • 举报
回复
你自己短一下看看什么地方错不就好了。
多数是内存没关系好的问题。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧