保存OpenTK屏幕的位图,但QuickFont文本没有出现?

时间:2011-12-22 15:46:10

标签: c# opengl opentk

我的窗口里有一个带纹理的盒子。在此框的顶部,使用QuickFont打印文本。由于添加了大量文本而不是一次全部添加,因此刷新此屏幕会花费时间。为了节省时间和资源,我想用文本屏幕显示框,并将其用作纹理,速度要快得多,因为在第一次渲染后无需解析。

我可以将glControl设置为屏幕上限,并将其保存到位图,但屏幕上没有文字。 (F.Y.I这应该是药房标签打印输出的WYSIWYG渲染)

有没有办法让文字保存?

            if (GraphicsContext.CurrentContext == null)
            throw new GraphicsContextException();

        Bitmap bmp = new Bitmap(frm1.ClientSize.Width, frm1.ClientSize.Height);
        System.Drawing.Imaging.BitmapData data =
            bmp.LockBits(frm1.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly,
            System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        GL.ReadPixels(0, 0, frm1.ClientSize.Width,frm1.ClientSize.Height,
            OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);
        bmp.UnlockBits(data);

        bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
        bmp.Save("Move.bmp", ImageFormat.Bmp);
        bmp.Dispose();

enter image description here

1 个答案:

答案 0 :(得分:0)

我偶然发现了答案。通过单击抓取屏幕盖两次的按钮,第二个按钮显示正确的信息,包括文本。

即使调用截图发生在文本被“假设”呈现并且缓冲区已经被交换之后,它仍然是在触发OnClick事件时从屏幕上的内容中抓取屏幕截图。

我将研究的解决方案是制作一个布尔(已完成)并在文本渲染段的末尾将其设置为true并具有

while (Finished = true){ Do bitmap stuff here }

或者有一个计数器变量,它为每行解析的文本计数,当它达到最大值时(I.E.所有内容都已渲染),它调用抓取截图方法。)