关于内存流操作的问题
我使用如下一个函数进行屏幕的截取
其中函数里面的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;
}