有谁遇到过类似的问题

星光伴月 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();
...全文
86 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Friecin 2005-02-26
  • 打赏
  • 举报
回复
友情UP

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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