You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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状态(此情况概率较低)。

对应的解决方案

  1. 调整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();
  1. 预先固定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代码保持不变
  1. 校验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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:07:46