C++Builder 11.1.5中FMX DrawBitmap报错:无法执行渲染,未调用BeginScene?
问题原因与解决方案
可能的原因
- CopyFromBitmap隐式终止Canvas场景:Firemonkey中
CopyFromBitmap是底层像素操作,会隐式调用EndScene关闭当前渲染上下文。你代码里开头调用的BeginScene在两次CopyFromBitmap执行后已经失效,后续DrawBitmap自然会触发“未调用BeginScene”的错误。 - FinalBitmap尺寸自动变更导致场景失效:如果FinalBitmap初始尺寸不足以容纳两次复制的内容,Firemonkey会自动调整其尺寸。位图尺寸变更会让原有的Canvas渲染上下文失效,此时调用
DrawBitmap就会报错。 - CALIBRATE模式下Temp2OBitmap状态异常:虽然NORMAL模式正常,但CALIBRATE模式下Temp2OBitmap可能未正确初始化、为空,或被其他线程占用,间接干扰FinalBitmap的Canvas状态(此情况概率较低)。
对应的解决方案
- 调整BeginScene的调用位置:将
BeginScene移到两次CopyFromBitmap之后,确保DrawBitmap执行时Canvas处于有效场景状态:
FinalBitmap->CopyFromBitmap(Cam1Bitmap, Cam1Rect, 0,0); FinalBitmap->CopyFromBitmap(Cam2Bitmap, B2Rect, Cam1Bitmap->Width,0); FinalBitmap->Canvas->BeginScene(); try { switch(Mode) { case NORMAL: FinalBitmap->Canvas->DrawBitmap(Temp2OBitmap, B2ORect, B1ORect, 1.0, false); break; case CALIBRATE: FinalBitmap->Canvas->DrawBitmap(Temp2OBitmap, B2ORect, B1ORect, 0.5, false); break; } } catch(...) { } FinalBitmap->Canvas->EndScene();
- 预先固定FinalBitmap的尺寸:在执行复制操作前,手动设置FinalBitmap的尺寸,避免自动调整导致场景失效:
// 提前设置FinalBitmap的尺寸,确保能容纳两次复制的内容 FinalBitmap->SetSize(Cam1Bitmap->Width + Cam2Bitmap->Width, Max(Cam1Bitmap->Height, Cam2Bitmap->Height)); FinalBitmap->Canvas->BeginScene(); FinalBitmap->CopyFromBitmap(Cam1Bitmap, Cam1Rect, 0,0); FinalBitmap->CopyFromBitmap(Cam2Bitmap, B2Rect, Cam1Bitmap->Width,0); // 后续DrawBitmap代码保持不变
- 校验Temp2OBitmap的有效性:在CALIBRATE模式分支中,先检查Temp2OBitmap是否有效,避免因源位图异常触发错误:
case CALIBRATE: if (Temp2OBitmap && Temp2OBitmap->Width > 0 && Temp2OBitmap->Height > 0) { FinalBitmap->Canvas->DrawBitmap(Temp2OBitmap, B2ORect, B1ORect, 0.5, false); } break;
内容的提问来源于stack exchange,提问作者Drewski7280
相关产品推荐
相关产品推荐

