有谁遇到过类似的问题
星光伴月 2005-02-26 12:13:00 我在将一段内存中的图像保存为图像文件时,在后面跟着有操作数据库的代码时,或者有代码以后,保存为图像文件的代码也执行了,但是保存的图像却是一片空白,而将后面的代码去掉以后,则完全正常.
请问有人遇到过类似的问题吗?我该如何解决?
相关代码:
//静态内存页面数
DWORD BlockSize;
//图像卡采集的每帧数据数据大小
DWORD BufLength;
//用户创建的一帧图像数据缓冲区大小,用来将图像卡采集到内存的数据读出到该缓冲区
DWORD ImgBufLength;
HANDLE MemHandle;
char *LineAddr, *pBuf;
PBITMAPINFO pBMIInfo;
Graphics::TBitmap *Bmp;
HDC VideoDc;
String sFile;
if (! bInit) return ;
//使用静态内存保存图象,先访问其大小,如果访问失败则退出操作
if (CGGetStaticMem(&BlockSize) != CG_OK ){
ShowMessage("Error in StaticMem Access!");
return;
}
//已经固定用GRB565来采集数据了,每帧图像768*576,所以图像卡需要的帧缓冲区大小是
BufLength = OUTPUT_WINDOW_WIDTH * OUTPUT_WINDOW_HEIGHT * 2;
//用户要不断将采集到静态内存的帧图像数据读出,需要读出后的帧图像数据是24位彩色
//所以用户自行创建的缓冲区大小是
ImgBufLength = OUTPUT_WINDOW_WIDTH * OUTPUT_WINDOW_HEIGHT * 3; //3;
//分配帧缓存用来保存读出的帧图像数据
pBuf = (char *)new char[ImgBufLength];
pBMIInfo = (PBITMAPINFO)new char[ sizeof(BITMAPINFO) + (255 * sizeof(TRGBQuad))];
Bmp = new Graphics::TBitmap();
//锁定全部保留静态内存给图像卡使用
CG_VERIFY(CGStaticMemLock(0, BlockSize*4096, &MemHandle, (void **)&LineAddr));
//准备回显图像的DC
VideoDc = GetDC(VideoPanel->Handle);
SetStretchBltMode(VideoDc, COLORONCOLOR);
Bmp->Width = OUTPUT_WINDOW_WIDTH;
Bmp->Height = OUTPUT_WINDOW_HEIGHT;
Bmp->PixelFormat = pf24bit;
//设定BMP的头信息
pBMIInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBMIInfo->bmiHeader.biWidth = OUTPUT_WINDOW_WIDTH;
pBMIInfo->bmiHeader.biHeight = OUTPUT_WINDOW_HEIGHT;
pBMIInfo->bmiHeader.biPlanes = 1;
pBMIInfo->bmiHeader.biBitCount = 24;
pBMIInfo->bmiHeader.biCompression = BI_RGB;
pBMIInfo->bmiHeader.biSizeImage = 0;
pBMIInfo->bmiHeader.biXPelsPerMeter = 0;
pBMIInfo->bmiHeader.biYPelsPerMeter = 0;
pBMIInfo->bmiHeader.biClrUsed = 0;
pBMIInfo->bmiHeader.biClrImportant = 0;
//采集到内存中
//从内存中读取一图
CGDataTransform(pBuf , LineAddr + BufLength, OUTPUT_WINDOW_WIDTH, OUTPUT_WINDOW_HEIGHT, 16, True);
//调用win32的API函数将Buf中的数据以图象形式显示在VideoPanel上
SetStretchBltMode(Bmp->Canvas->Handle, COLORONCOLOR);
SetDIBitsToDevice(Bmp->Canvas->Handle, 0, 0, Bmp->Width, Bmp->Height,
0, 0, 0, pBMIInfo->bmiHeader.biHeight,
pBuf, pBMIInfo, DIB_RGB_COLORS);
TJPEGImage *jp = new TJPEGImage();
try
{
sFile.printf("Image%04d.jpg",CurrentPictureID++);
jp->Assign(Bmp);
jp->SaveToFile(sFile);
}
__finally
{
delete jp;
}
//释放内存
delete Bmp;
delete []((char *)pBMIInfo);
delete []pBuf;
CG_VERIFY(CGStaticMemUnlock(MemHandle));
ReleaseDC(VideoPanel->Handle, VideoDc);
//以下的代码去掉以后,上面的代码完全正常,否则,存的图像有时正常,有时则是空白.
if(DM->Samples1->State!=dsInsert || DM->Samples1->State!=dsEdit)
{ DM->Samples1->Edit();
}
switch(sn)
{ case 0: Image1->Picture->LoadFromFile(sFile);
DM->Samples1Picture1->AsString=sFile;
break;
case 1: Image2->Picture->LoadFromFile(sFile);
DM->Samples1Picture2->AsString=sFile;
break;
case 2: Image3->Picture->LoadFromFile(sFile);
DM->Samples1Picture3->AsString=sFile;
break;
case 3: Image4->Picture->LoadFromFile(sFile);
DM->Samples1Picture4->AsString=sFile;
break;
case 4: Image5->Picture->LoadFromFile(sFile);
DM->Samples1Picture5->AsString=sFile;
break;
case 5: Image6->Picture->LoadFromFile(sFile);
DM->Samples1Picture6->AsString=sFile;
break;
case 6: Image7->Picture->LoadFromFile(sFile);
DM->Samples1Picture7->AsString=sFile;
break;
case 7: Image8->Picture->LoadFromFile(sFile);
DM->Samples1Picture8->AsString=sFile;
}
DM->Samples1->Post();